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 стойност, отколкото хематома. Можете да видите на qrey-мащабното изображение на H канал, че и двете части имат подобни стойности:

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

въведете описание на изображението тукТова беше очаквано, тъй като хематомът има много по-силен цвят от здравата кожа.

Затова ви предлагам да използвате както H, така и S канал във вашия алгоритъм, което означава, че трябва да вземете предвид само тези части от H изображението, където S изображението съдържа високи стойности на насищане. Възможно и просто решение да направите това е, че бинаризирате както H, така и S изображения и с операция AND можете да изпълните това филтриране:

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

РЕДАКТИРАНЕ

Важно е да се отбележи, че бинаризацията е една от най-важните (а понякога и много сложни) стъпки в алгоритмите за откриване на обекти, а именно бинаризацията е първият акцент на обектите за откриване.

Ако външните условия (осветление, цвят на обектите и т.н.) не се променят значително от изображение на изображение, можете да използвате фиксирани прагове за бинаразиране. Ако тази постоянна среда не може да бъде осигурена, трябва да използвате по-сложни методи. Има много възможности, които можете да използвате, тук можете да прочетете някои примери:

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

Например хистограмата на H канала на оригиналното изображение е следната: ХистрограмаПървият максимум принадлежи на фона , втората към кожата и последната към хематома. Може да се предположи, че тези 3 прага могат да бъдат намерени във всяко изображение, само че техните позиции варират в зависимост от осветлението или от други условия. За да поставите праг между 2-рия и 3-тия локален максимум, може да е добър избор да подчертаете хематома.

Накрая ви предлагам да прочетете следната статия за прагове в OpenCV: OpenCV - Прагове

person Tibor Takács    schedule 06.02.2015
comment
Уау, благодаря ви много за отговора. Точно това търсех. Ти си страхотен. Както казахте, разделих изображението на H S V и работих само с H. if(t ›= 150 && t‹= 185){tblack.at‹uchar›(i,j) = (uchar)255;} така бях търся цвят в диапазона 150-185. Мислите ли как мога да смеся тези два метода? Използвайте цвят и също bitwise_and(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