Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Определение границ радужки |
Автор: deniska 10.8.2011, 08:07 |
Добрый день. Есть задача - определить границы радужки на снимке. То есть границу зрачка с радужкой и радужки с белой частью глаза (назову ее так для простоты), далее внутренняя и внешняя границы радужки. В аттаче картинка. Что испробовано: из библиотеки OpenCV алгоритм Кэнни (Canny) выделения краев на картинке - cvCanny(). Дает различные результаты на разных снимках (зависит от резкости картинки). Но выделяет максимум внутреннюю границу. Внешнюю - никогда. Задавать входные параметры для cvCanny() исходя из какогото предварительного анализа изображения (например каким то образом определять уровень резкости) не знаю как. Далее даже если этим алгоритмом удастся выделить внутренний край, помимо него будут определны и другие края, ресницы веки, какие то фрагменты самой радужки - все это нужно отфильтровывать, опять не понятно как. Еще пытался использовать радиальные производные из центра изображения. можно считать что точка центра изображения всегда попадает в зрачок, и что максимальная производная будет на внутренней границе радужки... но тоже есть вопросы: нужно предварительно грамотно убрать блики для того чтобы на них не было ложных макс. производных. Сейчас уже в каком-то тупике нахожусь, нужны какието свежие мысли, идеи. Только пожалуйста не кидайтесь сильными математическими терминами )) |
Автор: Earnest 10.8.2011, 09:55 |
А что это за яркие точки в зрачке; это уже какая-то обработка? Я бы попробовала так: - размытие, чтобы убрать мелкие детали (ресницы и небольшие блики) - сегментация на 3-4 уровня яркости (снимок ведь серый?) - детектор краев; можно попробовать и попроще чем Canny - любой дифференциальный фильтр Возможно, между размытием и сегментацией нужно выполнить усиление резкости (UnsharpMask). |
Автор: deniska 10.8.2011, 10:00 | ||
блики от ИК подсветки |
Автор: Earnest 10.8.2011, 10:24 |
Т.е. на снимке они всегда есть? Тогда, если они всегда в зрачке, то можно их попробовать использовать для поиска. Но в любом случае для начала их можно найти и убрать. Найти только их не должно составить проблемы - они очень яркие. После обнаружения их нужно, видимо, закрасить фоновым цветом. Но вообще задача нетривиальная и требует исследований. Наверняка такие исследования уже проводились, нужно только поискать. Статей в открытом доступе полно, попытай гугл или начни с вики. |
Автор: deniska 10.8.2011, 10:30 | ||
это первое о чем я подумал когда увидел снимки. но как оказалось позже их расположение зависит от настройки прибора и полагаться на них нельзя. их может быть разное количество и расположение.
перелопатил довольно много... и даже пробовал бесплатные программы, обещающие распознавание радужки... штуки 3-4 - все в ауте. |
Автор: VictorTsaregorodtsev 10.8.2011, 15:58 |
deniska, Кластерный анализ (яркостей или цветов точек) либо, если хочется чего-то покруче для анализа не просто яркостей, а текстур на изображении - двумерная HMM (скрытая марковская модель). Плюс набор эмпирик для выяснения, что же брать в качестве найденного кластера - простейшие эмпирики, например, будут на основе расчета и сравнения центров масс и дисперсий координат пикселов кластеров (кластер-радужка должна иметь центр, близкий к центру зрачка, но дисперсия кластера-радужки должна быть больше дисперсии кластера-зрачка, центры масс левого и правого кластеров для белка глаза должны быть, соответственно, слева и справа от радужки, кластера для век - сверху и снизу, соответственно). |
Автор: deniska 10.8.2011, 16:06 |
кхе, кхе.... а можно объяснить както немного менее "эмпирично" выражаясь Вашими терминами. Если честно, вообще ничего не понял из поста. Что означает в Вашем понимании кластерный анализ? нуда, знаем мы что сверху и снизу МОГУТ быть веки, справа и слева белок... в общем ![]() |
Автор: Earnest 10.8.2011, 17:20 |
Полагаю, то, что я обозвала "сегментацией" - разделение точек изображения по яркости на несколько классов. Тоже мне "даже" ![]() Не могу поверить, что в сети нет статей на соответствующие темы... только лучше английские источники искать... |
Автор: deniska 11.8.2011, 08:24 | ||
ну что есть, то есть... статьи, естественно не все))), читал, но все в них очень абстрактно описывается, и в большинстве своем из того что читал, используют фильтры для выделения краев в том числе и Кэнни. другие дифы попробую тоже. Проблема в том, что прибор, с которого бирутся снимки, могут настраивать, менять подсветку и т.д. и т.п.. есть у меня некоторая база снимков в разных условиях. и вот вроде подберешь параметры для тогоже Кэнни для нескольких снимков, начинаешь проверять по другим - фигня. Для начала мне бы зрачок выкинуть(по крайней мере это должно оказаться легче, чем определить внешнюю границу радужки), думаю это позволит разбить оставшуюся картинку на более точные "кластеры" ![]() |
Автор: deniska 11.8.2011, 10:46 | ||
почти совпадают, ну то есть рядом))) будут. тоже попробую |
Автор: mrgloom 11.8.2011, 12:56 |
google -> iris detection |
Автор: deniska 18.8.2011, 11:32 |
Думаете я отстал от вас? не дождетесь)) Определение внутренней границы радужки ( выделение зрачка ) на данном этапе, с точностью ПОКА достаточной сделал. В общих словах так: из центра изображения строю производные по интенсивности радиальных линий(360 штук). Беру абсолютные максимумы производных - это является основой для контура зрачка. Дальше эти точки анализируются, выкидываются ложные, если производная в нужной окрестности не найдена (например ресницы мешают), то точка достраивается геометрически аппроксимацией зрачка до окружности. теперь перехожу к самому сложному - внешней границе радужки, тн "лимб" или лимбус... |
Автор: mrgloom 19.8.2011, 10:08 |
http://rghost.ru/18492511.view можно попробовать local threshold (Bernsen) и можно попробовать еще active countours http://imagejdocu.tudor.lu/doku.php?id=plugin:segmentation:active_contour:start |
Автор: deniska 19.8.2011, 12:46 |
mrgloom, спс, буду "шупать" |
Автор: Pavia 8.9.2011, 18:51 |
deniska, Можешь небольшую базу выложить? |
Автор: deniska 9.9.2011, 08:03 |
Pavia, пожалуйста. определение внешней границы радужки сделал по схожему алгоритму с внутренней (по производным интенсивности). но там свои проблемы: у кого-то почти вся граница открыта, у кого-то веки узкие, у кого-то ресницы длинные... в общем все это вносит ошибки. конечно будет возможность ручного наведения, но всеже хотелось бы чтоб их процент был очень низкий (5%). |
Автор: Pavia 9.9.2011, 20:11 | ||
deniska,
Немного расскажу почему так. 1)Чтобы не было проблем с разной резкостью надо про анализировать картинку и сделать её коррекцию или коррекцию параметра алгоритма. Думаю это можно решить пред обработкой путём выравниванием контрастности. Пред обработка это один из первичных пунктов распознавания образов. А вообще порог должен зависеть от магнитуды градиента, неужели и это не сделано в OpenCV. 2) По поводу внешней границы. В OpenCV, в алгоритме cvCanny не реализовано размытие по произвольному радиусу. Оно ограниченно 3 и 5 аппретурой. Это легко устранить сделав предварительное размытие. Рис. 1 и 2 3) Резкость проанализировать не сложно. Размываешь картинку потом вычитаешь из исходной и считаешь какую нибудь метрику типа сумма всех пикселей по модулю и делишь на размеры изображения. А вообще любой алгоритм распознавания требует обучения. Берешь часть базы. Варьируешь (изменяешь) параметры смотришь процент удачно распознанных. Тем самым выбираешь лучший результат. Есть и другие методы обучения, основанные на НС или МОВ. 4) Мусор можно отфильтровать применив преобразование Хафа для окружностей. Рис 1. http://postimage.org/image/239l2jcpw/ Рис 2. http://postimage.org/image/1ahvoes78/ |
Автор: deniska 13.9.2011, 09:30 |
Pavia, а что скажете о способе, который я уже начал реализовывать? см. выше про радиальные производные. "костяк" его как бы уже сформирован, постоянно гоняю по базе (более 150 снимков), постоянно чего-то не нравится, дорабатываю напильником, только вот "напильник" (читай терпение) уже стирается)). про зрачок какбы уже можно забыть, он довольно сносно определяется и собственно основная проблема сейчас с внешним краем радужки, но этого и следовало ожидать. в моем варианте я беру радиальные производные интенсивности из центра зрачка. но брать все 360 градусов нельзя: 1.радужка не вмещается целиком в изображение 2.веки 3.ресницы так вот пункты 2 и 3 для каждого снимка естественно свои, и диапазон достаточный для одного снимка может оказаться избыточным (с захватом шумов из п2,3) для другого. ну допустим для 80% случаев подходит некий диапазон, а вот с остальными... если захватываются ресницы, да еще эта зараза так растет что прям недалеко от реального края радужки - получаем какое-то смещение, довольно часто значительное. то есть похорошему надо бы сначала както выбирать допустимый диапазон для радиальных производных. а по поводу различных алгоритмов выделения контуров (границ) я тоже много думал, прежде чем пойти по пути какого-либо из принципиальных способов. так вот избыточность этих контуров будет довольно частой, "отфильтровывать" нужное тоже совсем нетривиальная задача, ведь то, что явно видно и очевидно человеческому глазу, нужно еще объяснить компу)). например ваш рис 2: видите как "коварно" верхнее веко сливается с радужкой... или круги от подсветки - их запросто можно принять за границы зрачка, ну и таких, непреодолимых (для меня) "но", можно найти сколько угодно. конечно можно ответить просто: не можешь - не берись, слаб в математике - не лезь... но работа есть работа. так что жду советов, критики с уважением ко всем читающим |
Автор: Pavia 13.9.2011, 18:17 |
deniska, Я бы также делал. Просто алгоритм Хафа требователен к ресурсам, поэтому либо радиальные. Либо алгоритм сегментации как-то попробовать. Сегодня мысль пришла 95% распознанных 5% не распознанных. Если все изображения разбить на классы и к каждому классу применить свои свой алгоритм распознавания. То для достижения 95% распознавания в худшем случае потребуется реализовать 19 классов алгоритмов. А вот чтобы такого не происходила алгоритм должен быть гибким. Должны быть параметры при которых в одном классе это работает отлично и в другом работает отлично но с другими значениями параметра . А параметры распознавания должны выбираться классификатором после анализа изображения. В качестве классификатора может выступать НС. |
Автор: mrgloom 14.9.2011, 09:54 |
думаю что надо определять как то внешнюю радужку (покажите что у вас получается) а потом ее апроксимировать до элипса или круга. http://rghost.ru/21550141.view т.е. как выделено на картинке области которые примерно определяются(можете так же сделать бросанием луча градиента из центра темного зрачка который хорошо определяется), а остальные можно достроить. т.е. вы найдете скажем несколько дуг(контуров), и определите у них радиус , а потом из подходящих сапроксимируете элипс. для НС скорее всего надо несколько тысяч образцов. |
Автор: deniska 14.9.2011, 10:02 |
вот что на выходе моего алгоритма с радиальными. синим пунктиром эллипс зрачка. центр секторов - центр эллипса зрачка. области секторов(части кольца)-области где ищем производные. красные точки - максимальные производные, по которым строится эллипс радужки (желтый) с пом. cvFitEllipse(). |
Автор: mrgloom 14.9.2011, 13:20 |
ну вот вроде бы все работает или это не автомате? |
Автор: deniska 14.9.2011, 13:26 |
это автомат, и в этом случае работает довольно сносно. ниже приведен случай отвратной работы. красная окружность с красным крестом - вручную найденый край. видно насколько расходятся и края и центры автомата и ручного режима (красный и желтый). желтая точка в центре - центр эллипса по автомату. собственно сейчас прихожу к тому, что изза плохой освещенности края радужки, всегда будут ложные производные(см. последнюю фотографию, правй сектор, нижняя его часть). аппроксимация к эллипсу вредит ИМХО, тк слишком много у него степеней свободы. вот окружность бы постороить, но в opencv такой функции нет. вот сейчас гуглю по поиску окружности методом наименьших квадратов. |
Автор: deniska 15.9.2011, 10:47 | ||
докладываю последние новости с фронта: откопал в инете http://www.dtcenter.org/met/users/docs/write_ups/circle_fit.pdf по определнию окружности из набора точек по методу наименьших квадратов. математик из меня не очень, но реализовал, и метод работает. в моем случае, хоть край радужки и является вообще говоря эллипсом, лучше при его определнии аппроксимировать до окружности. выходит точнее. может кому реализация метода пригодится:
|
Автор: mrgloom 19.9.2011, 13:47 |
http://www.cs.bris.ac.uk/Research/Vision/homeimages/snbrain.gif |
Автор: deniska 19.9.2011, 14:36 |
![]() ![]() |
Автор: Pavia 19.9.2011, 17:54 |
deniska, Это ода из разновидностей кластеризации. Основанная на объединение соседних пикселей - так же известный как алгоритм бактерий фагоцита. Картинка достаточно однородная так что возможно сделана простая заливка с допуском. Или с допуском по градиенту. У картинке надпись - активные контура. |