技术演示 · 合成数据

布氏压痕直径的图像测量:在合成图像上检查代码

用 OpenCV 自动测量布氏压痕直径并计算 HBW 的示例代码,在已知真值的合成图像上检查是否按预期工作。这是技术演示,不是真实压痕的测量结果。

最近一次重新运行:2026-11-05

问题背景

布氏硬度需要读取压痕的两个直径。用图像自动测量可以减少人工读数,但前提是代码确实把像素正确换算成毫米、正确拟合轮廓和计算硬度,并且在图像不合格时拒绝给出数值,而不是悄悄输出一个错误结果。

输入材料

脚本生成的合成灰度图像(1200 × 1200 像素):浅色背景上的深色椭圆“压痕”,边缘模糊并加入高斯噪声。假设标定为 0.005 mm/像素,试验条件假设为 F = 29420 N、D = 10 mm。图像和结果都可以用下方的脚本重新生成。

处理过程

  1. 高斯模糊后用 Otsu 法自动二值化,再用开运算去除小噪点。
  2. 取面积最大的轮廓并拟合椭圆,得到两个轴长(像素),乘以标定值换算成毫米。
  3. 检查结果是否可信:轮廓是否碰到图像边界、两轴相差是否超过 5%、轮廓是否填满拟合椭圆的 97%;不满足时拒绝给出数值。
  4. 按 ISO 6506-1 的定义式计算 HBW,并检查平均直径 d 是否在 0.24D~0.6D 范围内。

输出成果

已知真值与测量值的比较

真值 d1 / d2(像素)测量 d1 / d2(像素)d 真值 → 测量(mm)HBW 真值 → 测量在有效范围内
800 / 800799.5 / 799.54.0000 → 3.9975 (-0.06%)228.8 → 229.1 (+0.13%)是
800 / 780799.6 / 779.53.9500 → 3.9478 (-0.06%)234.9 → 235.2 (+0.12%)是
500 / 500499.9 / 499.82.5000 → 2.4993 (-0.03%)601.6 → 601.9 (+0.05%)是
1000 / 990999.4 / 989.44.9750 → 4.9719 (-0.06%)144.1 → 144.3 (+0.14%)是
400 / 400399.9 / 399.92.0000 → 1.9995 (-0.03%)945.5 → 946.1 (+0.06%)否

亮度不均匀时的表现

  • 灰度差 0: d = 3.9975 mm(-0.06%)
  • 灰度差 40: d = 3.9978 mm(-0.05%)
  • 灰度差 80: d = 3.9978 mm(-0.06%)
  • 灰度差 120: 拒绝给出结果:轮廓碰到图像边界,且只填满拟合椭圆的 84%

验证方法

因为合成图像的真值已知,可以直接比较:5 组尺寸的直径偏差为 -0.06%~-0.03%,HBW 偏差为 +0.05%~+0.14%。400 / 400 像素一组的 d = 2.0 mm,小于 0.24D = 2.4 mm,代码正确地标为“超出有效范围”。加入线性亮度梯度后,灰度差 0、40、80 时结果基本不变;灰度差 120 时分割不再可信,代码拒绝给出数值。2026 年 11 月 5 日用 OpenCV 5.0.0 重新运行,输出与仓库中的记录逐行一致。

限制

  • 合成图像没有真实压痕的凸起边缘、划痕、反光和镜头畸变,这些结果只说明代码逻辑正确,不能说明真实样品上的测量精度。
  • 标定值是假设的。真实测量需要用标定尺确定像素尺寸,并评估测量系统的不确定度。
  • 5% 和 97% 的合理性阈值是为合成图像设定的示例值,用于真实图像前需要重新确定。
  • 本示例没有按 ISO 6506-2 对测量系统进行验证,不能作为合规的测量方法。

下载脚本与输出

相关工具