获取图像内部特征并去除边界

2024-09-30 07:22:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在使用python3.6,并使用Canny Edge Detection来检测图像内部的特征。我知道canny边缘检测算法使用边缘梯度来寻找边缘。Canny边缘检测在视网膜扫描中给我提供了一个合适的阈值选择的特征,但它总是在视网膜扫描和输出图像的黑色背景之间保持环形边缘。在

在输出图像中,我只想要图像内部的特征(视网膜扫描),而不是外边缘。我该怎么做?我正在寻找使用Python的解决方案。我也愿意使用精明的边缘检测以外的技术,如果它们有助于完成所需的任务。在

下面是实际的图像,以及我从Canny边缘检测得到的输出图像。在

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。在

提前谢谢。在


Tags: 代码图像importimgplt特征cv2边缘
1条回答
网友
1楼 · 发布于 2024-09-30 07:22:31

您可以通过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

在你想要去除你的外边缘后,使用你的外边缘来去除你的小边缘:

^{pr2}$

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

您可能需要试验侵蚀的内核大小来删除整个边界,但只删除边界。但总的来说,这应该会产生非常好和有力的结果。即使你的扫描方向或大小不一致。在

相关问题 更多 >

    热门问题