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

时间:2016-04-26 10:36:39

标签: python opencv image-processing computer-vision

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

中所示

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

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

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上述代码。

方法2 使用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代码。

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

3 个答案:

答案 0 :(得分:1)

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

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

1)瞳孔区域的识别: - 由于瞳孔区域强度非常接近零,您可以使用二进制阈值来找到瞳孔区域。您可以使用连通分量标记来获得相同的区域然后选择具有接近零的偏心率的区域作为瞳孔圆。该连通区域的质心将是圆的中心,你可以通过连通分量盒的尺寸得到半径。

2)虹膜区域的识别: - 现在您已经获得了瞳孔区域,您可以使用霍夫圈法来获取虹膜区域。使用精确边缘检测来获取边缘图。使用中心瞳孔中心周围的虹膜圆圈和虹膜半径大于瞳孔半径且小于固定量。如上所述制作具有不同中心和变化半径的多个圆圈,并计算位于这些圆圈上的边缘地图点的数量。具有最大边缘点数的圆圈将是虹膜圆。

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

答案 1 :(得分:1)

使用方法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,但除非像素非常轻(接近白色),否则我们没有达到巩膜
  3. 如果需要,可以使用radius_iris创建一个以瞳孔为中心的圆圈来创建虹膜蒙版,也可以使用瞳孔蒙版仅提取虹膜

    enter image description here

答案 2 :(得分:0)

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

我会在图像中寻找合理尺寸的黑色斑点来定位瞳孔。一旦你知道瞳孔在哪里,你就知道在哪里寻找虹膜。提取将包含虹膜的感兴趣区域(使用瞳孔大小来估计虹膜大小)但不多。然后进行两次霍夫变换以获得虹膜和瞳孔位置和半径。 之后,如果需要,您可以使用霍夫变换的知识拟合圆/椭圆来进一步提高精度。