Извините за длину вопросаОпределить различные цвета изображения с помощью 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, чтобы найти ближайший стандартный цвет. Но большую часть времени ответ - желтый, оранжевый, красный или пурпурный, независимо от того, что представляет собой фактический цвет. Может кто-нибудь сказать мне, что происходит не так, спасибо заранее.
Выемки пожалуйста !!!!! ! –
@Arun A.S - Я знаю, что это немного отрывочно, но больше не может отступать. Надеюсь, что вы поймете, какой основной алгоритм реализован. – user3786150
Можете ли вы предоставить образцы изображений? –