难以使用 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。
我有一个项目,我必须在许多树叶图片中检测 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。