Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение границ радужки 
:(
    Опции темы
Pavia
Дата 8.9.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



deniska
Можешь небольшую базу выложить?
PM MAIL   Вверх
deniska
Дата 9.9.2011, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Pavia
пожалуйста.

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

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  ______.rar 911,57 Kb
PM MAIL ICQ   Вверх
Pavia
Дата 9.9.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



deniska

Цитата(deniska @  10.8.2011,  08:07 Найти цитируемый пост)
Что испробовано: из библиотеки OpenCV алгоритм Кэнни (Canny) выделения краев на картинке - cvCanny(). Дает различные результаты на разных снимках (зависит от резкости картинки). Но выделяет максимум внутреннюю границу. Внешнюю - никогда. Задавать входные параметры для  cvCanny() исходя из какогото предварительного анализа изображения (например каким то образом определять уровень резкости) не знаю как. Далее даже если этим алгоритмом удастся выделить внутренний край, помимо него будут определны и другие края, ресницы веки, какие то фрагменты самой радужки - все это нужно отфильтровывать, опять не понятно как.

Немного расскажу почему так.  
1)Чтобы не было проблем с разной резкостью надо про анализировать картинку и сделать её коррекцию или коррекцию параметра алгоритма.
Думаю это можно решить пред обработкой путём выравниванием контрастности. Пред обработка это один из первичных пунктов распознавания образов. А вообще порог должен зависеть от магнитуды градиента, неужели и это не сделано в OpenCV.
2) По поводу внешней границы. В OpenCV, в алгоритме cvCanny не реализовано размытие по произвольному радиусу. Оно ограниченно 3 и 5 аппретурой.
Это легко устранить сделав предварительное размытие.  Рис. 1 и 2
3) Резкость проанализировать не сложно. Размываешь картинку потом вычитаешь из исходной и считаешь какую нибудь метрику типа сумма всех пикселей по модулю и делишь на размеры изображения.
А вообще любой алгоритм распознавания требует обучения.  Берешь часть базы. Варьируешь  (изменяешь) параметры смотришь процент удачно распознанных. Тем самым выбираешь лучший результат. Есть и другие методы обучения, основанные на НС или МОВ. 
4) Мусор можно отфильтровать применив преобразование Хафа для окружностей.

Рис 1.
user posted image
Рис 2.
user posted image

PM MAIL   Вверх
deniska
Дата 13.9.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Pavia,  а что скажете о способе, который я уже начал реализовывать? см. выше про радиальные производные. "костяк" его как бы уже сформирован, постоянно гоняю по базе (более 150 снимков), постоянно чего-то не нравится, дорабатываю напильником, только вот "напильник" (читай терпение) уже стирается)). про зрачок какбы уже можно забыть, он довольно сносно определяется и собственно основная проблема сейчас с внешним краем радужки, но этого и следовало ожидать. в моем варианте я беру радиальные производные интенсивности из центра зрачка. но брать все 360 градусов нельзя: 
1.радужка не вмещается целиком в изображение
2.веки
3.ресницы

так вот пункты 2 и 3 для каждого снимка естественно свои, и диапазон достаточный для одного снимка может оказаться избыточным (с захватом шумов из п2,3) для другого. ну допустим для 80% случаев подходит некий диапазон, а вот с остальными...
если захватываются ресницы, да еще эта зараза так растет что прям недалеко от реального края радужки - получаем какое-то смещение, довольно часто значительное. то есть похорошему надо бы сначала както выбирать допустимый диапазон для радиальных производных.

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

конечно можно ответить просто: не можешь - не берись, слаб в математике - не лезь... но работа есть работа.

так что жду советов, критики

с уважением ко всем читающим
PM MAIL ICQ   Вверх
Pavia
Дата 13.9.2011, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



deniska
Я бы также делал. Просто алгоритм Хафа требователен к ресурсам, поэтому либо радиальные. Либо алгоритм сегментации как-то попробовать.

Сегодня мысль пришла  95% распознанных 5% не распознанных. Если все изображения разбить на классы и к каждому классу применить свои свой алгоритм распознавания. То для достижения 95% распознавания в худшем случае потребуется реализовать 19 классов алгоритмов. 

А вот чтобы такого не происходила алгоритм должен быть гибким. Должны быть параметры при которых в одном классе это работает отлично и в другом работает отлично но с другими значениями параметра . А параметры распознавания должны выбираться классификатором после анализа изображения. В качестве классификатора может выступать НС.
PM MAIL   Вверх
mrgloom
Дата 14.9.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



