Как да внедрим Hough Circle в Java

искам да намеря кръгъл обект (ирис на окото, използвах Haar Cascase с алгоритъм на viola Jones). така че открих, че кръгът на Hough би бил правилният начин да го направя. може ли някой да ми обясни как да внедря Hough кръг в Java или друга лесна реализация за намиране на ирис с Java.

Благодаря,


person Keshan    schedule 29.01.2012    source източник


Отговори (3)


Ако искате да намерите ирис, трябва да сте ясни за това. Частта от ириса, която търсите, всъщност се нарича лимб. Също така имайте предвид, че контрастът на лимба е много по-нисък от този на зеницата, така че ако разделителната способност на изображението позволява зеницата е по-добра цел. Java не е добър вариант като език за програмиране тук, тъй като 1. Той е бавен, докато обработката е интензивна; 2. Тъй като класическият кръг на Hough изисква 3D акумулатор и Java вероятно означава използване на мобилен телефон, изискванията за памет ще бъдат трудни.

Това, което можете да направите, е да използвате факта, че вероятно има един (или само няколко) лимбове в изображението. Първото нещо, което трябва да направите, е да намалите размерността на проблема от 3 на 2, като използвате ориентирани ръбове: извлечете хоризонтални и вертикални ръбове, които заедно представляват ориентация на ръба (те могат да се разглеждат като хоризонтални и вертикални компоненти на вектора на ръба). Простата идея е, че доминантното пресичане на ръбовите вектори е центърът на вашия лимб. За да намерите пресечната точка, ви трябват само два ориентирани ръба вместо три точки, които определят кръг. Следователно намаляването на размерността от 3 на 2.

Също така не е необходимо да използвате класическа трансформация на кръг на Хаф с огромен акумулатор и множество изчисления, за да намерите това пресичане. Рандомизираният Hough ще бъде много по-бърз. Ето как работи (~ към RANSAC): избирате минимален брой ориентирани ръбове на случаен принцип (във вашия случай 2), намирате пресечната точка, след това намирате всички ръбове, които се пресичат приблизително на едно и също място. Това са инлиери. Вие просто повтаряте 10-30 пъти, като избирате различна произволна извадка от 2 ръба, за да се установите в набор с максимален брой inliers. Да се ​​надяваме, че тези вътрешни елементи лежат на лимба. Медианата на пресечните точки на вътрешните лъчи ще ви даде центъра на окръжността, а средното разстояние до вътрешните линии от центъра е радиусът.

На снимката по-долу ярките цветове съответстват на инлиерите и ориентацията е показана с малък линеен сегмент. Наборът от оригинални ръбове е показан в средата (само хоризонтално). Докато оригиналните ръбове лежат по протежение на елипса, ръбовете на Hough бяха трансформирани чрез афинна трансформация, за да направят тези, принадлежащи на лимба, да лежат в кръг. Също така имайте предвид, че ориентациите на ръбовете са доста шумни.

въведете описание на изображението тук

person Vlad    schedule 21.02.2015

Duda and Hart (1971) има доста ясно обяснение на трансформацията на Hough и работещ пример. Не е трудно да се създаде внедряване директно от тази хартия, така че е добро място да започнете.

person snim2    schedule 29.01.2012

ImageJ предоставя добавка за Hough Circle. Няколко пъти съм си играл с него в миналото. Можете да погледнете изходния код, ако искате или трябва да го промените.

person Locked    schedule 17.10.2012