HoughCircles可以有点棘手,我建议看看
this thread.一堆人,包括我在内)讨论如何使用它.关键参数是param2,即所谓的累加器阈值.基本上,越少圈越多.这些圈子有更高的正确概率.每个图像的最佳值是不同的.我认为最好的方法是在param2上使用参数搜索. IE浏览器.继续尝试值,直到您的条件得到满足(例如:有2个圈子或最多不重叠的圈子数等).我有一些代码对’param2’进行二进制搜索,所以它很快符合标准.
另一个关键因素是预处理,尝试降低噪音,并简化图像.模糊/阈值/坎尼的一些组合对此很有好处.
无论如何,我得到这个:
从您的lolo图像,使用此代码:
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.我们可以这样做:
>指定虹膜的尺寸范围(我们可以从瞳孔尺寸中找出合理的范围).
>增加圆中心之间的最小距离(我们知道两个虹膜不能重叠,所以我们可以安全地将其设置为我们最小的虹膜尺寸)
然后我们需要再次对param2进行param搜索.用以下代码替换上述代码中的“HoughCircles”行:
cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 100.0, 30, 150,100,140)
得到我们这个:
哪个不是太糟糕