繁体   English   中英

获取图像内的要素并删除边界

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM