Ответ 1
HoughCircles
может показаться сложным, я предлагаю просмотреть эту тему. Где куча людей, включая меня;), обсудите, как их использовать. Ключевым параметром является param2
, так называемый accumulator threshold
. В принципе, чем выше, тем меньше кругов вы получаете. И эти круги имеют более высокую вероятность быть правильными. Наилучшее значение для каждого изображения отличается. Я считаю, что лучший подход - использовать поиск параметров на param2
. То есть. продолжайте проверять значения до тех пор, пока не будут выполнены ваши критерии (например: есть 2 круга или максимальное количество кругов, которые не перекрываются, и т.д.). У меня есть код, который выполняет двоичный поиск в параметре "param2", поэтому он быстро соответствует критериям.
Другим важным фактором является предварительная обработка, попытка уменьшить шум и упростить изображение. Некоторая комбинация размытия/порога/canny хороша для этого.
Во всяком случае, я получаю следующее:
Из вашего увеличенного изображения, используя этот код:
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)
Получает это:
Что не так уж плохо.