我需要找到虹膜边缘,我使用的输入图像不是完全圆形的虹膜,有时它可能被眼睑覆盖。 我找到了一篇期刊文章的摘要,发现虹膜甚至被眼睑覆盖。但是,我坚持其中一个步骤。再次,因为它只是一个摘要,我无法找到该文章的全文。
在这里我被困住了,我有一个图像,它已经被垂直索贝尔边缘检测暗示了。 我有一个图像输入,这里是图片:
这是应用垂直边缘检测后的图片:
我需要移除除虹膜边缘以外的所有边缘(红色边缘)。
我的预期结果应该是这样的:
注意:有些图像可能只有瞳孔的左边缘或右边缘,如上图所示,但有些图像可能有瞳孔的左右边缘。
在我看来,有两种方法可以获得优势。
去除水平边缘,因为瞳孔边缘有点垂直。但我不知道如何去除水平边缘,它不是真正的水平线条,它弯曲的水平线条。
找到图片中最长的边(我也不知道找到最长边的算法是什么)。
哪一个是解决问题的正确方法?或不是上述两种选择?
如果您知道找到非完全圆形物体的方法,特别是虹膜,请告诉我,它使我的项目更容易。
答案 0 :(得分:4)
这是一个功能检测问题,因此,我会在OpenCV库(Hough Circle Transformation)中使用tutorial。从屏幕截图中可以看出,该方法在检测部分圆度方面非常强大。
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');
结果是:
希望它可以帮到你解决问题。
代码参考:http://www.mathworks.com/help/images/ref/imfindcircles.html