halcon 里面 亚像素精度是如何实现?

📅 2026/7/7 4:12:10 👁️ 阅读次数 📝 编程学习
halcon 里面 亚像素精度是如何实现?

一、HALCON为什么能做到亚像素?

HALCON主要思想:

灰度函数 I(x) ↓ 数学模型 ↓ 拟合 ↓ 极值 ↓ 亚像素位置

即:

不是找像素 而是找函数。

二、实现方式

算法数学模型精度速度典型 Halcon 算子适用特征
法线 + 二次多项式拟合梯度抛物线拟合 + 向量投影edges_sub_pix、contour_sub_pix阶跃边缘、工件轮廓
二维灰度重心加权坐标平均中高极快measure_profile_sheet_of_light、measure_pos激光线、亮斑、线条
二维高斯拟合二维高斯曲面最小二乘极高高精度 Blob / 激光扩展算子超细激光、微小圆点

1、二维阶跃边缘亚像素(二次多项式拟合,重点)

二维阶跃边缘:局部可近似为直线边缘,定义两个正交方向:

  • n:边缘单位法向量(灰度变化最快的方向,梯度方向);
  • t:边缘单位切向量(沿边缘走向,灰度基本不变)。
  • 边缘定位本质:只关心法线方向的灰度变化,切线方向可忽略

步骤 1:二维梯度求解(求法线方向)

步骤 2:沿法线提取一维亚像素剖面

步骤 3:一维亚像素偏移量手推(二次多项式梯度拟合)

步骤 4:偏移量映射回二维浮点坐标(核心二维推导)

2、二维灰度重心法(亮线 / 激光线 / 光斑,工程高频)

针对激光线、焊点亮斑、刻度线这类「灰度单峰特征」,Halcon 激光标定measure_profile_sheet_of_light、卡尺measure_pos(..., 'center_of_gravity')均使用二维灰度重心,计算简单、速度快、鲁棒性强。

灰度重心法-CSDN博客

3、二维高斯拟合

针对超细激光、微小圆点等对精度要求极致的场景,Halcon 高阶算子使用二维高斯函数拟合

二维高斯模型

求解思路

  1. 对公式取对数,转化为线性方程组;
  2. 用窗口内多组像素灰度,最小二乘拟合全部参数;
  3. 直接输出 \((\mu_r,\mu_c)\) 作为亚像素坐标。

4.3 特点

  • 精度最高,抗高斯噪声能力强;
  • 计算量大,仅用于高精度检测场景;
  • 常与重心法组合用于激光线二次精定位。

三、halcon 中的亚像素

HALCON真正使用的方法

HALCON官方不是简单二次拟合。

而是:

第一步:Gaussian滤波

Gaussian导数

第二步:二维梯度

边缘是什么?

二维里面:不是一个数。而是:梯度

因此:

图像 ↓ Gaussian ↓ Gaussian一阶导 ↓ 梯度 ↓ 梯度峰值 ↓ 亚像素

分别求:

X方向和Y方向的导数

Gaussian导数

梯度向量

例如

某个像素:

Ix=120 Iy=80

那么梯度

案例

假设:

整数像素:

(100,200)

附近:

梯度:

第一步:求逆矩阵

第二步:计算偏移量

HALCON edges_sub_pix 数学模型

然后:

取多个灰度 ↓ 拟合 ↓ 峰值 ↓ 亚像素位置

Steger算法为什么也是亚像素?

Steger就是

二阶Taylor展开+Hessian矩阵+特征值分析实现亚像素中心定位。

怎么求解:

整数像素 ↓ Taylor展开 ↓ 偏移 ↓ 亚像素

Steger算法得到的中心线坐标通常具有约0.05~0.1 像素的重复精度(具体取决于信噪比、条纹宽度和成像条件),因此被广泛用于激光条纹中心提取。

总结: