Каковы правильные значения использования / параметров для HoughCircles в OpenCV для обнаружения радужки?
Я читал об этом предмете, но не могу получить представление на "простом английском" об использовании и параметрах для HoughCircles
(особенно после CV_HOUGH_GRADIENT
).
Что такое порог аккумулятора? Являются ли 100 "голосов" правильным значением?
я смог найти и" замаскировать " зрачок, и проложил себе путь через , но я борюсь за это и моя проблема-это
2 ответов
HoughCircles
может быть довольно сложно, я предлагаю посмотреть через этой теме. Где куча людей, включая меня ;), обсуждают, как его использовать. Ключевой параметр param2
, так называемый accumulator threshold
. В принципе, чем выше он, тем меньше кругов вы получаете. И эти круги имеют более высокую вероятность быть правильным. Лучшее значение отличается для каждого изображения. Я думаю, что лучший подход-использовать поиск параметров на param2
. То есть. продолжайте пробовать значения, пока ваши критерии met (например: есть 2 круга или макс. количество кругов, которые не перекрываются, и т. д.). У меня есть код, который выполняет двоичный поиск на "param2", поэтому он быстро соответствует критериям.
другой критический фактор pre-processing, попытка уменьшить шум, и упрощает изображение. Некоторая комбинация размытия / порога / canny хороша для этого.
во всяком случае, я получаю это:
из вашего 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
как можно больше. Мы можем сделать это:
- указание диапазона размеров для радужки (мы можем разработать правдоподобный диапазон от размера зрачка).
- увеличение минимального расстояния между центрами окружностей (мы знаем, что две ирисы никогда не могут перекрываться, поэтому мы можем безопасно установить этот минимальный размер радужки)
и тогда нам нужно сделать поиск param на param2
снова. Замена строки "HoughCircles" в приведенном выше коде следующим:
cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 100.0, 30, 150,100,140)
нас это:
что не так уж плохо.
мое альтернативное предложение - использовать пороговый и Blob-анализ. Он более прост в обнаружении радужки, чем с помощью canny edge и hough transform.
мой путь... Сначала вы его переступаете. Подберите любое пороговое значение, пока черно-белое изображение не произведет только (черный цвет) радужки и ресниц.
после этого отделите радужку и ресницы путем класть в длину значения анализа шарика минимальную на XX и минимальную ширину на YY. Значение XX и YY - это значение длины радужки и ширина.