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

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

Какой порог аккумулятора? Правильно ли оцениваются 100 голосов?

Я мог найти и "замаскировать" ученика и проделать свой путь через функцию Canny, но я боюсь за это, и моя проблема - это функция HoughCircles. Кажется, не удается найти круг Ирис, и я не знаю, почему.

This is what I have so far. LEFT: masked pupil RIGHT: canny result

И это функция, над которой я работаю:

def getRadius(area):
    r = 1.0
    r = math.sqrt(area/3.14)
    return (r)

def getIris(frame):
    grayImg = cv.CreateImage(cv.GetSize(frame), 8, 1)
    cv.CvtColor(frame,grayImg,cv.CV_BGR2GRAY)
    cv.Smooth(grayImg,grayImg,cv.CV_GAUSSIAN,9,9)
    cv.Canny(grayImg, grayImg, 32, 2)
    storage = cv.CreateMat(grayImg.width, 1, cv.CV_32FC3)
    minRad = int(getRadius(pupilArea))
    circles = cv.HoughCircles(grayImg, storage, cv.CV_HOUGH_GRADIENT, 2, 10,32,200,minRad, minRad*2)
    cv.ShowImage("output", grayImg)
    while circles:
        cv.DrawContours(frame, circles, (0,0,0), (0,0,0), 2)
        # this message is never shown, therefore I'm not detecting circles
        print "circle!"
        circles = circles.h_next()
    return (frame)

Ответ 1

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

Другим важным фактором является предварительная обработка, попытка уменьшить шум и упростить изображение. Некоторая комбинация размытия/порога/canny хороша для этого.

Во всяком случае, я получаю следующее:

enter image description here

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

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)

Обновление

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

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

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

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

Получает это:

enter image description here

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

Ответ 2

Мое альтернативное предложение - использовать Threshold и Blob-анализ. Это проще обнаружить ирисы, чем использовать canny edge и hough transform.

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

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