думаю что надо определять как то внешнюю радужку (покажите что у вас получается)
а потом ее апроксимировать до элипса или круга.

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

для НС скорее всего надо несколько тысяч образцов.



Это сообщение отредактировал(а) mrgloom - 14.9.2011, 10:00
PM MAIL   Вверх
deniska
Дата 14.9.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



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

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  1.JPG 35,43 Kb
PM MAIL ICQ   Вверх
mrgloom
Дата 14.9.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



ну вот вроде бы все работает или это не автомате?
PM MAIL   Вверх
deniska
Дата 14.9.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



это автомат, и в этом случае работает довольно сносно. ниже приведен случай отвратной работы. красная окружность с красным крестом - вручную найденый край. видно насколько расходятся и края и центры автомата и ручного режима (красный и желтый). желтая точка в центре - центр эллипса по автомату.

собственно сейчас прихожу к тому, что изза плохой освещенности края радужки, всегда будут ложные производные(см. последнюю фотографию, правй сектор, нижняя его часть). аппроксимация к эллипсу вредит ИМХО, тк слишком много у него степеней свободы. вот окружность бы постороить, но в opencv такой функции нет. вот сейчас гуглю по поиску окружности методом наименьших квадратов.

Это сообщение отредактировал(а) deniska - 14.9.2011, 13:29

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  1.JPG 34,02 Kb
PM MAIL ICQ   Вверх
deniska
Дата 15.9.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



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

    double _x, _y, Suu, Suv, Svv, Suuu, Svvv, Suvv, Svuu;
    _x = _y = Suu = Suv = Svv = Suuu = Svvv = Suvv = Svuu = 0;
    
              /*
              //если вдруг захочется проверить правильность реализации, то вот числа из примера:
    CirclePoints.resize( 7 );
    
    CirclePoints[0].x = 0.0;
    CirclePoints[0].y = 0.0;
    CirclePoints[1].x = 0.5;
    CirclePoints[1].y = 0.25;
    CirclePoints[2].x = 1.0;
    CirclePoints[2].y = 1.0;
    CirclePoints[3].x = 1.5;
    CirclePoints[3].y = 2.25;
    CirclePoints[4].x = 2.0;
    CirclePoints[4].y = 4.0;
    CirclePoints[5].x = 2.5;
    CirclePoints[5].y = 6.25;
    CirclePoints[6].x = 3.0;
    CirclePoints[6].y = 9.0;
    */
    for( int i = 0; i < CirclePoints.size(); i++ )
    {
        _x += CirclePoints[i].x;
        _y += CirclePoints[i].y;
    }
    _x = _x/CirclePoints.size();
    _y = _y/CirclePoints.size();

    std::vector<double> u_arr;
    std::vector<double> v_arr;

    for( int i = 0; i < CirclePoints.size(); i++ )
    {
        u_arr.push_back( CirclePoints[i].x - _x );
        v_arr.push_back( CirclePoints[i].y - _y );
    }
    double currU, currV;
    for( int i = 0; i < CirclePoints.size(); i++ )
    {
        currU = u_arr[i];
        currV = v_arr[i];
        Suu += currU*currU;
        Suv += currU*currV;
        Svv += currV*currV;
        Suuu += currU*currU*currU;
        Svvv += currV*currV*currV;
        Suvv += currU*currV*currV;
        Svuu += currV*currU*currU;
    }

    double Vc = ((Svvv + Svuu)/(2*Svv) - (Suv/Svv)*( (Suuu + Suvv)/(2*Suu) ))/(1 - (Suv/Svv)*(Suv/Suu));
    double Uc = ( Suuu + Suvv )/(2*Suu) - (Suv/Suu)*Vc;

    destCircle.Width = destCircle.Height = 2*sqrt( Uc*Uc + Vc*Vc + ( Suu + Svv )/CirclePoints.size() );
    destCircle.Ctr_X = Uc + _x;
    destCircle.Ctr_Y = Vc + _y;
    destCircle.Angle = 0;


Это сообщение отредактировал(а) deniska - 15.9.2011, 10:50
PM MAIL ICQ   Вверх
mrgloom
Дата 19.9.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



PM MAIL   Вверх
deniska
Дата 19.9.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



 smile что это?  smile 
PM MAIL ICQ   Вверх
Pavia
Дата 19.9.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



deniska, Это ода из разновидностей кластеризации. Основанная на объединение соседних пикселей - так же известный как алгоритм бактерий фагоцита. 
Картинка достаточно однородная так что возможно сделана простая заливка с допуском.
Или с допуском по градиенту.

У картинке надпись - активные контура. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0826 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.