【问题标题】:Obtain features inside image and remove boundary获取图像内的特征并去除边界
【发布时间】:2019-06-17 03:37:17
【问题描述】:

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

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

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

下面是实际图像,以及我从 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()

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

提前致谢。

【问题讨论】:

  • 检测后移除不需要位置的特征,例如使用预先计算的掩码。
  • 感谢您的帖子,米卡。您能否详细说明我如何在上述问题中实施您的建议?
  • 您能否详细说明预期的输出应该是什么?您是否尝试仅提取视网膜扫描(灰色部分)作为单独的图像并移除黑色外部背景?
  • 感谢您的帖子,内森西。 :) 我现在添加了预期的输出图像。

标签: python opencv image-processing computer-vision


【解决方案1】:

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

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

【讨论】:

  • 编辑:添加了一些图片和代码以阐明程序
  • @TA:感谢您的回答。如果edges_DR 与我在问题中使用的相同,您的定义是否相同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多