Каковы правильные значения использования / параметров для HoughCircles в OpenCV для обнаружения радужки?

Я читал об этом предмете, но не могу получить представление на "простом английском" об использовании и параметрах для HoughCircles (особенно после CV_HOUGH_GRADIENT).

Что такое порог аккумулятора? Являются ли 100 "голосов" правильным значением?

я смог найти и" замаскировать " зрачок, и проложил себе путь через , но я борюсь за это и моя проблема-это

2 ответов


HoughCircles может быть довольно сложно, я предлагаю посмотреть через этой теме. Где куча людей, включая меня ;), обсуждают, как его использовать. Ключевой параметр param2, так называемый accumulator threshold. В принципе, чем выше он, тем меньше кругов вы получаете. И эти круги имеют более высокую вероятность быть правильным. Лучшее значение отличается для каждого изображения. Я думаю, что лучший подход-использовать поиск параметров на param2. То есть. продолжайте пробовать значения, пока ваши критерии met (например: есть 2 круга или макс. количество кругов, которые не перекрываются, и т. д.). У меня есть код, который выполняет двоичный поиск на "param2", поэтому он быстро соответствует критериям.

другой критический фактор pre-processing, попытка уменьшить шум, и упрощает изображение. Некоторая комбинация размытия / порога / canny хороша для этого.

во всяком случае, я получаю это:

enter image description here

из вашего uploded изображения, используя это код:

import cv
import numpy as np

def draw_circles(storage, output):
    circles = np.asarray(storage)
    for circle in circles:
        Radius, x, y = int(circle[0][3]), int(circle[0][0]), int(circle[0][4])
        cv.Circle(output, (x, y), 1, cv.CV_RGB(0, 255, 0), -1, 8, 0)
        cv.Circle(output, (x, y), Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0)    

orig = cv.LoadImage('eyez.png')
processed = cv.LoadImage('eyez.png',cv.CV_LOAD_IMAGE_GRAYSCALE)
storage = cv.CreateMat(orig.width, 1, cv.CV_32FC3)
#use canny, as HoughCircles seems to prefer ring like circles to filled ones.
cv.Canny(processed, processed, 5, 70, 3)
#smooth to reduce noise a bit more
cv.Smooth(processed, processed, cv.CV_GAUSSIAN, 7, 7)

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 32.0, 30, 550)
draw_circles(storage, orig)

cv.ShowImage("original with circles", orig)
cv.WaitKey(0)

обновление

Я понимаю, что я несколько скучаю-прочитайте ваш вопрос! Вы действительно хотите найти Айрис края. Они не так четко определены, как школьники. Поэтому мы должны помочь HoughCircles как можно больше. Мы можем сделать это:

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

и тогда нам нужно сделать поиск param на param2 снова. Замена строки "HoughCircles" в приведенном выше коде следующим:

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 100.0, 30, 150,100,140)

нас это:

enter image description here

что не так уж плохо.


мое альтернативное предложение - использовать пороговый и Blob-анализ. Он более прост в обнаружении радужки, чем с помощью canny edge и hough transform.

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

после этого отделите радужку и ресницы путем класть в длину значения анализа шарика минимальную на XX и минимальную ширину на YY. Значение XX и YY - это значение длины радужки и ширина.