利用Python将二值图中目标轮廓进行处理将轮廓细化成骨架线,并将骨架线作为目标轮廓中轴线,绘制在目标轮廓内,如图;
然后在中轴线垂直方向再绘制中轴线垂线,画一定数量条中轴线垂线。如图;
然后在中轴线垂直方向再绘制中轴线垂线,画一定数量条中轴线垂线。如图;
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题分析: 本题要求利用Python将二值图中目标轮廓进行处理,将轮廓细化成骨架线,并将骨架线作为目标轮廓中轴线,绘制在目标轮廓内。接着在中轴线垂直方向再绘制一定数量条中轴线垂线。 解决方案:
import cv2
import numpy as np
# 读取图片
img = cv2.imread('image_path', 0)
# 获取轮廓
_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
# 获取骨架线
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
skel = np.zeros(thresh.shape, np.uint8)
while cv2.countNonZero(thresh) > 0:
eroded = cv2.erode(thresh, kernel)
temp = cv2.dilate(eroded, kernel)
temp = cv2.subtract(thresh, temp)
skel = cv2.bitwise_or(skel, temp)
thresh = eroded.copy()
# 获取控制点
def get_control_points(contour):
M = cv2.moments(contour)
cX, cY = int(M['m10'] / M['m00']), int(M['m01'] / M['m00'])
distances = []
for point in contour:
x, y = point[0]
distance = np.sqrt((x - cX) ** 2 + (y - cY) ** 2)
distances.append(distance)
median_distance = np.median(distances)
control_points = []
for point in contour:
x, y = point[0]
distance = np.sqrt((x - cX) ** 2 + (y - cY) ** 2)
if distance < median_distance:
control_points.append((x, y))
return control_points
# 获取中轴线
control_points = get_control_points(cnt)
mid_points = [(control_points[i] + control_points[i+1]) // 2 for i in range(len(control_points) - 1)]
mid_points.append((control_points[-1] + control_points[0]) // 2)
# 绘制目标轮廓及其中轴线
img_contour = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawContours(img_contour, [cnt], -1, (0, 0, 255), 2)
cv2.polylines(img_contour, [np.array(control_points)], False, (255, 0, 0), 2)
cv2.imshow('contour with skeleton', img_contour)
# 绘制中轴线垂线
img_mid_points = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
for point in mid_points:
x, y = point
cv2.line(img_mid_points, (x, y), (x, y + 50), (0, 255, 0), 2)
cv2.imshow('mid points', img_mid_points)
cv2.waitKey(0)
参考资料: 1. OpenCV中的轮廓:https://docs.opencv.org/master/dd/d49/tutorial_py_contour_features.html 2. OpenCV中的形态学:https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=morphologyex#cv2.morphologyEx 3. OpenCV中的绘图函数:https://docs.opencv.org/master/d6/d6e/group__imgproc__draw.html 4. 中轴线的计算方法:https://blog.csdn.net/weixin_43218314/article/details/86717744