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

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

оставляя результат в канале оттенка. К сожалению, этот подход очень чувствителен к освещению. Я уверен, что есть лучший способ. Любые предложения?

Ответ 1

Это будет чувствительно к освещению - что произойдет, если вы просмотрите его под красным светом!
Я не знаю, можно ли использовать пространство YUV намного проще, чем искать аналогичные значения RGB.

edit - обычно вы вызываете что-то без цвета серого (может помочь вам в поиске).
Если у вас есть выбор, это самый худший цвет для поиска, потому что он будет отражать любое другое освещение в сцене. Таким образом, вам придется определять общий цвет освещения и настраивать его.

Итак, вы ищете пиксели с значениями RGB simlar или значения RGB в соотношении среднего значения для объектов в сцене.

Ответ 2

Почему вы используете HSV? Было бы более целесообразно преобразовать в HSL и использовать канал яркости. Конечно, вы не получите только белый цвет, но каждый цвет с высокой яркостью над порогом. В конце концов, вы не можете полагаться на чистый белый цвет, если ваше исходное изображение не было переэкспонировано.

Ответ 3

Другой способ - превратить ваше изображение в оттенки серого. У белых будут очень высокие значения (почти > 225).

Еще один способ - это И-плоскости R, G и B. В итоговом изображении останется только белый цвет. Таким образом, вы не тратите время на вычисление преобразования в цветовое пространство HSV. Вы просто выполняете простую операцию И на каждом пикселе.