我正在研究一种虹膜识别算法,该算法可将these类型的图像处理为唯一的代码,以进行识别和身份验证。
过滤后,智能地进行阈值处理,然后在图像中找到边缘,下一步显然是使圆适合瞳孔和虹膜。我环顾了使用的技术是圆形Hough变换。这是我的实现代码。抱歉,隐秘的变量名。
print "Populating Accumulator..."
# Loop over image rows
for x in range(w):
# Loop over image columns
for y in range(h):
# Only process black pixels
if inp[x,y] == 0:
# px,py = 0 means pupil, otherwise pupil center
if px == 0:
ra = r_min
rb = r_max
else:
rr = sqrt((px-x)*(px-x)+(py-y)*(py-y))
ra = int(rr-3)
rb = int(rr+3)
# a is the width of the image, b is the height
for _a in range(a):
for _b in range(b):
for _r in range(rb-ra):
s1 = x - (_a + a_min)
s2 = y - (_b + b_min)
r1 = _r + ra
if (s1 * s1 + s2 * s2 == r1 * r1):
new = acc[_a][_b][_r]
if new >= maxVotes:
maxVotes = new
print "Done"
# Average all circles with the most votes
for _a in range(a):
for _b in range(b):
for _r in range(r):
if acc[_a][_b][_r] >= maxVotes-1:
total_a += _a + a_min
total_b += _b + b_min
total_r += _r + r_min
amount += 1
top_a = total_a / amount
top_b = total_b / amount
top_r = total_r / amount
print top_a,top_b,top_r
这是用python编写的,并使用Python Imaging Library进行图像处理。如您所见,这是一种非常幼稚的蛮力查找圈子的方法。可以,但是要花几分钟。基本思想是在存在黑色像素的任何地方(从阈值和边缘检测)绘制从rmin到rmax的圆圈,构建一个累加器阵列,该阵列具有“投票”图像上某个位置的次数。 x,y和r中得票最多的那个是感兴趣的圈子。我试图利用虹膜和瞳孔具有大约相同的中心(变量ra和rb)来降低r循环的某些复杂度这一事实,但是瞳孔检测花费的时间太长,因此无关紧要。
现在,显然我的实现非常幼稚。它使用三维参数空间(x,y和r),不幸的是使其运行速度慢于可接受的范围。我可以进行哪些改进?有什么办法可以减少到二维参数空间吗?有没有更有效的方式来访问和设置我不知道的像素?
附带说明一下,还有其他我不知道的改善此算法整体运行时间的技术吗?例如近似于瞳孔或虹膜最大半径的方法?
注意:我也尝试为此使用OpenCV,但是我无法对参数进行足够的调整以保持一致的准确性。
让我知道您是否需要其他信息。
注意:我再次误解了自己的代码。从技术上讲,它是5维的,但是3维的x,y,r循环仅适用于黑色像素。
最佳答案
假设您想要的是圆的位置,而不是R的度量。
如果您对R的可能范围有一个不错的估计,那么一种常见的技术是对固定R的第一个猜测运行该算法,对其进行调整,然后重试。