使用 openCV python 查找骨架和边界之间的距离

问题描述 投票:0回答:2

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

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

python opencv image-processing contour euclidean-distance
2个回答
4
投票

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

要确定该值,您可以使用

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

到航站楼。


0
投票

我需要有关相关问题的帮助。我需要在图像中绘制此类线条和随机点,然后计算这些相应点的距离,如所示的线条所示。到目前为止,我已经完成了骨架化,这帮助我计算了物体的长度。我现在的问题是各个点的宽度。 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.