![](/img/trans.png)
[英]Find contour and boundary to obtain points inside image OpenCV Python
[英]Obtain features inside image and remove boundary
我想检测图像内的特征(视网膜扫描)。 该图像由带有黑色背景的矩形框内的视网膜扫描组成。
我正在使用Python 3.6,我正在使用Canny Edge Detection来检测图像中的功能。 我知道canny边缘检测的算法使用边缘渐变来找到边缘。 虽然Canny边缘检测为我提供了视网膜扫描内部的功能,可以正确选择阈值,但它始终保持视网膜扫描和输出图像中黑色背景之间的圆形边缘。
在输出图像中,我想只有图像内部的特征(视网膜扫描),而不是外边缘。 我怎样才能做到这一点? 我正在寻找使用Python的解决方案。 如果它们有助于实现所需的任务,我也愿意使用Canny Edge Detection以外的技术。
下面是实际图像,以及从Canny Edge Detection获得的输出图像。
下面是我所说的圆形边缘(以红色突出显示。)
以下是预期的输出图像 :
我的代码在下面给出:
import cv2
import matplotlib.pyplot as plt
from matplotlib.pyplot import imread as imread
plt.figure(1)
img_DR = cv2.imread('img.tif',0)
edges_DR = cv2.Canny(img_DR,20,40)
plt.subplot(121),plt.imshow(img_DR)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges_DR,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
您可以在此处找到此代码中使用的图像。
提前致谢。
您可以通过3个步骤解决此问题:
1)以非常低的强度阈值输入图像,因此您的视网膜是唯一的前景区域。 看看你的图像,这应该可以正常工作,因为你的前景区域没有真正的黑色区域:
img = cv2.imread('retina.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,bin = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)
2)使用侵蚀从前景中移除一小块边缘,你想要在应用canny之后移除外缘伪影产生的部分:
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(bin,kernel,iterations = 1)
(以红色显示:被侵蚀的区域)
3)将此侵蚀图像用作当前结果图像上的二进制掩码。 这将删除外边框,同时保持所有内部结构完整:
edges_DR = cv2.Canny(img,20,40)
result = cv2.bitwise_and(edges_DR,edges_DR,mask = erosion)
您可能必须尝试使用内核大小来消除侵蚀,以删除完整的边框,但只删除边框。 但一般来说,这应该会产生非常好的和强大的结果。 即使扫描的方向或大小不一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.