2016-04-26 58 views
1

虹膜區域使用的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

方法1 虹膜區域檢測。使用霍夫圈子方法

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

方法2 虹膜區域檢測。

請引導我們如何自動提取人眼圖片中的圓形黑色區域。

+1

不是角膜。那是學生......這些東西沒有在學校教過嗎? :(以及hough輸出圖像有什麼問題?如果這個結果不夠好,什麼是好的,你想達到什麼目的? – Piglet

+0

準確地說,我們要確定虹膜區域(外圓灰色區域)和瞳孔區域(內部的黑色圓圈),如圖所示http://www.elecfans.com電子發燒友http://bbs.elecfans.com電子技術論壇Page 3 Hough輸出圖像不一致在某些眼睛圖像不精確識別虹膜區域 – Vikram

+0

當你沒有設置hough變換的最小和最大半徑時,你不能指望好的結果... – Piglet

回答

1

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

要在人眼圖像識別眼睛區域,可以使用下面的步驟: -

1)瞳孔區的識別號 -由於瞳孔區域的強度會非常接近於零,就可以使用二值化閾值來找到瞳孔區域。您可以使用連通分量標註來獲得相同強度的區域,然後選擇偏心率接近零的區域作爲瞳孔圓。該連通區域的質心將爲圓心,您可以得到半徑由連接組件的尺寸框決定。

2)虹膜區的識別號 -現在你已經得到了你的瞳孔區,你可以使用霍夫圓法得到虹膜region.Use Canny邊緣檢測得到邊緣map.Take虹膜圓心在虹膜瞳孔中心和半徑周圍的一個盒子內,瞳孔半徑大於瞳孔半徑且小於一個固定量。按照上述規定製作多箇中心變化,半徑變化的圓,並計算位於這些圓上的邊緣圖點的數量。位於其上的邊緣點的最大數量將是虹膜圈。

注意: - 根據我的經驗,我發現獲得虹膜圈非常昂貴,因爲您必須製作具有不同中心和半徑的多個圓。一種解決方案是保持圓心固定爲瞳孔中心,並且只改變半徑因爲虹膜圈會非常接近瞳孔中心。但是,由於頂部和底部的睫毛邊緣貼圖給出了錯誤的邊緣貼圖點,所以它給出了錯誤的結果。爲了解決這個問題,我做了一個jugaad。我把虹膜中心固定爲瞳孔中心,並且只爲瞳孔中心的圖像左手部分找到虹膜半徑。同樣,我從瞳孔中心找到了圖像右側的虹膜半徑。我用半徑和中心的平均值作爲瞳孔中心來獲得虹膜邊界。它爲我工作。

+0

我們嘗試了虹膜中心的平均值到左sid e邊界和irist中心到右邊界。但是輸出不一致,如果您可以共享上述問題的源代碼,那就太好了。 – Vikram

+0

由於我在旅途中,因此我現在還沒有源代碼。所以,讓我們確定你的問題。你的瞳孔中心和橈骨是否正確?如果是,那麼嘗試虹膜半徑和變化半徑和變化中心的圓。你應該得到這個正確的解決方案。如果沒有,那麼你的代碼有一些問題。嘗試使用中值濾鏡進行圖像去噪。從頭開始,讓我知道你卡在哪裏。在開始獲得正確結果後,到達Jugaad部分。 – dpurbey

+1

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

0

爲了避免錯誤的結果並提高性能,您應該始終使用適當的HoughCircles邊界。虹膜和瞳孔半徑將在一定範圍內。

我會尋找合適的大小在圖像中找到瞳孔的黑色斑點。一旦你知道了學生的位置,你就知道在哪裏尋找虹膜。提取將包含虹膜的興趣區域(使用瞳孔大小來估計虹膜大小),但不多。然後做兩次霍夫變換以獲得虹膜和瞳孔的位置和半徑。 之後,如果需要,可以使用hough變換中的知識擬合圓/橢圓,從而進一步提高精度。

+0

嘗試,但不能得到理想的結果。如果你可以點 – Vikram

+0

你的結果是什麼?在網上有無數的houghcircles例子,請理解我是否不會再添加一個副本,你使用了哪一個半徑? – Piglet

1

使用方法2,您可以從瞳孔中心開始,然後向外移動,保持在同一排(瞳孔中心的左側或右側),直到您打到鞏膜的眼球。將此用作包含虹膜的圓的半徑。

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

找到鞏膜:取像的3×3塊小的像素區域(或類似的,這是在圖像中的綠色框),並檢查其兩個標準

  1. 的R的方差,g,b通道很小。白色(或灰色陰影)具有R = G = B,這意味着白色將具有較低的方差
  2. 您還需要檢查rgb值是否高於某個閾值。有人用灰色或黑色的眼睛會滿足條件1,但除非像素是很輕(接近白色),我們還沒有達到鞏膜

通過創建瞳孔與radius_iris如果爲圓心創建虹膜面具你願意,你也可以使用瞳孔口罩,只提取虹膜

enter image description here

+0

試過這種方法,可以在這裏看到輸出圖像https:// drive。 google.com/file/d/0Bxed_8T6OPe4cWNlVWR6VU1KYUk/view https://drive.google.com/file/d/0Bxed_8T6OPe4Z2Y2N2w2NUxIS1U/view難點在於確定虹膜區域的確切中心點(也應該是瞳孔的中心點區)。如何確定虹膜區域的中心點? – Vikram

+0

@Vikram虹膜的中心從代碼中的'cv2.houghcircle'獲得,虹膜的中心是半徑爲i [2]的'(i [0],i [1])''獲得該結果在**方法2 **中如果houghcircle的結果沒有一致地發現虹膜,那麼添加其他人所建議的最小值和最大值。看看你發佈的圖片,你可以使用'maxRadius = 75' – andrew

+0

你的解決方案部分幫助我們解決了這個問題。謝謝。 – Vikram