2015-02-18 2 views
0

Извините за длину вопросаОпределить различные цвета изображения с помощью OpenCV C++

int main(int argc, char* argv[]){ 

Mat image = imread(argv[1]); 
Mat blank(image.size(), CV_8U, Scalar(0xFF)); 
Mat dest; 
imshow("originalimage", image); 

Mat markers(image.size(), CV_8U, Scalar(-1)); 
markers(Rect (0, 0, image.cols, 5)) = Scalar::all(1); 
markers(Rect (0, image.rows-5, image.cols, 5)) = Scalar::all(1); 
markers(Rect (0, 0, 5, image.rows)) = Scalar::all(1); 
markers(Rect (image.cols-5, 0, 5, image.rows)) = Scalar::all(1); 
int centreW = image.cols/4; 
int centreH = image.rows/4; 
markers(Rect((image.cols/2)-(centreW/2),(image.rows/2)-(centreH/2), centreW, centreH)) = Scalar::all(2); 
markers.convertTo(markers,CV_BGR2GRAY); 
imshow("markers", markers); 

//Wateshed Segmentation 
WatershedSegmenter segmenter; 
segmenter.setMarkers(markers); 
Mat wshedMask = segmenter.process(image); 
Mat mask; 
convertScaleAbs(wshedMask, mask, 1, 0); 
double thresh = threshold(mask, mask, 1, 255, THRESH_BINARY); 
bitwise_and(image, image, dest, mask); 
dest.convertTo(dest,CV_8U); 
imshow("marker subtracted rgb dest",dest); 

Mat lab; 
cvtColor(dest,lab,CV_BGR2Lab); 
pre(); 
imshow("cie lab image",lab); 
for(int i = 0;i < lab.rows;i++){ 
    for(int j = 0;j < lab.cols;j++){ 
     double l = lab.at<Vec3b>(i,j)[0]; 
     double a = lab.at<Vec3b>(i,j)[1]; 
     double b = lab.at<Vec3b>(i,j)[2]; 

     if(!(l == 0 && a == 128 && b == 128)){//background color 
      double dE1 = numeric_limits<double>::max(); 
      string result = ""; 
      node arg;arg.l = l;arg.a = a;arg.b = b; 
      for(int k = 0;k < COLORS;k++){ 
       double localE1 = CIE94(c_hash[k].value,arg); 
       if(localE1 < dE1){ 
        dE1 = localE1; 
        result = c_hash[k].name; 
       } 
      } 
      cnt[result]++; 
     }  
    } 
} 
unordered_map<string,int>::iterator it; 
int local_min = 0; 
string result = "NO Color! Something is fishy"; 
for(it = cnt.begin();it != cnt.end();it++){ 
    if(it->second > 0)cout<<it->first<<endl; 
    if(it->second > local_min){ 
     local_min = it->second; 
     result = it->first; 
    } 
} 
cout<<"maximum : "<<result<<endl; 
waitKey(0); 
return 0; 
} 

Я первый идентифицирующий мой объект переднего плана в изображении, а затем преобразование Dest изображения в CIE Lab цветовое пространство. После этого я использовал функцию deltaE CIE94, чтобы найти ближайший стандартный цвет. Но большую часть времени ответ - желтый, оранжевый, красный или пурпурный, независимо от того, что представляет собой фактический цвет. Может кто-нибудь сказать мне, что происходит не так, спасибо заранее.

+0

Выемки пожалуйста !!!!! ! –

+0

@Arun A.S - Я знаю, что это немного отрывочно, но больше не может отступать. Надеюсь, что вы поймете, какой основной алгоритм реализован. – user3786150

+0

Можете ли вы предоставить образцы изображений? –

ответ

0

BGR изображение состоит из трех каналов (синий, зеленый, красный), но вы, кажется, думают, что они являются одиночными изображения канала (имеющие тип CV_8U), например:

Mat markers(image.size(), CV_8U, Scalar(-1)); 
... 
markers.convertTo(markers,CV_BGR2GRAY); 
... 
dest.convertTo(dest,CV_8U); 
.... 
cvtColor(dest,lab,CV_BGR2Lab) 
Смежные вопросы