如何在应用边缘检测后删除一些边缘?

时间:2016-06-04 16:29:01

标签: image-processing edge-detection sobel iris-recognition

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

在这里我被困住了,我有一个图像,它已经被垂直索贝尔边缘检测暗示了。 我有一个图像输入,这里是图片:

Input Image

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

enter image description here

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

enter image description here

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

enter image description here

  

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

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

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

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

  3. 哪一个是解决问题的正确方法?或不是上述两种选择?

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

2 个答案:

答案 0 :(得分:4)

这是一个功能检测问题,因此,我会在OpenCV库(Hough Circle Transformation)中使用tutorial。从屏幕截图中可以看出,该方法在检测部分圆度方面非常强大。

enter image description here

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()

答案 1 :(得分: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');

结果是:

enter image description here

希望它可以帮到你解决问题。

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