2015-03-23 2 views
0

На самом деле, я пытаюсь вычесть фон из этого image. Видимо, я просто хочу, чтобы вычесть зеленый фон и вот код, я использую:Отделив изображение от использования openCV

Mat img_object = imread(patternImageName); 
Mat imageInHSV; 
cvtColor(img_object, imageInHSV, CV_BGR2HSV); 

Mat chan[3],imgThreshed, processed; 
split(imageInHSV, chan); 
Mat H = chan[0]; 
// compute statistics for Hue value 
cv::Scalar mean, stddev; 
cv::meanStdDev(H, mean, stddev); 

// ensure we get 95% of all valid Hue samples (statistics 3*sigma rule) 
float minHue = 80; 
float maxHue = 95; 
cout << "MinValue :" << mean[0] << " MaxHue:" << stddev[0] << endl; 
cout << H << endl; 
// STEP 2: detection phase 
cv::inRange(H, cv::Scalar(minHue), cv::Scalar(maxHue), imgThreshed); 
imshow("thresholded", imgThreshed); 

Я проверил значение канала H, чтобы решить minHue и maxHue поэтому я выбрал интервал наиболее часто значения в матрице, которые определенно будут зелеными. Но, я получил это result, который является навязчиво не тем, что я ищу, потому что в нем отсутствует материал. Есть идеи, как улучшить его? как лучше вычесть фон из этого вида изображений?

+0

Где в коде вы использовали «среднего» и «STDDEV» другое что их печатать? –

+0

Я использовал их, но у меня был плохой результат, поэтому я попытался увидеть значения и выбрать интервал самых частых значений. – Maystro

+0

Кажется, что в изображении вашего результата вы показываете (в белом) пиксели, что их оттенок находится между 80 и 95. Правильно ли это? Если да, что еще вы хотите увидеть в изображении результата? весь фон в белом, а все остальные объекты в черном? –

ответ

0

Я точно не знаю, в чем ваша цель. Тем не менее, я получил намного лучший результат на вашем образце изображения из двух других каналов (насыщенность и легкость, а не оттенок), используя диапазон [mean-stddev,mean+stddev]. Усреднение результаты всех трех каналов показывает некоторое улучшение:

using namespace std ; 
using namespace cv ; 

int main() 
{ 
    Mat img_object = imread("1.png"); 
    Mat imageInHSV; 
    cvtColor(img_object, imageInHSV, CV_BGR2HSV); 
    Mat chan[3]; 
    split(imageInHSV, chan); 
    Mat result ; 
    Mat threshImg[3] ; 

    for(int i=0 ; i<3 ; i++) 
    { 
     Mat H = chan[i]; 

     // compute statistics for each channel 
     cv::Scalar mean, stddev; 
     cv::meanStdDev(H, mean, stddev); 

     // statistically 68% of data should be in this range 
     float minVal = mean[0]-stddev[0]; 
     float maxVal = mean[0]+stddev[0]; 
     cout << "MinValue :" << mean[0] << " MaxHue:" << stddev[0] << endl; 

     // Separating the dominant 68% which we guess should be the background. 
     cv::inRange(H, cv::Scalar(minVal), cv::Scalar(maxVal), threshImg[i]); 
    } 

    // averaging the results from three different channels (Hue, Saturation, lightness). 
    result = (threshImg[0]+threshImg[1]+threshImg[2])/3 ; 
    imwrite("thresholded_012.jpg", result) ; 
} 

Входное изображение: enter image description here

Вывод изображения: enter image description here

+0

То, что мне нужно, это отделить зеленый фон от инструментов. Как вы можете видеть в своем результате, это не очень точно, поэтому я ищу сильный алгоритм, который обнаруживает только instrumetns – Maystro

Смежные вопросы