OpenCv: избавиться от влияния яркости на цветовую гистограмму

Я использую OpenCv. Для сравнения мне нужно получить данные о цветовой гистограмме изображения.

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

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

Любые советы очень ценятся,


person User09    schedule 21.01.2012    source источник


Ответы (1)


Преобразуйте свое изображение из цветового пространства RGB в цветовое пространство HSV, используя cvtColor() с CV_BGR2HSV или CV_RGB2HSV вариант. H, S и V обозначают оттенок, насыщенность и интенсивность соответственно. Используйте цветовые гистограммы в этом пространстве HSV и используйте только пару ячеек для V-канала.

person nimcap    schedule 21.01.2012
comment
Спасибо. Я не уверен, что понял ваш смысл. Вы имеете в виду, что значения H и S не зависят от яркости? Я пробовал значение H, и кажется, что оно становится совершенно другим при разных условиях яркости. Буду признателен, если вы добавите объяснение - person User09; 22.01.2012
comment
Канал V несет большую часть информации о яркости; Каналы H и V затронуты, но не так сильно, как V. Я хочу напомнить вам, что вы не сможете создать метод, который будет работать на 100%, по крайней мере, в ближайшем будущем. Люди исследуют и придумывают новые идеи для решения подобных проблем. - person nimcap; 22.01.2012
comment
Большое спасибо. Какой из H, S вы бы посоветовали мне придать наибольшее значение? Как вы думаете, может ли cvEqualizeHist() мне помочь? Что вы имеете в виду под использованием только нескольких бинов для канала V, как я могу это сделать? Извините за множество вопросов - person User09; 22.01.2012
comment
Прежде всего, я предлагаю вам использовать C++ API OpenCV, когда перед функцией стоит префикс cv, избегайте его использования, он принадлежит C API, что усложняет ситуацию. equalizeHist() может помочь, единственный способ узнать это — провести несколько экспериментов с перекрестной проверкой. - person nimcap; 22.01.2012