Как лучше всего определить белый цвет?

Я пытаюсь обнаружить белые объекты в видео. Первым шагом является фильтрация изображения так, чтобы на нем оставались только пиксели белого цвета. Моим первым подходом было использование цветового пространства 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 для каждого пикселя.

Другие вопросы по тегам