难以使用 openCV 检测某些颜色

Having difficulties to detect certain colors using openCV

我有一个项目,我必须在许多树叶图片中检测 3 种特定颜色:绿色、黄色和棕色。

我以下图为例:

检测不同颜色的 objective 是为了确定树是否生病,因此能够正确分辨什么是绿色、黄色和棕色非常重要,即使是少量的像素.

我写了下面的代码:

//Load the image
Mat img_bgr = imread("c:\testeimagem\theeye\greening32.jpg", 1);
if (img_bgr.empty()){
    cout << "Nenhuma imagem foi carregada..." << endl;
    return -1;
}

//Display the image
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", img_bgr);
waitKey(0);
destroyAllWindows;

//Conversion to HSV
Mat img_hsv;
cvtColor(img_bgr, img_hsv, CV_BGR2HSV_FULL);

//Extracting colors - HSV
Mat cores_divididas, green, yellow, brown;

//Yellow
inRange(img_hsv, Scalar(28, 240, 240), Scalar(33, 255, 255), yellow);
imwrite("c:\testeimagem\theeye\yellow.jpg", yellow);

//Green
inRange(img_hsv, Scalar(38, 100, 100), Scalar(70, 190, 190), green);
imwrite("c:\testeimagem\theeye\green.jpg", green);

//Brown
inRange(img_hsv, Scalar(10, 90, 90), Scalar(20, 175, 175), brown);
imwrite("c:\testeimagem\theeye\brown.jpg", brown);

namedWindow("Yellow", WINDOW_NORMAL);
imshow("Yellow", yellow);

namedWindow("Green", WINDOW_NORMAL);
imshow("Green", green);

namedWindow("Brown", WINDOW_NORMAL);
imshow("Brown", brown);

waitKey(0);
destroyAllWindows;

return 0;

如果你们编译这段代码,您会注意到绿色没有被正确检测到,其他颜色根本没有被检测到。

作为参考值的指南,I used this trackbar

当您转换原始图像的颜色 space 时,请尝试使用 CV_BGR2HSV 而不是 CV_BGR2HSV_FULL。您引用的 link 提供了基于 CV_BGR2HSV 的参考值,其中 hue 具有不同的值范围,因此这可能至少是导致您问题的一个因素。

试试这些范围:

//Yellow
inRange(img_hsv, Scalar(28, 0, 0), Scalar(33, 255, 255), yellow);
imwrite("yellow.jpg", yellow);

//Green
inRange(img_hsv, Scalar(38, 0, 0), Scalar(70, 255, 255), green);
imwrite("green.jpg", green);

//Brown
inRange(img_hsv, Scalar(10, 0, 0), Scalar(20, 255, 255), brown);
imwrite("brown.jpg", brown);

在你的叶子图像上,似乎根本没有棕色色素。我用这片叶子测试了一下,Brownish leaf , 看起来不错。

我尝试这些范围的原因是真实的颜色信息(如果我错了请纠正我)嵌入到色调数量中。

观察:如前所述,使用 CV_BGR2HSV。