获取图像内的特征并删除边界

Sid*_*thy 5 python opencv image-processing computer-vision

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

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

在输出图像中,我只希望图像内部具有特征(视网膜扫描),而没有外部边缘。我怎样才能做到这一点?我正在寻找使用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()
Run Code Online (Sandbox Code Playgroud)

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

提前致谢。

T A*_*T A 7

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

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

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

在此处输入图片说明

在此处输入图片说明

2)使用腐蚀从前景中去除一小部分,您想去除应用canny后外缘伪影产生的部分:

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(bin,kernel,iterations = 1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

edges_DR = cv2.Canny(img,20,40)
result = cv2.bitwise_and(edges_DR,edges_DR,mask = erosion)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在此处输入图片说明

您可能必须尝试使用​​内核大小进行腐蚀以移除完整边界,但仅移除边界。但总的来说,这应该会产生非常好的和稳健的结果。即使扫描的方向或大小不一致。