Возникают трудности с определением определенных цветов с помощью openCV

У меня есть проект, в котором я должен обнаружить 3 конкретных цвета на фотографиях многих листьев: зеленый, желтый и коричневый.

Я использую следующее изображение в качестве примера:

введите описание изображения здесь

Целью обнаружения различных цветов является определение того, является ли дерево больным или нет, поэтому очень важно уметь правильно сказать, что такое зеленый, желтый и коричневый, даже в небольшом количестве пикселей.

Я написал следующий код:

//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;

Если вы, ребята, скомпилируете этот код, вы заметите, что зеленый цвет не определяется должным образом, а другие цвета вообще не обнаруживаются.

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

1

Решение

Попробуйте эти диапазоны:

//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);

На изображении вашего листа, кажется, нет коричневого пигмента вообще. Я проверил это с этим листом, Коричневатый лист
, и выглядит нормально.

Причина, по которой я попробовал эти диапазоны, заключается в том, что информация об истинном цвете (поправьте меня, если я ошибаюсь) встроена в количество оттенков.

Obs .: Перейти с CV_BGR2HSV, как уже упоминалось.

0

Другие решения

Когда вы преобразуете цветовое пространство исходного изображения, попробуйте использовать CV_BGR2HSV вместо CV_BGR2HSV_FULL. Ссылка, на которую вы ссылались, предоставляет эталонные значения, основанные на CV_BGR2HSV, в котором оттенок имеет другой диапазон значений, так что это, вероятно, как минимум один фактор, вызывающий ваши проблемы.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector