![]() |
|
![]() ![]() ![]() |
|
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
Добрый день.
Есть задача - определить границы радужки на снимке. То есть границу зрачка с радужкой и радужки с белой частью глаза (назову ее так для простоты), далее внутренняя и внешняя границы радужки. В аттаче картинка. Что испробовано: из библиотеки OpenCV алгоритм Кэнни (Canny) выделения краев на картинке - cvCanny(). Дает различные результаты на разных снимках (зависит от резкости картинки). Но выделяет максимум внутреннюю границу. Внешнюю - никогда. Задавать входные параметры для cvCanny() исходя из какогото предварительного анализа изображения (например каким то образом определять уровень резкости) не знаю как. Далее даже если этим алгоритмом удастся выделить внутренний край, помимо него будут определны и другие края, ресницы веки, какие то фрагменты самой радужки - все это нужно отфильтровывать, опять не понятно как. Еще пытался использовать радиальные производные из центра изображения. можно считать что точка центра изображения всегда попадает в зрачок, и что максимальная производная будет на внутренней границе радужки... но тоже есть вопросы: нужно предварительно грамотно убрать блики для того чтобы на них не было ложных макс. производных. Сейчас уже в каком-то тупике нахожусь, нужны какието свежие мысли, идеи. Только пожалуйста не кидайтесь сильными математическими терминами )) Присоединённый файл ( Кол-во скачиваний: 45 ) ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
А что это за яркие точки в зрачке; это уже какая-то обработка?
Я бы попробовала так: - размытие, чтобы убрать мелкие детали (ресницы и небольшие блики) - сегментация на 3-4 уровня яркости (снимок ведь серый?) - детектор краев; можно попробовать и попроще чем Canny - любой дифференциальный фильтр Возможно, между размытием и сегментацией нужно выполнить усиление резкости (UnsharpMask). -------------------- ... |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
блики от ИК подсветки |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Т.е. на снимке они всегда есть?
Тогда, если они всегда в зрачке, то можно их попробовать использовать для поиска. Но в любом случае для начала их можно найти и убрать. Найти только их не должно составить проблемы - они очень яркие. После обнаружения их нужно, видимо, закрасить фоновым цветом. Но вообще задача нетривиальная и требует исследований. Наверняка такие исследования уже проводились, нужно только поискать. Статей в открытом доступе полно, попытай гугл или начни с вики. -------------------- ... |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
это первое о чем я подумал когда увидел снимки. но как оказалось позже их расположение зависит от настройки прибора и полагаться на них нельзя. их может быть разное количество и расположение.
перелопатил довольно много... и даже пробовал бесплатные программы, обещающие распознавание радужки... штуки 3-4 - все в ауте. Это сообщение отредактировал(а) deniska - 10.8.2011, 10:35 |
|||
|
||||
VictorTsaregorodtsev |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 28.7.2006 Репутация: 3 Всего: 8 |
deniska,
Кластерный анализ (яркостей или цветов точек) либо, если хочется чего-то покруче для анализа не просто яркостей, а текстур на изображении - двумерная HMM (скрытая марковская модель). Плюс набор эмпирик для выяснения, что же брать в качестве найденного кластера - простейшие эмпирики, например, будут на основе расчета и сравнения центров масс и дисперсий координат пикселов кластеров (кластер-радужка должна иметь центр, близкий к центру зрачка, но дисперсия кластера-радужки должна быть больше дисперсии кластера-зрачка, центры масс левого и правого кластеров для белка глаза должны быть, соответственно, слева и справа от радужки, кластера для век - сверху и снизу, соответственно). |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
кхе, кхе....
а можно объяснить както немного менее "эмпирично" выражаясь Вашими терминами. Если честно, вообще ничего не понял из поста. Что означает в Вашем понимании кластерный анализ? нуда, знаем мы что сверху и снизу МОГУТ быть веки, справа и слева белок... в общем ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Полагаю, то, что я обозвала "сегментацией" - разделение точек изображения по яркости на несколько классов. Тоже мне "даже" ![]() Не могу поверить, что в сети нет статей на соответствующие темы... только лучше английские источники искать... -------------------- ... |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
ну что есть, то есть... статьи, естественно не все))), читал, но все в них очень абстрактно описывается, и в большинстве своем из того что читал, используют фильтры для выделения краев в том числе и Кэнни. другие дифы попробую тоже. Проблема в том, что прибор, с которого бирутся снимки, могут настраивать, менять подсветку и т.д. и т.п.. есть у меня некоторая база снимков в разных условиях. и вот вроде подберешь параметры для тогоже Кэнни для нескольких снимков, начинаешь проверять по другим - фигня. Для начала мне бы зрачок выкинуть(по крайней мере это должно оказаться легче, чем определить внешнюю границу радужки), думаю это позволит разбить оставшуюся картинку на более точные "кластеры" ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
если предположить, что центр радужки там же, где и центр зрачка, то можно построить гистограмму "яркость в зависимости от удалённости", думаю, на ней работать будет проще... Это сообщение отредактировал(а) maxim1000 - 11.8.2011, 10:39 -------------------- qqq |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
почти совпадают, ну то есть рядом))) будут. тоже попробую |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
google -> iris detection
|
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
Думаете я отстал от вас? не дождетесь))
Определение внутренней границы радужки ( выделение зрачка ) на данном этапе, с точностью ПОКА достаточной сделал. В общих словах так: из центра изображения строю производные по интенсивности радиальных линий(360 штук). Беру абсолютные максимумы производных - это является основой для контура зрачка. Дальше эти точки анализируются, выкидываются ложные, если производная в нужной окрестности не найдена (например ресницы мешают), то точка достраивается геометрически аппроксимацией зрачка до окружности. теперь перехожу к самому сложному - внешней границе радужки, тн "лимб" или лимбус... |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
![]() можно попробовать local threshold (Bernsen) и можно попробовать еще active countours http://imagejdocu.tudor.lu/doku.php?id=plu...e_contour:start |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
mrgloom,
спс, буду "шупать" |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
deniska,
Можешь небольшую базу выложить? |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
Pavia,
пожалуйста. определение внешней границы радужки сделал по схожему алгоритму с внутренней (по производным интенсивности). но там свои проблемы: у кого-то почти вся граница открыта, у кого-то веки узкие, у кого-то ресницы длинные... в общем все это вносит ошибки. конечно будет возможность ручного наведения, но всеже хотелось бы чтоб их процент был очень низкий (5%). Присоединённый файл ( Кол-во скачиваний: 12 ) ![]() |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
deniska,
Немного расскажу почему так. 1)Чтобы не было проблем с разной резкостью надо про анализировать картинку и сделать её коррекцию или коррекцию параметра алгоритма. Думаю это можно решить пред обработкой путём выравниванием контрастности. Пред обработка это один из первичных пунктов распознавания образов. А вообще порог должен зависеть от магнитуды градиента, неужели и это не сделано в OpenCV. 2) По поводу внешней границы. В OpenCV, в алгоритме cvCanny не реализовано размытие по произвольному радиусу. Оно ограниченно 3 и 5 аппретурой. Это легко устранить сделав предварительное размытие. Рис. 1 и 2 3) Резкость проанализировать не сложно. Размываешь картинку потом вычитаешь из исходной и считаешь какую нибудь метрику типа сумма всех пикселей по модулю и делишь на размеры изображения. А вообще любой алгоритм распознавания требует обучения. Берешь часть базы. Варьируешь (изменяешь) параметры смотришь процент удачно распознанных. Тем самым выбираешь лучший результат. Есть и другие методы обучения, основанные на НС или МОВ. 4) Мусор можно отфильтровать применив преобразование Хафа для окружностей. Рис 1. ![]() Рис 2. ![]() |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
Pavia, а что скажете о способе, который я уже начал реализовывать? см. выше про радиальные производные. "костяк" его как бы уже сформирован, постоянно гоняю по базе (более 150 снимков), постоянно чего-то не нравится, дорабатываю напильником, только вот "напильник" (читай терпение) уже стирается)). про зрачок какбы уже можно забыть, он довольно сносно определяется и собственно основная проблема сейчас с внешним краем радужки, но этого и следовало ожидать. в моем варианте я беру радиальные производные интенсивности из центра зрачка. но брать все 360 градусов нельзя:
1.радужка не вмещается целиком в изображение 2.веки 3.ресницы так вот пункты 2 и 3 для каждого снимка естественно свои, и диапазон достаточный для одного снимка может оказаться избыточным (с захватом шумов из п2,3) для другого. ну допустим для 80% случаев подходит некий диапазон, а вот с остальными... если захватываются ресницы, да еще эта зараза так растет что прям недалеко от реального края радужки - получаем какое-то смещение, довольно часто значительное. то есть похорошему надо бы сначала както выбирать допустимый диапазон для радиальных производных. а по поводу различных алгоритмов выделения контуров (границ) я тоже много думал, прежде чем пойти по пути какого-либо из принципиальных способов. так вот избыточность этих контуров будет довольно частой, "отфильтровывать" нужное тоже совсем нетривиальная задача, ведь то, что явно видно и очевидно человеческому глазу, нужно еще объяснить компу)). например ваш рис 2: видите как "коварно" верхнее веко сливается с радужкой... или круги от подсветки - их запросто можно принять за границы зрачка, ну и таких, непреодолимых (для меня) "но", можно найти сколько угодно. конечно можно ответить просто: не можешь - не берись, слаб в математике - не лезь... но работа есть работа. так что жду советов, критики с уважением ко всем читающим |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
deniska,
Я бы также делал. Просто алгоритм Хафа требователен к ресурсам, поэтому либо радиальные. Либо алгоритм сегментации как-то попробовать. Сегодня мысль пришла 95% распознанных 5% не распознанных. Если все изображения разбить на классы и к каждому классу применить свои свой алгоритм распознавания. То для достижения 95% распознавания в худшем случае потребуется реализовать 19 классов алгоритмов. А вот чтобы такого не происходила алгоритм должен быть гибким. Должны быть параметры при которых в одном классе это работает отлично и в другом работает отлично но с другими значениями параметра . А параметры распознавания должны выбираться классификатором после анализа изображения. В качестве классификатора может выступать НС. |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
думаю что надо определять как то внешнюю радужку (покажите что у вас получается)
а потом ее апроксимировать до элипса или круга. ![]() т.е. как выделено на картинке области которые примерно определяются(можете так же сделать бросанием луча градиента из центра темного зрачка который хорошо определяется), а остальные можно достроить. т.е. вы найдете скажем несколько дуг(контуров), и определите у них радиус , а потом из подходящих сапроксимируете элипс. для НС скорее всего надо несколько тысяч образцов. Это сообщение отредактировал(а) mrgloom - 14.9.2011, 10:00 |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
вот что на выходе моего алгоритма с радиальными.
синим пунктиром эллипс зрачка. центр секторов - центр эллипса зрачка. области секторов(части кольца)-области где ищем производные. красные точки - максимальные производные, по которым строится эллипс радужки (желтый) с пом. cvFitEllipse(). Присоединённый файл ( Кол-во скачиваний: 16 ) ![]() |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну вот вроде бы все работает или это не автомате?
|
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
это автомат, и в этом случае работает довольно сносно. ниже приведен случай отвратной работы. красная окружность с красным крестом - вручную найденый край. видно насколько расходятся и края и центры автомата и ручного режима (красный и желтый). желтая точка в центре - центр эллипса по автомату.
собственно сейчас прихожу к тому, что изза плохой освещенности края радужки, всегда будут ложные производные(см. последнюю фотографию, правй сектор, нижняя его часть). аппроксимация к эллипсу вредит ИМХО, тк слишком много у него степеней свободы. вот окружность бы постороить, но в opencv такой функции нет. вот сейчас гуглю по поиску окружности методом наименьших квадратов. Это сообщение отредактировал(а) deniska - 14.9.2011, 13:29 Присоединённый файл ( Кол-во скачиваний: 14 ) ![]() |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
докладываю последние новости с фронта: откопал в инете статью по определнию окружности из набора точек по методу наименьших квадратов. математик из меня не очень, но реализовал, и метод работает. в моем случае, хоть край радужки и является вообще говоря эллипсом, лучше при его определнии аппроксимировать до окружности. выходит точнее.
может кому реализация метода пригодится:
Это сообщение отредактировал(а) deniska - 15.9.2011, 10:50 |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
||||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
![]() ![]() |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
deniska, Это ода из разновидностей кластеризации. Основанная на объединение соседних пикселей - так же известный как алгоритм бактерий фагоцита.
Картинка достаточно однородная так что возможно сделана простая заливка с допуском. Или с допуском по градиенту. У картинке надпись - активные контура. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |