5

我需要找到虹膜边缘,我使用的输入图像不是完全圆形的虹膜,有时它可能会被眼睑覆盖。我找到了一篇期刊文章的摘要,发现虹膜甚至被眼睑覆盖。但是,我坚持了其中一个步骤。再说一次,因为只有一个摘要,我找不到那篇文章的全文。

这就是我卡住的地方,我有一个图像,它已经被垂直 Sobel 边缘检测所暗示。我有一个图像输入,这是图片:

输入图像

这是应用垂直边缘检测后的图片:

在此处输入图像描述

我需要删除除虹膜边缘(红色边缘)之外的所有边缘。

在此处输入图像描述

我的预期结果应该是这样的:

在此处输入图像描述

注意:有些图像可能只有瞳孔的左右边缘,如上图,但有些图像可能有瞳孔的左右边缘。

在我看来,有两种方法可以获得优势。

  1. 移除水平边缘,因为瞳孔边缘有点垂直。但我不知道如何去除水平边缘,它不是真正的水平线,它是弯曲的水平线。

  2. 找到图片中最长的边(我也不知道找到最长边的算法是什么)。

哪一种是解决我的问题的正确方法?或者不是以上两个选项?

如果你知道找到特别是虹膜的不完全圆形物体的方法,请告诉我,它使我的项目更容易。

4

2 回答 2

4

这是一个特征检测问题,因此,我将使用OpenCV 库(教程)中的霍夫圆变换。从屏幕截图中可以看出,该方法在检测部分圆形度方面非常稳健。


在此处输入图像描述

import cv2
import cv2.cv as cv
import numpy as np

img = cv2.imread(r'C:\path\to\eye.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20,
                            param1=150,param2=30,minRadius=20,maxRadius=100)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
于 2016-06-04T22:14:56.197 回答
3

我试着回答你的问题,我建议你使用圆形霍夫变换。我正在尝试检测圆形,以便您可以获得圆的半径,然后您可以获得圆的大小。

这里的代码和结果:

A = imread('eye.jpg');
A = imresize(A, 0.8);
A = rgb2gray(A);
A = edge(A, 'canny');
imshow(A);
[centers, radii, metric] = imfindcircles(A,[1 100]);
centersStrong5 = centers(1:1,:);
radiiStrong5 = radii(1:1);
metricStrong5 = metric(1:1);
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');

结果是:

在此处输入图像描述

希望对您的问题有所帮助。

代码参考: http: //www.mathworks.com/help/images/ref/imfindcircles.html

于 2016-06-04T16:58:02.480 回答