我正在研究一种虹膜识别算法,该算法将这些图像处理成唯一的代码,用于识别和认证目的。
在过滤、智能阈值化、然后在图像中找到边缘之后,下一步显然是为瞳孔和虹膜拟合圆圈。我环顾四周使用的技术是圆形霍夫变换。这是我的实现代码。对神秘的变量名称感到抱歉。
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 循环仅对黑色像素起作用。