【问题标题】:Finding distance between skeleton and boundary using openCV python使用openCV python查找骨架和边界之间的距离
【发布时间】:2019-05-17 10:10:14
【问题描述】:

我正在尝试在 python 中使用 openCV 找到曲线的最大宽度。我使用精明的边缘检测器来获取曲线的边界。然后我设法在它们之间创建了一个骨架,如附件image 中的红线所示。我现在需要找到这个骨架和白线段之间的距离,以便我可以将最大距离乘以 2 以获得宽度。简而言之,我需要蓝线的长度。

我尝试使用距离变换,但我没有闭合轮廓,所以我得到的宽度不正确。我还尝试了先膨胀再腐蚀以获得闭合轮廓,但这会改变曲线的宽度。卡在这个上面很久了。任何帮助将不胜感激。

【问题讨论】:

  • 对于每个红色像素,搜索最近的白色像素(应该通过您正在寻找的正交线连接)并使用欧几里得距离计算距离。然后,您可以取所有距离的平均值或取最小值/最大值,具体取决于您想要的结果。
  • 恕我直言,在您的情况下,距离变换没有问题。除了距离可能是错误的错误,这取决于轮廓中间隙的最大尺寸。
  • @TA,我如何为每个红色像素搜索最近的白色像素?你能解释一下逻辑吗?我认为这可能有效!
  • @Eshant 作为一种简单的方法:在像素的 8 邻域中搜索,然后随后扩大搜索环境的大小,直到获得成功。

标签: python opencv image-processing euclidean-distance opencv-contour


【解决方案1】:

最大宽度是边界上任意点到中线的最大距离(可能乘以 2)。

要确定这个值,可以使用distance_transform,如下:

import numpy as np
import matplotlib.pyplot as plt
import cv2

# Generate test image
size = (100, 100)

mid_line = np.zeros(size, dtype='uint8')
mid_line[(range(10, 40), range(10, 40))] = 1
mid_line[(range(40, 80), np.linspace(40, 70, 40).astype(int))] = 1

outline = np.zeros(size, dtype='uint8')
outline[(np.linspace(5, 33, 30).astype(int),
         np.linspace(16, 47, 30).astype(int))] = 1

outline[(np.linspace(14, 47, 30).astype(int),
         np.linspace(5, 35, 30).astype(int))] = 1

outline[(np.linspace(36, 72, 40).astype(int),
         np.linspace(50, 77, 40).astype(int))] = 1

outline[(np.linspace(47, 88, 40).astype(int),
         np.linspace(35, 65, 40).astype(int))] = 1

dist = cv2.distanceTransform(255 - (255*mid_line), cv2.DIST_L2, 3)

# Visualize
plt.figure("Mid line plus edges over the distance transform")
plt.imshow(dist, cmap='gray')
overlay = mid_line + 2 * outline
plt.imshow(np.ma.masked_where(overlay == 0, overlay), cmap='jet', alpha=0.6)

# Get the maximum width
max_width = np.max(dist[outline > 0])
print("Maximum width:", max_width)


plt.show()

生成图像:

并输出:

Maximum width: 10.954346

到终端。

【讨论】:

  • 适用于测试图像。但是当我将它用于我自己的图像时,我收到错误:“序列太大;不能大于 32”。你知道可能出了什么问题吗?
  • 您能否更新您的问题以显示您尝试过的代码?
猜你喜欢
  • 1970-01-01
  • 2012-01-06
  • 2021-11-04
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2013-02-13
  • 2018-09-27
  • 1970-01-01
相关资源
最近更新 更多