无法识别人眼图像中的虹膜区域

Unable to identify the iris region in human eye images

使用OpenCV识别虹膜区域+瞳孔区域(外部灰色区域+内部黑色圆圈)如this image

尝试了以下方法,但无法100%提取虹膜区域。

方法一 使用图像中像素的颜色代码检测虹膜区域检测

import cv2
from PIL import Image
#import cv2.cv as cv

img = cv2.imread('i1.jpg')
im = Image.open('i1.jpg')
pix = im.load()
#cv2.imshow('detected Edge',img)

height, width = img.shape[:2]

print height,width
height=height-1
width=width-1
count=0
print pix[width,height]
print pix[0,0]
for eh in range(height):
    for ew in range(width):
        r,g,b=pix[ew,eh]
        if r<=30 and g<=30 and b<=30:
            print eh,ew
            cv2.circle(img,(ew,eh),1,(0,255,0),1)
print height,width
cv2.imshow('detected Edge',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Click here to view output 上面的代码。

方法二 使用 Hough Circles 方法检测虹膜区域

import cv2
#import cv2.cv as cv
img1 = cv2.imread('i.jpg')
img = cv2.imread('i.jpg',0)
ret, thresh = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY)

edges = cv2.Canny(thresh, 100, 200)
#cv2.imshow('detected ',edges)


cimg=cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 10000, param1 = 50, param2 = 30, minRadius = 0, maxRadius = 0)
#circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
#                            param1=50,param2=30,minRadius=0,maxRadius=0)
print circles
for i in circles[0,:]:
    i[2]=i[2]+4
    cv2.circle(img1,(i[0],i[1]),i[2],(0,255,0),1)

#Code to close Window
cv2.imshow('detected Edge',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
for i in range (1,5):
    cv2.waitKey(1)

Click here to view the output 代码.

请指导我们如何自动提取人眼图片中的圆形黑色区域。

为避免错误结果并提高性能,您应该始终为 HoughCircles 使用适当的边界。虹膜和瞳孔半径会在一定范围内。

我会在图像中寻找一个大小合理的黑色斑点来定位瞳孔。一旦知道瞳孔在哪里,您就知道在哪里寻找虹膜。提取一个包含虹膜的感兴趣区域(使用瞳孔大小来估计虹膜大小)但仅此而已。然后做两次霍夫变换得到虹膜和瞳孔的位置和半径。 之后,如有必要,您可以使用霍夫变换中的知识拟合 circle/ellipse 来进一步提高准确性。

我使用了以下参考资料。 http://www.cvip.uofl.edu/wwwcvip/education/ECE523/Iris%20Biometrics.pdf

要识别人眼图像中的虹膜区域,可以使用以下步骤:-

1) 瞳孔区域的识别:- 由于瞳孔区域强度会非常接近于零,所以可以使用二进制阈值来找到瞳孔 region.You 可以使用连接组件标记以获得相同强度的区域,然后 select 偏心率接近零的区域被识别为瞳孔 circle.The 该连接区域的质心将是圆的中心,您可以通过以下尺寸获得半径连接组件盒。

2) 虹膜区域的识别:- 有了瞳孔区域,可以用霍夫圆法得到虹膜region.Use canny边缘检测到获取边缘 map.Take 围绕瞳孔中心的盒子中虹膜圆的中心,虹膜的半径大于瞳孔半径且小于固定的 amount.Make 多个具有不同中心和不同半径的圆,如上所述和计算位于这样 circles.The 圆上的边缘图点数,最大边缘点数将是虹膜圆。

注意:- 根据我的经验,我发现获得虹膜圆的成本非常高,因为您必须制作多个中心不同的圆,radius.One 解决方案是将圆心固定为瞳孔中心,并且只有变化的半径,因为虹膜圆会非常靠近瞳孔中心。然而,它给出了错误的结果,因为顶部和底部的睫毛边缘贴图给出了错误的边缘贴图点。为了解决这个问题,我做了一个 jugaad。我将虹膜中心固定为瞳孔中心,并仅从瞳孔中心找到图像左手部分的虹膜半径。同样,我从瞳孔中心找到了图像右侧的虹膜半径。我使用半径和中心的平均值作为瞳孔中心来获得虹膜边界。它对我有用。

使用方法 2,你能不能从瞳孔中心开始,然后在同一行向外移动(从瞳孔中心向左或向右移动),直到你碰到眼睛的巩膜。将其用作包含虹膜的圆的半径。

radius_iris = abs(first_column_of_sclera - column_of_pupil_center)
#this is the yellow line in the attatched image

找到巩膜:取一个小像素区域,如 3x3 块(或类似的,这是图像中的绿色框)并检查两个标准

  1. r,g,b通道的方差很小。白色(或灰色阴影)有 R=G=B,这意味着白色方差较小
  2. 您还需要检查 rgb 值是否高于某个阈值。灰色或黑色眼睛的人符合标准 1,但除非像素非常亮(接近白色),否则我们还没有到达巩膜

通过创建一个以瞳孔为中心的圆圈来创建虹膜蒙版 radius_iris 如果需要,您也可以使用瞳孔蒙版仅提取虹膜