在图片中获取特征并删除边界

时间:2019-06-17 03:37:17

标签: python opencv image-processing computer-vision

我想检测图像内部的特征(视网膜扫描)。该图像由具有黑色背景的矩形框内的视网膜扫描组成。

我正在使用Python 3.6,并且正在使用Canny Edge Detection来检测图像中的特征。我知道,精明边缘检测算法使用边缘梯度来查找边缘。虽然Canny Edge Detection为我提供了视网膜扫描内部的功能以供适当选择阈值,但它始终将圆形边缘保持在视网膜扫描和输出图像中的黑色背景之间。

在输出图像中,我只希望图像内部具有特征(视网膜扫描),而没有外部边缘。我该怎么做?我正在寻找使用Python的解决方案。如果Canny Edge Detection有助于完成所需的任务,我也愿意使用其他技术。

下面是实际图像,以及我从Canny Edge Detection获得的输出图像。

enter image description here

下面是我正在谈论的圆形边缘(以红色突出显示)

enter image description here

下面给出的是预期的输出图像

enter image description here

我的代码显示在下面:

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

您可以找到此代码here中使用的图像。

谢谢。

1 个答案:

答案 0 :(得分:4)

您可以通过3个步骤来解决此问题:

1)以非常低的强度阈值输入图像,因此视网膜是唯一的前景区域。查看您的图像,这应该可以正常工作,因为前景区域中没有真正的黑色区域:

img = cv2.imread('retina.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,bin = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)

enter image description here

enter image description here

2)使用腐蚀作用从前景上去除一小部分边缘,您要在应用佳能后去除外缘伪影发生的部分:

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(bin,kernel,iterations = 1)

enter image description here

(以红色显示:侵蚀区域)

3)将此侵蚀的图像用作当前结果图像上的二进制掩码。这将删除外部边界,同时保持所有内部结构完整:

edges_DR = cv2.Canny(img,20,40)
result = cv2.bitwise_and(edges_DR,edges_DR,mask = erosion)

enter image description here

enter image description here

您可能必须对内核大小进行实验以减少侵蚀,以去除整个边界,而仅去除边界。但是通常,这应该会产生非常好的结果。即使扫描的方向或大小不一致。