You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精准测量圆形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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:57:27