布氏压痕直径的图像测量:在合成图像上检查代码
用 OpenCV 自动测量布氏压痕直径并计算 HBW 的示例代码,在已知真值的合成图像上检查是否按预期工作。这是技术演示,不是真实压痕的测量结果。
最近一次重新运行:2026-11-05
问题背景
布氏硬度需要读取压痕的两个直径。用图像自动测量可以减少人工读数,但前提是代码确实把像素正确换算成毫米、正确拟合轮廓和计算硬度,并且在图像不合格时拒绝给出数值,而不是悄悄输出一个错误结果。
输入材料
脚本生成的合成灰度图像(1200 × 1200 像素):浅色背景上的深色椭圆“压痕”,边缘模糊并加入高斯噪声。假设标定为 0.005 mm/像素,试验条件假设为 F = 29420 N、D = 10 mm。图像和结果都可以用下方的脚本重新生成。
处理过程
- 高斯模糊后用 Otsu 法自动二值化,再用开运算去除小噪点。
- 取面积最大的轮廓并拟合椭圆,得到两个轴长(像素),乘以标定值换算成毫米。
- 检查结果是否可信:轮廓是否碰到图像边界、两轴相差是否超过 5%、轮廓是否填满拟合椭圆的 97%;不满足时拒绝给出数值。
- 按 ISO 6506-1 的定义式计算 HBW,并检查平均直径 d 是否在 0.24D~0.6D 范围内。
输出成果
已知真值与测量值的比较
| 真值 d1 / d2(像素) | 测量 d1 / d2(像素) | d 真值 → 测量(mm) | HBW 真值 → 测量 | 在有效范围内 |
|---|---|---|---|---|
| 800 / 800 | 799.5 / 799.5 | 4.0000 → 3.9975 (-0.06%) | 228.8 → 229.1 (+0.13%) | 是 |
| 800 / 780 | 799.6 / 779.5 | 3.9500 → 3.9478 (-0.06%) | 234.9 → 235.2 (+0.12%) | 是 |
| 500 / 500 | 499.9 / 499.8 | 2.5000 → 2.4993 (-0.03%) | 601.6 → 601.9 (+0.05%) | 是 |
| 1000 / 990 | 999.4 / 989.4 | 4.9750 → 4.9719 (-0.06%) | 144.1 → 144.3 (+0.14%) | 是 |
| 400 / 400 | 399.9 / 399.9 | 2.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 对测量系统进行验证,不能作为合规的测量方法。