Как лучше всего определить белый цвет?
Я пытаюсь обнаружить белые объекты в видео. Первым шагом является фильтрация изображения так, чтобы на нем оставались только пиксели белого цвета. Моим первым подходом было использование цветового пространства HSV, а затем проверка высокого уровня канала VAL. Вот код:
//convert image to hsv
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
for(int x=0;x<srcSize.width;x++){
for(int y=0;y<srcSize.height;y++){
uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x];
uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x];
uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x];
if((*val>170))
*hue=255;
else
*hue=0;
}
}
оставляя результат в канале оттенка. К сожалению, этот подход очень чувствителен к освещению. Я уверен, что есть лучший способ. Какие-либо предложения?
3 ответа
Он будет чувствителен к освещению - что произойдет, если вы посмотрите на него под красным светом!
Я не знаю, намного ли проще использовать пространство YUV, чем искать похожие значения RGB.
редактировать - обычно вы называете что-то без серого цвета (может помочь с поиском).
Если у вас есть выбор, это худший цвет для поиска, потому что он будет отражать любое другое освещение в сцене. Таким образом, вам придется определить общий цвет освещения и отрегулировать его.
Поэтому вам нужны пиксели с одинаковыми значениями RGB или значениями RGB в соотношении среднего для объектов в сцене.
Почему вы используете HSV? Было бы более целесообразно преобразовать в HSL и использовать канал яркости. Конечно, вы получите не только белый, но и каждый цвет с высокой яркостью, превышающей пороговое значение. В конце концов, вы не можете полагаться на чистый белый цвет, если исходное изображение не переэкспонировано.
Другим способом было бы превратить ваше изображение в оттенки серого. У белых будут очень высокие значения (почти>225).
Еще одним способом было бы И плоскости R, G и B. На полученном изображении останутся только белые. Таким образом, вы не тратите время на преобразование в цветовое пространство HSV. Вы просто делаете простую операцию AND для каждого пикселя.