灰度重心法

灰度重心(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 算法则是在此基础上,进一步利用图像导数和局部曲率信息,对激光条纹等线状目标实现更稳定、更高精度的中心提取,因此在工业视觉中应用非常广泛。