OpenCV HSV странно преобразован

Я работаю над проектом по обнаружению гематомы на коже. У меня проблема с цветом после преобразования из RGB в HSV. Мой алгоритм определяет гематому по ее цвету.

С некоторыми изображениями у меня есть хорошие результаты, как здесь:

Исходное изображение: http://imgur.com/WHiOWdj Результат изображения: http://imgur.com/PujbnHa

Но с некоторыми изображениями у меня плохой результат:

Исходное изображение: http://imgur.com/OshB99r Изображение результата: http://imgur.com/CuNzAId

То же исходное изображение после преобразования в HSV: http://imgur.com/lkVwtCs

У вас есть идеи, как это исправить?

Спасибо


person User    schedule 05.02.2015    source источник
comment
Вы действительно думаете, что кто-то собирается вам помочь, не показывая никаких src?   -  person James Moore    schedule 05.02.2015
comment
да, мне не нужен точный код. Мне нужны просто идеи или направления, куда идти.   -  person User    schedule 05.02.2015


Ответы (1)


Глядя на ваше изображение результата, я думаю, что вы используете только канал H исходного изображения в своем алгоритме. Ложное положительное обнаружение может наследоваться от того, что некоторая часть здоровой кожи имеет такое же значение H, что и гематома. Вы можете видеть на изображении канала H в масштабе qrey, что обе части имеют одинаковые значения:

H-канал исходного изображенияРазница между двумя частями заключается в значении насыщенности. На следующем изображении вы можете видеть S-канал исходного изображения, и на нем прекрасно видно, что на гематоме насыщенность намного выше, чем на другой части руки:

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

Итак, я предлагаю вам использовать в вашем алгоритме как H-, так и S-канал, т. е. вы должны учитывать только те части H-изображения, где S-изображение содержит высокие значения насыщенности. Возможное и простое решение для этого состоит в том, что вы выполняете бинаризацию изображений H и S, а с помощью операции AND вы можете выполнить эту фильтрацию:

Изображение H после бинаризации: введите здесь описание изображенияИзображение S после бинаризации: введите здесь описание изображенияИзображение после операции H&S: введите описание изображения здесь Вы можете видеть, что на результирующем изображении только часть гематомы белая (за исключением некоторого шума, но вы можете легко его устранить, например по размеру или по морфологической фильтрации).

РЕДАКТИРОВАТЬ

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

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

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

Например, гистограмма канала H исходного изображения выглядит следующим образом: HistrogramПервый максимум принадлежит фону , второй на кожу и последний на гематом. Можно предположить, что эти 3 порога присутствуют на каждом изображении, только их положение меняется в зависимости от освещения или других условий. Чтобы установить порог между 2-м и 3-м локальным максимумом, можно выделить гематому.

Наконец, я предлагаю вам прочитать следующую статью о пороговых значениях в OpenCV: OpenCV — пороговое значение

person Tibor Takács    schedule 06.02.2015
comment
Вау, большое спасибо за ваш ответ. Это именно то, что я искал. Ты замечательный. Как вы сказали, я разделил изображение на H S V и работал только с H. ищу цвет в диапазоне 150-185. Как вы думаете, как я могу смешать эти два метода? Использовать цвет, а также побитовое_и(planes[0], planes[1], final_img);? Также я должен использовать Adaptive Thresholding для бинаризации img? - person User; 07.02.2015
comment
Я провел несколько тестов и обнаружил, что мой простой порог бинаризации (planes[0], img, 108, 255,THRESH_BINARY); с заданными значениями не так хороши с другими изображениями. Есть ли какой-то интеллектуальный порог, который может автоматически вычислять его из входного изображения? - person User; 07.02.2015
comment
Я рад, что это работает. Я отредактировал свой ответ и написал там некоторую информацию о пороговом значении. - person Tibor Takács; 08.02.2015
comment
отлично, спасибо. Я прочитаю их. Также вы думаете, что я могу связаться с вами по скайпу или фейсбуку, если будет какая-то часть, которую я не пойму? - person User; 08.02.2015
comment
Я надеюсь, что ваше решение работает сейчас. Если у вас есть дополнительные вопросы, задайте их здесь, в Stackoverflow, так как по моему опыту вы получите быстрые и точные ответы. - person Tibor Takács; 13.02.2015