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 高阶算子使用二维高斯函数拟合。
二维高斯模型
求解思路
- 对公式取对数,转化为线性方程组;
- 用窗口内多组像素灰度,最小二乘拟合全部参数;
- 直接输出 \((\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 像素的重复精度(具体取决于信噪比、条纹宽度和成像条件),因此被广泛用于激光条纹中心提取。
总结:
