如何精准测量圆形Mask各部位宽度?原旋转测量法精度不足
曲线型Mask宽度精准测量方案
针对圆形曲线Mask的宽度测量需求,替代旋转法的更优方案可以从以下几个方向入手:
1. 骨架法线距离法
- 先对二值Mask提取细化骨架,得到曲线的中心轴线(可使用OpenCV的
cv2.ximgproc.thinning()实现) - 针对骨架上的每个点,通过邻域点的梯度方向推导该点的法线方向(即垂直于曲线切线的方向)
- 沿法线方向向两侧延伸,直到碰到Mask的边缘,两点间的像素距离即为该位置的宽度
2. 距离变换法
- 对Mask执行距离变换(
cv2.distanceTransform()),得到每个前景像素到最近背景的距离值 - 提取Mask的骨架作为测量中轴线,骨架上每个点的宽度为对应距离变换值的2倍(因为距离值是单侧边缘到中心的距离)
- 该方法无需手动寻找边缘配对,计算效率高,精度稳定
3. 轮廓配对测量法
- 如果是环形Mask,提取内外两条轮廓;如果是单条曲线Mask,提取两侧边缘轮廓
- 对轮廓上的点按顺序配对,计算每对对应点在法线方向上的距离,即为对应位置的宽度
代码示例(基于OpenCV的距离变换法)
import cv2 import numpy as np # 读取二值Mask图像(前景白色,背景黑色) mask = cv2.imread('mask_image.png', 0) # 执行距离变换,获取单侧边缘距离 dist_transform = cv2.distanceTransform(mask, cv2.DIST_L2, 5) # 提取Mask的细化骨架 skeleton = cv2.ximgproc.thinning(mask) # 获取骨架上所有点的坐标 y_coords, x_coords = np.where(skeleton == 255) # 计算每个骨架点对应的宽度 width_list = [dist_transform[y, x] * 2 for y, x in zip(y_coords, x_coords)] # 可视化测量结果 result_img = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) for y, x, width in zip(y_coords, x_coords, width_list): cv2.putText(result_img, f'{width:.1f}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1) cv2.imwrite('width_measurement_result.png', result_img)
方案优势
以上方法无需对图像进行旋转操作,直接针对曲线的几何特性计算宽度,完美适配圆形等曲线型Mask的测量场景,精度远高于传统旋转法。
内容的提问来源于stack exchange,提问作者ge1mina023
相关产品推荐
相关产品推荐

