灰度重心法
灰度重心(Gray Centroid)是工业视觉中最经典的亚像素定位方法之一。
HALCON、OpenCV、VisionPro、Matrox等视觉软件里面,都大量使用了它(通常作为算法中的一步,而不是全部)。
一、为什么会有灰度重心?
假设有一条黑线:
□□□□□□□□□□□□□□ □□□□□□□□□□□□□□ ████████████████ ████████████████ □□□□□□□□□□□□□□ □□□□□□□□□□□□□□如果直接找边缘:
只能得到 x = 20 这是整数像素,但是真实边缘可能在 x = 20.37怎么办?让灰度值参与计算。例如:
255 255 250 220 180 120 60 20 0二、灰度重心公式
1、什么叫重心?
假设有一根木棍,有三个小球
那么重心在哪里? 物理告诉我们
即 质量 × 位置 / 总质量 例如:
灰度重心其实完全一样
2、灰度重心公式
假设 二维灰度:
X方向:
那么X方向: 计算
左列: 0*20 +0*100 +0*20=0
中间: 1*50+1*255+1*50=355
右列: 2*20+2*100+2*20=280
分子综合: 0+355+280=635
分母: 20+50+20+100+255+100+20+50+20=565
x=635/565=1.124
Y方向:
最终
(1.124, 1.000)就是亚像素中心。
x → 0 1 2 3 4 y=0 0 0 0 0 0 y=1 0 20 60 20 0 y=2 0 60 200 80 0 y=3 0 20 80 40 0 y=4 0 0 0 0 0可以看出:
- 中心区域最亮;
- 右下方向略亮,因此真实中心会偏向右下,而不是整数点 (2,2)。
第一步:计算总灰度
∑I=20+60+20+60+200+80+20+80+40=580
第二步:计算 x 重心
按列累加:
- 第1列(x=1):20+60+20=100
- 第2列(x=2):60+200+80=340
- 第3列(x=3):20+80+40=140
分子:
1×100+2×340+3×140=100+680+420=1200
因此:
第三步:计算 y 重心
按行累加:
- y=1:20+60+20=100
- y=2:60+200+80=340
- y=3:20+80+40=140
分子:
1×100+2×340+3×140=1200
因此:
三、总结
优点与局限
优点:
- 数学模型简单,只需要一次加权求和;
- 计算速度快,非常适合实时工业检测;
- 能达到亚像素精度;
- 对圆形光斑、激光点、LED亮点等效果很好。
局限:
- 对噪声敏感,背景灰度会拉偏重心,因此通常需要先做阈值分割或背景扣除;
- 当目标灰度分布不对称时,重心会产生系统偏差;
- 不适合直接用于复杂边缘定位,边缘检测通常结合梯度、曲线拟合或Steger算法获得更高精度。
与 Steger 算法的关系
整数像素 │ ▼ 最大灰度位置 │ ▼ 灰度重心(利用灰度作为权重) │ ▼ 二次曲线拟合(局部拟合峰值) │ ▼ 高斯拟合(拟合光斑模型) │ ▼ Steger 算法(高斯导数 + Hessian 特征值,提取线中心)灰度重心是最基础、最容易手推的亚像素定位方法;Steger 算法则是在此基础上,进一步利用图像导数和局部曲率信息,对激光条纹等线状目标实现更稳定、更高精度的中心提取,因此在工业视觉中应用非常广泛。
