Как реализовать Hough Circle на Java - PullRequest
3 голосов
/ 29 января 2012

Я хочу найти круглый объект (Радужная оболочка глаза, я использовал Хаар Каскасс с алгоритмом Альта-Джонса).поэтому я обнаружил, что крутой круг будет правильным способом сделать это.Может кто-нибудь объяснить мне, как реализовать круг Хоф в Java или любой другой простой реализации, чтобы найти радужную оболочку с Java.

Спасибо,

Ответы [ 3 ]

5 голосов
/ 29 января 2012

Дуда и Харт (1971) имеют довольно четкое объяснение преобразования Хафа и рабочий пример. Нетрудно создать реализацию непосредственно из этой статьи, так что это хорошее место для начала.

2 голосов
/ 17 октября 2012

ImageJ предоставляет плагин Hough Circle . Я играл с этим несколько раз в прошлом. Вы можете взглянуть на исходный код, если хотите или хотите изменить его.

1 голос
/ 21 февраля 2015

Если вы хотите найти радужную оболочку, вы должны быть прямо об этом.Часть радужной оболочки, которую вы ищете, на самом деле называется лимбом.Также обратите внимание, что контраст лимба намного ниже, чем у зрачка, поэтому, если позволяет разрешение изображения, зрачок является лучшей целью.Java не является хорошим вариантом в качестве языка программирования здесь, поскольку 1. Он медленный, а обработка интенсивная;2. Поскольку для классического круга Hough требуется 3D-аккумулятор, а Java, вероятно, означает использование мобильного телефона, требования к памяти будут жесткими.

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

Вам также не нужно использовать классическое преобразование окружности Хафа с огромным аккумулятором и многочисленные вычисления, чтобы найти это пересечение.Рандомизированная Hough будет намного быстрее.Вот как это работает (~ для RANSAC): вы выбираете минимальное количество ориентированных ребер случайным образом (в вашем случае 2), находите пересечение, а затем находите все ребра, которые пересекаются примерно в одном и том же месте.Это вкладыши.Вы просто повторяете 10-30 раз, выбирая другую случайную выборку из 2 ребер, чтобы получить набор с максимальным числом вкладышей.Надеюсь, эти вкладыши лежат на лимбе.Медиана пересечений внутренних лучей даст вам центр круга, а медианное расстояние до внутренностей от центра - это радиус.

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

enter image description here

...