云计算百科
云计算领域专业知识百科平台

图像配准方法全梳理:传统特征、灰度直接法与深度学习方案

图像配准是将把同一场景,不同时间、不同角度或不同传感器下获取的多张图像进行空间对齐的过程。

一、基于特征的图像配准方法

首先从待配准图像中提取图像中的局部显著特征(角点、边缘、轮廓、局部特征点等),并为其计算描述子,随后通过描述子的相似度匹配来建立两幅图像之间的对应关系,最后通过几何变换实现两幅图像的对齐配准。基于特征的配准,依赖的是图像 “固有、稳定的特征”,而非整幅图像的灰度或整体形态。

优点:

1. 特征点数量少,计算量较低,配准速度快,适合实时系统与嵌入式设备。

2. 对旋转、缩放、光照变化及部分遮挡具有较强鲁棒性。

3. 可结合 SIFT、SURF、ORB、AKAZE 等多种特征,适应不同场景需求。

4. 二进制描述子(如 ORB、BRIEF、BRISK)内存占用小,匹配效率高。

5. 能通过 RANSAC 等方法剔除误匹配,提高整体配准稳定性。

缺点:

1. 在弱纹理、重复纹理或大面积平坦区域中,特征点数量不足,容易匹配失败。

2. 特征提取、描述与匹配流程较复杂,参数较多。

3. 特征匹配阶段可能存在误匹配,需要额外几何一致性约束进行筛选。

4. 对严重模糊、低分辨率或剧烈光照变化场景敏感。

5. 当图像间视角变化过大或非刚性形变明显时,配准精度会下降。

适用场景:

1. 最通用、最灵活的图像配准方法,可处理平移、旋转、缩放、仿射、透视等多种几何变换。

2. 适用于目标识别、全景拼接、SLAM、视觉里程计(VO)、三维重建等任务。

3. 特别适合存在尺度变化、视角变化及局部遮挡的复杂场景。

4. 常用于实时视觉系统,如无人机、机器人、AR/VR 与移动端视觉应用。

描述子和关键点:

描述子(Descriptor):本质是用一个向量编码关键点附近的局部纹理信息。让同一特征点在不同图像中的描述尽可能相似,不同特征点的描述尽可能不同,从而实现特征匹配。

关键点:应该满足局部唯一、稳定(关照变化后仍存在)、可重复(旋转缩放后还能检测到)、梯度丰富(便于描述)。因此,边缘不是好特征(沿边缘方向无法确定位置),角点才是好特征(x、y 都唯一)所以关键点检测本质都是在找局部二维梯度变化都很大的点。这是Harris/Shi-Tomasi/FAST背后的本质。

完整流程:

1.特征提取与描述

 – 算法(如SIFT)首先在图像中寻找具有尺度和旋转稳定性的关键点(Keypoints),然后在其邻域内计算出高维度的特征描述子(Descriptors),作为该区域的“数字身份证”。

2.特征匹配与鲁棒几何约束

 – 匹配:利​​用距离距离公式(如欧氏距离),为图A中的每个描述子在图B中寻找最近邻,建立初步的匹配。

 – 几何约束纯提:初始匹配中通常包含大量的误匹配(异常值/异常值)。此时需要引入几何约束,通过结合RANSAC(随机噪声一致)等鲁棒性估计算法,在迭代中识别并剔除错误的匹配对,只保留符合同一几何规律的正确匹配点(内点/内点)。

3.几何模型估计和空间变换

 – 矩阵初始化:利用阶段二筛选出的高质量正确匹配点对,采用最小二乘法等数学手段,构造两幅图像之间的几何变换矩阵(如单应性矩阵 H 或仿射变换矩阵)。

 – 图像重投影:借助计算出的变换矩阵,对其中一幅图像进行空间坐标重投影(Warping)与像素插值,设置在同一坐标系下与另一幅图像对齐。

1. 特征方法

1.1 基于点特征的方法

1.1 SIFT(Scale-Invariant Feature Transform)

尺度不变特征变换,核心思想是在图像的尺度空间中检测稳定的关键点,并为每个关键点生成独特的描述符。

(1)优缺点

优点:1.尺度不变性,基于 Gaussian Scale Space(高斯尺度空间)与 DoG(Difference of Gaussian)极值检测。2.旋转不变性,通过主方向分配实现描述子方向归一化。3.对光照变化具有较强鲁棒性,描述子基于局部梯度方向统计,并进行归一化处理。4.特征区分性强,使用 128 维梯度方向直方图描述局部结构。5.支持亚像素级关键点定位,使用 Taylor Expansion 对 DoG 极值点进行精细化拟合。6.对复杂场景鲁棒性较强,尺度空间、方向归一化与局部梯度统计共同提升了抗噪声、遮挡与背景干扰能力。

缺点:1. 计算量较大,需要构建 Gaussian Pyramid / DoG Pyramid 并进行多尺度梯度统计。2. 内存占用较高,描述子通常为 128 维浮点向量。3. 匹配计算复杂度较高,通常采用欧氏距离(L2 distance)进行浮点描述子匹配。4. 实时性有限,高分辨率图像与大量关键点场景下计算开销明显增加。5. 对强透视畸变与大面积动态遮挡鲁棒性有限,本质仍基于局部近似仿射与静态场景假设。

适用场景:高精度图像配准、三维重建、复杂场景拼接,适合对精度要求高、对实时性不敏感的任务。

(2)主要步骤

1.尺度空间极值检测:通过高斯差分(DoG)函数寻找在不同尺度下稳定的特征点。

2.关键点定位:去除低对比度点与边缘响应,确保特征稳定性。

3.方向分配:基于梯度方向直方图,为关键点赋予主方向,实现旋转不变性。

4.特征描述:利用局部梯度分布生成 128 维特征向量。

(3)关键点检测

1.尺度空间极值检测

 – 图像金字塔,SIFT把原图不断缩小尺寸,得到不同分辨率的副本,组成一个 “金字塔”。

 – 高斯模糊对金字塔的每一层整图,用不同的高斯标准差 σ 做模糊,得到一组 “尺寸相同、模糊程度不同” 的图像。

 – 高斯差分(DoG)把同一层里、相邻的两张高斯模糊图像相减,得到 DoG 图像,突出那些 “对模糊变化敏感” 的边缘和角点,然后在这些 DoG 图像里找局部极值点。

2.关键点定位

在 DoG 金字塔中,每一个像素点要与它同层周围的 8 个邻域像素,以及上下相邻两层对应位置的 2 * 9 = 18 个像素,总共 26 个像素进行大小比较。只有当该点是这 27 个点中的最大值或最小值时,才被初步选为候选关键点。本质找到是尺度空间稳定的极值而不是普通角点,因为不同大小的物体在不同σ下响应最大,找到的特征点都会带有最佳尺度,后续描述子都在对应尺度下计算,所以尺度不变。

3.方向分配

SIFT会统计关键点领域的梯度方向直方图,以关键点为中心,取一个 16×16 的邻域,将360°方向划分为36个bin(每个bin 10°),邻域内每个像素的梯度幅值会按方向累加到对应的bin中,直方图中最高的峰值就是该关键点的主方向。后续描述子计算都会对齐这个方向,因此,即使图像旋转,描述子仍保持一致。

SIFT 关键点是斑点 / 边缘型关键点,用一个带有方向箭头的圆来表示。它包含三个核心图形几何信息:1.圆心表示特征点位置。2.圆的半径代表该点的尺度(Scale)。圆圈越大,说明这个特征是在高斯金字塔更高层(更模糊、更宏观的尺度)被检测出来的。在大圆里的特征,即使图像被缩小,它依然能被找到。3.箭头的方向代表该特征点的主方向。这是局部邻域内梯度能量最强的方向。当图像整体旋转时,这个箭头也会跟着旋转相同的角度。

(4)描述子计算

SIFT描述子本质是统计局部梯度结构:主方向确定后,后续生成描述子时,会将坐标轴旋转,使得关键点的主方向旋转至正上方(0度)。生成 128 维描述子时,会再做一次方向直方图,把 16×16 的邻域分成 4×4 个子区域(每个子区域大小为 4 * 4 像素)。在每个子区域内,统计 8 个方向的梯度直方图(每 45 度一个柱),4×4×8 = 128 维,将这16个8维直方图按顺序拼接,形成 128 维特征向量。

归一化处理:为了消除线性光照变化(如图像整体变亮或变暗)的影响,对 128 维向量进行 L_2 范数归一化。随后将向量中大于 0.2 的值截断为 0.2,并再次进行归一化,以提高对非线性光照变化的鲁棒性。

描述子的图形表达:8 方向特征罗盘。如上图所示,在每一个 4 * 4 的子区域内部,算法将所有像素的梯度归纳到 8 个方向上。在视觉图形上,这表现为一个由 8 根箭头组成的“罗盘 / 刺猬图”:

 – 箭头的指向:代表梯度的方向(每 45 度一个方向,共 8 个方向)。

 – 箭头的长度:代表该方向上所有像素梯度幅值的累加和(经过高斯窗口加权)。箭头越长,说明图像在这个方向上的边缘/纹理特征越明显。

\\mathbf{v} = \\begin{bmatrix} v_1 \\\\ v_2 \\\\ \\vdots \\\\ v_{128} \\end{bmatrix} \\in \\mathbb{R}^{128}

相关概念:

(5)相关概念

尺度:看东西的远近/分辨率大小。

尺度不变性:不管物体变大还是变小,离得近还是离得远,特征都能被检测、匹配。

尺度空间:要实现尺度不变性,不能只在原图上找特征,必须把图片做成一堆由大到小,逐层模糊缩小的图,生成多尺寸金字塔图像集合,这整套图就叫尺度空间。

为什么尺度不变:构建高斯尺度空间+高斯差分金字塔DOG。SIFT不断做缩放和高斯模糊,构造多尺度图像金字塔,在尺度空间中每一层尺度都单独找极值点,使得这个特征在某个最优尺度下响应最强,这样,不管物体放大、缩小、离相机远/近,该关键点总能被找到,不受尺度变化的影响。

为什么旋转不变:SIFT维每个关键点分配主方向,做方向归一化。在关键点所在最优尺度层邻域计算梯度幅值和梯度方向,做梯度方向直方图,统计邻域内所有像素的梯度方向,峰值就是关键点主方向,后续生成描述子时,将局部坐标系旋转到主方向,所以具备旋转不变。

为什么SIFT必须使用 Gaussian:因为SIFT的尺度空间理论是严格建立在高斯尺度空间上的,Gaussian 是唯一满足尺度空间理论公理的核。

卷积核:本质上是一个“小模板”,卷积核中的值就是权重,例如高斯滤波中心权重大,说明更相信中心像素,不同的卷积核代表不同的功能。例如:

卷积:是图像处理、信号处理、CNN、SLAM、VO 中最核心的运算之一。本质上是用一个小窗口(卷积核)在数据上滑动,并在每个位置做局部加权求和。在图像处理中,它的作用通常包括平滑、锐化、边缘检测、特征提取、模板匹配、CNN特征学习。

对应元素相乘:1×1+2×0+3×1+4×0+5×1+6×0+7×1+8×0+9×1。结果:1+3+5+7+9=25,输出像素值 25。

 – 高斯卷积:平滑降噪、模糊图像,去掉椒盐噪声(纯白亮点、纯黑黑点),预处理用。

 – Sobel 卷积:提取边缘、算梯度,找明暗变化边界。

 – 均值卷积:简单模糊,平均邻域像素。

 – 拉普拉斯卷积:边缘检测 + 锐化,突出轮廓。

 – 自定义核:浮雕、浮雕、轮廓、钝化、提亮。

高斯卷积和高斯模糊:本质上是同一件事,高斯卷积强调计算过程,高斯模糊强调最终效果,用高斯核做卷积得到高斯模糊的效果。卷积之后:图像会变平滑、边缘会变柔和、高频会被削弱,因此视觉效果就是“模糊”。

欧式距离:由于描述子是 128 维的浮点数向量,且已经过归一化(模长为 1),评估两个描述子是否相似,最直接的方法就是计算它们在 128 维空间中的欧氏距离(Euclidean Distance)。

距离越小:意味着这两个 128 维的“特征罗盘”形状越接近,局部纹理越相似。

计算使每维需要做减法、乘法、累加。

计算实现:在实际工程中,图 A 往往有数千个点,图 B 也有数千个点。如果用暴力匹配(Brute-Force),需要计算几百万次 128 维的距离,速度较慢。因此通常会采用 k-d 树(k-dimensional tree) 或 FLANN 算法,利用空间划分类的数据结构来极大地加速这个寻找过程。

SIFT 慢的原因:1. Gaussian Scale Space 中大量的高斯卷积的计算。2.DoG 极值检测,需要做多尺度卷积。3.128维描述子计算量大。

(6)其它

创建SIFT特征检测器与描述子提取器。
Ptr<SIFT> cv::SIFT::create(
int nfeatures = 0, // 保留最大关键点数目,0表示不限制
int nOctaveLayers = 3, // 尺度空间每组层数
double contrastThreshold = 0.04, // 对比度阈值,过滤低对比度弱特征
double edgeThreshold = 10, // 边缘阈值,剔除边缘不稳定关键点
double sigma = 1.6 // 初始高斯卷积核sigma,构建尺度空间
);
图像金字塔检构建、关键点检测、方向分配、描述子计算等关键步骤都封装在函数 detectAndCompute 中

1.2 SURF (Speeded Up Robust Features)

快速鲁棒性特征,SIFT 的加速版,它使用积分图和方框滤波近似 Gaussian 二阶导数,并基于 Hessian 矩阵进行关键点检测,将算法速度提升了 3 到 5 倍,在常规场景下,SURF 的匹配准确率与重复率比 SIFT 低约 3%~4%;在极端光照(±100 亮度偏移)与强模糊(σ>3)场景下,性能差距扩大至 7%~8%。同样是浮点型描述子。

SURF 本质上是一种基于 Hessian determinant 的 blob detector。当局部区域在多个方向上都明显不同于周围区域,Hessian 行列式会取得较大值,因此能够有效检测 blob-like 结构。

(1)优缺点

优点:1.速度快。2.具有尺度不变性,使用多尺度黑塞矩阵检测极值点,不断放大方框滤波尺度构建尺度空间。3.旋转不变性,会先统计关键点主方向,再将描述子坐标系旋转对齐到该方向。4.对光照有一定鲁棒性,SURF描述子本质上统计的是局部灰度变化,并且最终L2归一化也进一步减弱了亮度变化影响。5.对 Blob-like 结构检测能力较强,SURF 基于 Hessian Matrix 行列式进行特征检测。5.匹配效率高,除欧式距离与 Ratio Test 外,还利用 Laplacian Sign(拉普拉斯符号)对特征点进行预筛选。

缺点:1.对强视角变化(Affine / Perspective)鲁棒性有限。2.对光照剧烈变化与非线性曝光变化仍敏感。3.对动态模糊与低纹理区域表现一般。

(2)相关概念

三类二维曲率结构的导数特征:

1.边缘:一阶梯度强,一个方向变化剧烈,另一方向几乎不变。

2.角点:两个方向梯度都大,但曲率不一致。

3.斑点 (亮斑 / 暗斑 / 圆形块):x、y 两个方向灰度变化趋势、弯曲程度高度一致。

Box Filter(方框滤波器):均值滤波,是一种最简单的线性平滑滤波器。假设你取图像中某个像素,然后看它周围一个小窗口(例如 3×3),把窗口里的所有像素全部加起来、求平均,最后用这个平均值替换中心像素,因此会让图像整体变得更加平滑,这就是 Box Filter。从数学角度看,Box Filter 本质上是一种卷积(Convolution)操作:

Box Filter 会把局部区域“平均化”,从而削弱像素之间的剧烈变化。从图像处理角度来说,Box Filter 本质上属于一种低通滤波器(Low-pass Filter)。因为图像中的边缘、纹理、噪声通常对应高频信息,而大面积平滑区域对应低频信息,所以 Box Filter 会抑制高频、保留低频。因此它能够起到一定的去噪和平滑作用,但同时也会让边缘变模糊。和高斯滤波(Gaussian Filter)相比,Box Filter 最大的特点是“所有像素权重完全一样”。例如,在 3×3 Box Filter 中,每个像素权重都是 1/9。而高斯滤波则会让中心像素权重更大、边缘像素权重更小,因此高斯滤波通常会得到更自然的平滑效果。

SURF 里的 Box Filter:是差分滤波器,用来检测灰度变化,本质是区域之间做差,例如 Dxx​= 左区域和−2×中区域和+右区域和。下图分别是 Dxx、Dyy、Dxy 滤波器的示意结构:

非极大值抑制(Non-Maximum Suppression,NMS):只保留局部最大值,其余全部删掉,目的是避免一个区域检测出一大片重复点。

三维二阶泰勒展开:NMS找到的极值点只是离散像素格点(x=20,y=15,s=4),但真实极值可能其实在(20.37,15.62,4.21),三维二阶泰勒展开是在这个格子附近拟合一个连续曲面,然后计算真正山峰顶点。

尺度归一化:以特征点自己的尺度为基准,重新缩放邻域范围。1.先确定特征点自身尺度 σ 。2.以特征点为中心,按自身尺度划定邻域。3.把不同尺度的邻域区域,统一映射到固定标准尺寸。4.再统计梯度 / 构建特征向量,最终输出的描述子不受原始目标大小影响。

L2 归一化:不同图像整体亮度可能不同,但是本质结构相同。经过下面的计算,整个向量长度变成了 1,假设整体亮度扩大10倍,描述子是原来的10被,L2 norm 也扩大10倍,归一化后描述子相同。

Haar Wavelet Response(小波响应):用 2×2 方框滤波,算水平差分 dx、垂直差分 dy。

水平 Haar 响应 dx(左右差):dx = 右半区域灰度和 − 左半区域灰度和

[-1 +1]

[-1 +1]

垂直 Haar 响应 dy(上下差):dy = 下半区域灰度和 − 上半区域灰度和

[-1 -1]

[+1 +1]

(3)关键点检测原理

1.黑塞矩阵:SURF 不像 SIFT 那样通过 Gaussian 图像差分(DoG)检测尺度空间极值,而是直接基于 Hessian Matrix 行列式进行多尺度特征检测。对于图像中的点 X=(x,y),在尺度 σ 下的 Hessian 矩阵 H(X, σ) 定义为:

平坦区域,灰度几乎不变,那么Ixx​≈0、Iyy​≈0,det(H)≈0,不会检测为特征点;边缘区域,例如只有水平方向变化,那么一个方向导数大,另一个方向小,因此 Hessian 行列式较小,不容易形成稳定 blob 响应;斑点/角点,多个方向变化都大,因此 det(H) 很大。

2.方框滤波器(Box Filter)与积分图:SIFT 在计算高斯卷积时,随着尺度 σ 增大,高斯核变大,计算量随核尺寸平方增长。SURF 做了一个简化:使用矩形块组成的 Box Filter 去近似 Gaussian 二阶导数核的响应形状。

 – 积分图(Integral Image)加速:Box Filter 由若干矩形区域组成,且每个矩形内部权重恒定。,积分图中的某点表示从左上角到(x,y)的所有像素和,计算一个区域的像素和都只需要进行 4 次内存寻址和 3 次加减法。计算耗时变成了 O(1)。

 – 独特的金字塔构建:SIFT 是通过不断缩小图像(降采样)来构建金字塔;而 SURF 的图像尺寸保持不变,而是直接成倍数放大方框滤波器的尺寸。由于 O(1) 特性的存在,理论复杂度与滤波器尺寸无关。

3.极值点初选与亚像素精确定位:与 SIFT 类似,SURF 对黑塞矩阵取得的局部极值在 3*3*3 的三维立方体邻域(当前点及前后两个方框滤波器尺寸尺度内)进行 26 个点的非极大值抑制,选出候选点,再通过三维二阶泰勒展开进行亚像素级别的坐标和尺度精确定位。

为什么这种近似仍然有效:SURF并不需要精确导数值,它真正关心的是极值位置(哪里响应最大、哪里是斑点、哪里是稳定结构),只要具有类似的响应趋势,那么检测结果就差不多。SURF真正厉害的地方是这个近似让积分图成为可能。

为什么高斯二阶导数核不能使用积分图:因为高斯二阶导数核:0.1 0.3 -0.8 -0.8 0.3 0.1(曲率变化),是类似这种连续的变化,每个位置的权重不一样。

如何实现尺度不变:不频繁降采样,而是增大Box FiLter尺寸,因为积分图下计算矩形卷积复杂度为O(1)。

(4)描述子计算原理

SURF描述子:统计关键点邻域内灰度变化的方向分布,保存局部梯度结构。SIFT 中使用的是梯度,SURF想更快,使用的是 Haar 小波响应(本质是在旋转对齐后的局部区域中,统计 Haar 小波响应的空间分布)。

1.计算主方向:以关键点为中心,半径为 6σ (关键点尺度)的圆形区域内,对采样点,取它周围 2×2 小区域,用积分图快速算,水平差分 dx,垂直差分 dy,得到采样点(dx, dy),也就是该点的 Haar 小波响应。用一个大小为60度的扇形窗口在圆内旋转(连续滑动窗口)。将扇形窗口内的所有 Haar 小波响应的水平分量和垂直分量分别累加,形成一个总向量。向量模长最大的方向,就被指定为该关键点的主方向。

2. 构建 64 维特征向量:确定主方向后,为了保证旋转不变性,将坐标轴旋转对齐到主方向。以关键点为中心,采集一个 20σ * 20σ 的正方形邻域,将这个大正方形划分为 4 * 4 = 16 个子块。在每一个子块内部统计(统计时会根据距离关键点中心距离对 Haar response 施加高斯权重,增强中心区域的权重) Haar Wavelet 的水平响应和 ∑dx、垂直响应和 ∑dy、水平绝对值和∑∣dx∣、垂直绝对值和 ∑∣dy∣(普通和 反映局部灰度变化的主趋势,绝对值和 反映局部变化强度)。一共 16 个子块,每个子块贡献 4 个浮点数,最终得到一个 64 维浮点向量。最后通过 L2 归一化获得对尺度与光照更鲁棒的特征向量。

(5)描述子匹配原理

在匹配阶段,SURF 除了保留了 SIFT 的欧氏距离计算和 Lowe's 最近邻距离比值法(Ratio Test)之外,还利用 Hessian 矩阵的数学特性,引入拉普拉斯算子正负号(Sign of Laplacian)作为额外判别信息,用于增强特征区分性。。

核心加速:基于特征点正负号的提前分流。

在计算 Hessian 矩阵时,矩阵的迹(Trace,即对角线元素之和 Lxx + Lyy)实际上就是拉普拉斯算子的值。这个值的正负号有着非常明确的物理图形几何意义:

正号(+):代表该特征点是一个黑暗背景下的明亮斑点。虽然由于 SURF 方框滤波核“中间为负、两边为正”的设计,直接卷积会得到负值,但算法会将其校正(取反)为正,以保持与标准拉普拉斯算子响应一致。

负号(-):代表该特征点是一个明亮背景下的黑暗斑点。

匹配时的巨大优势:在两张图的特征点进行高维空间距离比对之前,算法会先看一眼两个点的拉普拉斯正负号。如果图 A 的点是(+),图 B 的点是(-),说明一个是白点一个是黑点。算法会直接判定它们不匹配。只有当正负号完全一致时,算法才会去计算 64 维向量的距离。

(6)其它

创建SURF特征检测器与描述子提取器。
Ptr<SURF> cv::xfeatures2d::SURF::create(
double hessianThreshold = 100, // Hessian阈值,阈值越大检测特征越少
int nOctaves = 4, // 金字塔尺度组数
int nOctaveLayers = 3, // 每组内尺度层数
bool extended = false, // 是否启用128维描述子,默认64维
bool upright = false // 是否关闭旋转不变,只保持竖直方向
);

特性 / 步骤 SIFT 算法 SURF 算法(优化点)
尺度空间构建 图像不断降采样,核不变。计算慢。 图像尺寸不动,方框滤波器成倍放大。通过积分图实现 O(1) 恒定速度。
极值点检测 高斯差分金字塔(DoG) Hessian 矩阵行列式(Box Filter 近似)
主方向分配 36 柱梯度方向直方图(最强峰值) 60度 扇形窗口旋转累加 Haar 小波响应
描述子维度 128 维(16 块 * 8 方向直方图) 64 维(16 块 * 4 个 Haar 统计量),内存减半。
匹配提速器 无(直接进 k-d 树或暴力计算) 拉普拉斯算子正负号(明暗斑点分流,过滤一半无效匹配)
性能综合评价 精度最高,对仿射、尺度变化最准,但太慢。 速度极快(快 3-5 倍),精度直逼 SIFT。
1.3 ORB (Oriented FAST and Rotated BRIEF)

定向FAST和旋转BRIEF,用 FAST 角点检测 + 灰度质心法赋予角点方向,再用旋转版 BRIEF 生成二进制描述子。

(1)优缺点

优点:1. 计算速度极快,基于 FAST 角点检测与 BRIEF 二进制描述子。2. 使用二进制描述子,内存占用小,汉明距离匹配效率高。3. 通过方向估计与 rBRIEF,具有较好的旋转不变性。4. 采用图像金字塔构建尺度空间,具备一定尺度不变性。5. 对光照变化、噪声及部分遮挡具有较强鲁棒性。

缺点:1. 配准精度通常低于 SIFT、SURF 等浮点描述子方法。2. 尺度不变性有限,在大尺度缩放下稳定性下降。3. 对强透视畸变、剧烈视角变化的适应能力较弱。4. 二进制描述子判别能力有限,在重复纹理区域容易误匹配。5. 在弱纹理或严重模糊场景中,特征点稳定性较差。

在以平移、旋转为主,尺度变化较小的场景中效果较好。

(2)相关概念

FAST(Features From Accelerated Segment Test):判断某个像素是否为角点。核心思想是比较中心像素与圆周邻域像素的灰度差异,若连续若干像素明显更亮或明显更暗,则认为该点是角点。无梯度、无复杂计算,检测速度远超 SIFT、SURF。

灰度质心法:根据角点邻域内的灰度分布计算“亮度质心”。若某一方向亮度更集中则质心会偏向该方向。于是,从角点中心指向亮度质心的方向作为该关键点的主方向。

BRIEF(Binary Robust Independent Elementary Features):ORB 使用的二进制描述子。核心思想是比较关键点邻域内像素对的灰度大小关系。不具有旋转不变性。Rotated BRIEF是ORB 对 BRIEF 的改进。根据关键点主方向对 BRIEF 的采样模式进行同步旋转。

(3)ORB 特征提取与匹配流程

1.构建图像金字塔。2.FASR快速检测角点,利用 Harris Socre 筛选稳定关键点。3.灰度质心法计算主方向。4.构建 BRIEF Binary Descriptor。5.根据主方向旋转BRIEF。

(4)关键点检测原理

1.Oriented FAST 角点检测:核心思想是角点附近会出现剧烈灰度变化,看中心点离散圆周上是否存在连续明显更亮/更暗的像素段。对于图像中的待测点 p,算法以其为中心构造一个半径为 3 像素的离散圆周,并在该圆周上选取 16 个采样点进行灰度比较。

 – 核心判别准则: 设定一个亮度阈值 t。如果圆周上存在连续 N 个像素点(ORB 中 N=9,即 FAST-9),它们的值都大于I_P + t (极亮点,I_P表示中心待测点 P 的灰度值)或都小于I_P - t

(极暗点),则 P 被初步判定为特征点。为了避免对每个像素都测试 16 个点。在经典 FAST 中,算法通常会优先检查圆周上的少量关键位置(如 1、5、9、13 号点)。如果其中至少 3 个点没有明显亮于或暗于中心像素 P​,则当前像素不可能成为角点,从而提前终止后续检测。

 – ID3 决策树分流(ID3 Decision Tree): 在FAST基础上,FAST-ER 将该“测试顺序选择问题”建模为一个分类问题,并使用类似 ID3 决策树学习方法,在训练集中优化每个像素位置的测试顺序。因此,大多数非角点仅需 2~3 次像素强度比较即可被快速排除,从而显著降低实际运行时间。

2.图像金字塔坐标反向投影:当第一层检测到FAST关键点后,算法不需要去和它的上层或下层做任何数学比对,而是直接在当​​前层的坐标中处理特征点$(x_{down}, y_{down})$,乘以当前层的缩放因子的倒数,直接反向投影(Mapping)回原始图像 $L_0$ 的下分辨率。FAST对像素对点的判别结果在底层只有硬性的1(是)或0(不是)。

3.非极大值抑制与 Harris 响应得分筛选: FAST 在真实图像中容易在边缘连续区域附近产生大量密集候选点。为避免同一局部区域出现过多重复特征,ORB 首先对 FAST 候选点执行 3×3 邻域非极大值抑制( NMS),仅保留局部响应值最大的点,从而减少冗余角点。随后,由于 FAST 本质上主要基于像素强度比较,其角点响应稳定性相对有限,因此 ORB 又进一步引入 Harris Corner Response 对 FAST 角点进行重新评分。Harris 响应基于图像灰度变化矩阵(Structure Tensor)的行列式与迹构建,能够更稳定地衡量局部区域在多个方向上的灰度变化强度。最终,ORB 会按照 Harris Score 对所有候选点进行排序,并仅保留响应值最大的前 M 个关键点,从而在保持高速检测能力的同时,进一步剔除大量不稳定边缘响应点,提高特征点的稳定性与重复检测率。

Harris Corner Response 原理:让一个二维高斯窗口(中间权重大,边缘小) w(x,y) 沿任意方向平移一个微小位移 (u,v),并计算平移前后窗口内图像灰度差的平方和。这个函数被称为自相关函数 E(u,v):

,I(x,y)表示像素强度;w(x,y)是高斯权重窗口,中心区域权重大;(u,v),窗口移动量。用来衡量窗口移动之后灰度变化是否明显。直接计算 极其耗时,因为每个像素、每个移动方向都要重新做图像叠加。为了实现高效计算,Harris 引入了一阶泰勒公式展开得到

。这里中间被括号包围的 2*2 矩阵,就是结构张量(Structure Tensor),通常记为 M:

,矩阵 M 浓缩了窗口区域内所有的梯度分布信息。它是一个对称矩阵,其两个特征值 $\\lambda_1$ 和 $\\lambda_2$  完美对应了局部窗口内灰度变化最快和灰度变化最慢这两个正交方向上的变化率。

平坦区域: 无论向哪个方向移动 (u,v),灰度几乎不变,E(u,v) \\approx 0

边缘区域: 顺着边缘方向移动,灰度变化小;垂直于边缘方向移动,灰度变化极大。

角点区域: 无论向哪个方向移动,灰度都会发生剧烈变化,E(u,v) 在所有方向上都很大。

特征值状态 物理图形几何意义 解释

\\lambda_1 \\approx 0\\lambda_2 \\approx 0

平坦区域R \\approx 0 (Flat)

两个正交方向上灰度均无明显变化。

\\lambda_1 \\gg 0\\lambda_2 \\gg 0

边缘区域 (Edge) 仅在垂直于边缘的方向上有强烈的梯度,顺着边缘方向则没有变化。

\\lambda_1 \\gg 0\\lambda_2 \\gg 0

角点区域 (Corner) 两个正交方向的变化率都极大,说明存在交汇结构或斑点。

虽然特征值  $\\lambda_1$  和 $\\lambda_2$ 的物理意义很完美,但在工程实现中,直接对图像中的每一个像素矩阵去求解特征方程(求平方根)是非常昂贵的。Harris 巧妙地利用了矩阵理论中的两个经典定理,绕开了显式特征值求解:

矩阵的行列式等于其特征值的乘积:\\det(M) = \\lambda_1 \\lambda_2 = AB - C^2

矩阵的迹等于其特征值的和:\\text{tr}(M) = \\lambda_1 + \\lambda_2 = A + B

利用这两个性质,Harris 构建了角点响应得分 R(Harris Corner Response Score):

为什么这个公式能精准筛选角点?我们把特征值代回公式来看它的动态响应:

当为平坦区域时: $\\lambda_1$$\\lambda_2$ 都极小,det(M) 和 text{tr}(M) 均趋近于 0,因此 R \\approx 0

当为边缘区域时: 假设 \\lambda_1 \\gg 0 且 \\lambda_2 \\gg 0。此时乘积项\\det(M) \\approx 0,而加和项的平方(\\text{tr}(M))^2 \\approx \\lambda_1^2 很大。这会导致公式右边远大于左边,从而计算出 R < 0(显著的负值)。

当为角点区域时: $\\lambda_1$$\\lambda_2$ 都很大且量级接近。此时乘积项 \\lambda_1 \\lambda_2 占据主导地位,其增长速度远超减数项(因为 k 很小,通常取值在 0.04 ~ 0.06 之间),从而使公式输出一个R \\gg 0(极大的正值)。

(5)灰度质心法确定主方向

核心思想是局部亮度分布通常具有方向性,例如左暗右亮、某个象限亮度集中,都会导致灰度质心向特定方向偏移。当图像发生旋转时,局部灰度分布也会整体同步旋转,灰度质心相对于关键点中心的位置也会同步旋转。

1.以关键点为中心,在一个半径为 R 的圆形邻域内,对所有像素灰度进行统计。ORB 主要使用:零阶矩(0-th Moment)m00​=x,y∑​I(x,y) 表示该局部区域内的总灰度能量。一阶矩(1-st Moments)m10​=x,y∑​x⋅I(x,y),m10​=x,y∑​y⋅I(x,y),分别表示灰度在 x、y 方向上的“重心偏移”。I(x,y) 表示像素灰度值,(x,y) 表示相对于关键点中心的坐标。

2.计算灰度质心(Intensity Centroid):灰度质心 C = \\left(m_{00}/\\ m_{10},\\ m_{00}/\\ m_{01}\\right),这里的C=(Cx​,Cy​),表示局部亮度分布的中心位置,如果局部区域亮度分布完全对称,则质心会接近关键点中心;如果某个方向更亮,则质心会向该方向偏移。

3.计算关键点主方向:设关键点几何中心为:O=(0,0),则从关键点中心 O 指向灰度质心 C 的向量 OC=(m10,m01),即可表示该局部区域的主方向。最终方向角定义为 θ=atan2(m01, m10),其中 atan2(y,x) 能够正确区分四个象限,因此可以得到:0∘∼360∘ 范围内的完整方向角。

(6)rBRIEF 描述子计算原理

只做像素强度比较,不需要梯度直方图、高斯加权统计、浮点特征向量。

1..以关键点为中心,取一个局部领域,例如 31 * 31 patch,,根据灰度质心法获得的关键点主方向,对该区域内的对BRIEF的采样点(相对于关键点中心的局部采样坐标)进行旋转(不是整个图像旋转,而是采样模式坐标旋转),Sθ​=Rθ​S,其中R_\\theta = \\left[\\begin{matrix} \\cos\\theta & -\\sin\\theta \\\\ \\sin\\theta & \\cos\\theta \\end{matrix}\\right]

2.对筛选出来的该区域的像素点对 (p, q) 比较灰度,如果I(p​)<I(q​),则该输出位记为 1,反之记为 0。通常生成256-bit二进制描述子。

在离线阶段,ORB大量训练图像patch统计候选像素对,通过以下准则筛选最优测试集合:

 – 单对点高方差:该像素对在不同图像patch中应具有接近50%的0/1分布,使其具备最大信息熵;

 – 点对之间低相关:新加入的像素对应与已有测试对保持低相关性,以避免冗余信息,提高描述子的判别能力。\\rho = \\frac{\\mathrm{Cov}(X,Y)}{D(X)\\,D(Y)},两个点对灰度变化趋势越不一样,相关性越低,ρ≈0时低相关,信息独立,互补区分特征。

在实际计算中,仅需在关键点邻域patch上执行这些预先确定的像素对比较操作,即可生成rBRIEF二进制描述子。

(7)描述子匹配原理

1.汉明距离计算描述子相似度

汉明距离 d(x,y)=popcount(x⊕y),popcount 统计二进制中1的个数,d(x,y)就是两个二进制有多少个bit位不一致,匹配两个关键点,距离越小越相似。仅异或和位运算,欧式距离需要浮点乘加运算。

2.筛选与去误匹配:

 – 汉明距离阈值初筛选快速剔除明显不相似的匹配,如果 d(x, y) > T,则直接认为不匹配(T 是经验阈值(常见约 30~50,依任务调整)。

 – 最近邻比率测试(Lowe Ratio Test):对每个特征点找最近邻匹配 d1、次近邻匹配 d2,d1 / d2 < ratio(通常取 0.7 ~ 0.8),过滤“模糊匹配”,减少重复纹理导致的一对多错误匹配。

 – 交叉验证(Cross Check):如果 A 中点 Pa 匹配到 B 中点 Pb,则必须满足 Pb 在 B 中最近邻也必须匹配回 Pa。

为什么使用最近邻比率测试:最近邻可能不可靠。好的匹配唯一性强 d1 << d2,说明最像的是唯一的,次近的明显差很多。坏匹配 d1 ≈ d2 说明多个候选都差不多像,当前匹配没有唯一性。

(8)其它

采样模式:一组预先定义的像素对位置集合。

采样模式坐标系旋转:以特征关键点为坐标原点,根据关键点主方向 θ,用旋转矩阵把原始采样点旋转对齐。

采样模式缩放:根据尺度 σ,对采样点半径进行缩放

创建ORB特征检测器与描述子提取器
Ptr<ORB> cv::ORB::create(
int nfeatures = 500, // 期望提取最大关键点数量
float scaleFactor = 1.2f, // 金字塔尺度缩放因子
int nlevels = 8, // 金字塔尺度总层数
int edgeThreshold = 31, // 边缘留白阈值,边缘区域不检测特征
int firstLevel = 0, // 起始金字塔层级
int WTA_K = 2, // 生成描述子每对点集数量
int scoreType = ORB::HARRIS_SCORE,// 角点评分方式:HARRIS_SCORE / FAST_SCORE
int patchSize = 31, // 描述子采样邻域窗口大小
int fastThreshold = 20 // FAST角点检测阈值
);

1.4 BRISK(Binary Robust Invariant Scalable Keypoints)

二进制鲁棒不变可扩展关键点,二进制局部特征算法,目标是保持 ORB 的高速 + 增强尺度不变性,ORB 在每一层尺度图像上运行 FAST 角点检测;BRIS K比 ORB 多了一步尺度空间极值检测,也就是不仅看当前层是不是角点,还会比较上下尺度层是否也是局部极值。因此BRISK 的尺度鲁棒性明显强于 ORB。

(1)优缺点

优点:

1.尺度 / 旋转不变:多尺度金字塔 + 主方向归一化。

2.二进制描述子:512 比特(64 字节),匹配用汉明距离,极快。

3.速度快:AGAST(FAST 的工程增强版本) + 轻量采样,快于 SIFT/SURF,略慢于 ORB。

4.抗模糊强:同心圆高斯采样,对模糊 / 噪声鲁棒。

缺点:

1.重复纹理易误匹配(同所有局部特征)。

2.视角形变弱于 SIFT/SuperPoint。

(2)相关概念

FAST 与 AGAST(Adaptive and Generic Accelerated Segment Test) 核心区别:

1. 检测判定逻辑

FAST9-16:连续 9 个圆周像素灰度差超阈值即判定角点,固定顺序分段检测。

AGAST: 离线学习最优判断分支,自适应 + 通用二叉决策树。提前用海量图像训练,算出最快筛除非角点的像素比对顺序,固化判定分支,得到决策树,运行时根据当前像素灰度差异,自动走最优分支路径,每次二分类判断,不断缩小范围。

2.尺度处理能力

FAST:仅单图像层检测,尺度金字塔分层独立判断,不跨尺度极值对比。

AGAST:原生适配尺度空间,支持同层 + 上下尺度联合极值筛选,BRISK 用它做多尺度关键点。

3.抗噪与稳定性

FAST:噪声易误检出角点,重复特征多。

AGAST:优化分段测试规则,抑制伪角点,重复检测率更低。

AGAST corner score:核心思想是这个角点有多强,圆周上有连续N个点亮于或暗于中心超过阈值,如果阈值很大条件仍成立,说明这是很强的角点。AGAST socre 也是BRISK响应值的来源,FAST/AGAST 最基础版本只是满足条件就是角点、不满足就是非角点的二值判断,但BRISK 后面还要做非极大值抑制、跨尺度比较、亚像素定位、亚尺度定位,因此必须构造连续的 response。

AGAST 响应图:每个像素都有一个 corner score,于是整张图就得到 response map R(x,y),在 BRISK 里由于有尺度空间,实际上是 R(x,y,σ)。

亚尺度优化用的响应值:BRISK 在尺度方向取:R(x,y,σ-1)、R(x,y,σ)、R(x,y,σ+1),即相同空间位置在不同尺度层的AGAST score,然后拟合一元二次曲线估计真正的尺度。

图像灰度 I(x,y) 经过 AGAST 得到角点响应图 R(x,y),再扩展到尺度空间R(x,y,σ),BRISK 再基于这些响应值进行局部极值拟合与连续尺度插值。

(3)算法全流程

图像 → 图像金字塔(多尺度) → AGAST 检测角点 → 尺度空间极值筛选 → 方向估计 → BRISK 二进制描述子 → Hamming 匹配

(4)关键点检测

1.图像金字塔:希望让尺度采样更密集,减少离散尺度采样误差,从而提高尺度空间极值定位精度。包含两个交错的组别。

 – 常规层:由原始图像开始,连续进行 1/2 缩放(降采样)得到的尺度层。

 – 夹层:插入在相邻常规层之间。第一夹层由原图缩小至原来的 2/3(约 1/1.5)得到,其余夹层再继续进行 1/2 缩放生成。

2. AGAST 关键点检测

AGAST本质上属于FAST类角点检测器,其核心思想仍然是若圆周上存在连续若干像素明显亮于或暗于中心像素,则该点可能为角点。使用自适应决策树(Adaptive Decision Tree)减少无效比较次数。不同于固定顺序检测16个圆周点,AGAST通过统计学习得到更优的检测顺序,算法会优先检测区分能力更强、信息量更大的采样点,从而尽可能提前判定“是否为角点”。

 – 尺度空间极值检测:一个关键点需要在当前图像层局部邻域和上下尺度层中保持局部极值,才能被保留。

 – 亚像素与亚尺度精细化:FAST / AGAST 初始检测得到的只是离散像素级结果,而真实极值通常不刚好整数落在像素格点上,因此需要拟合连续曲面估计真正极值位置。BRISK会优化空间位置 (x,y) 得到亚像素定位,优化尺度 σ 得到亚尺度定位。

   – 亚像素定位:算法提取该关键点周围 3×3 邻域内的 AGAST 响应值,在空间邻域内对这些离散响应进行局部二次曲面拟合(Quadratic Surface Fitting),随后通过求解该连续二次曲面的极值位置,获得更加精确的亚像素级关键点坐标。

   – 亚尺度定位:对于某个候选关键点,算法会取当前尺度层的响应值、上下相邻尺度层的响应值。由于图像金字塔中的尺度层本质上是离散采样,而真实最佳尺度通常位于两个尺度层之间,因此 BRISK 会利用这三个响应值,在尺度轴上拟合一个一元二次函数(局部抛物线)。通过求取该抛物线的极值位置,算法可以估计出连续尺度空间中的真实极值尺度 σ,而不是仅停留在离散金字塔层级上。

(5)描述子计算原理

1.同心圆采样网络

BRISK 在关键点周围构建多个离散同心圆环,每个圆环上均匀分布若干采样点,整个采样网络总共包含 N=60个采样点(包括中心点)。这些采样点在空间中形成旋转对称的圆形拓扑结构,因此天然适合后续旋转对齐操作。

与 BRIEF 对整个 patch 使用统一平滑不同,BRISK 为每一个采样点单独绑定局部高斯核。对于采样点 pi,其对应高斯核尺度:σi ∝ di,其中 di 为采样点到关键点中心的距离;距离越远,高斯核越大。因此靠近中心的采样点保留更多高频纹理细节;远离中心的采样点进行更强平滑,从而抑制噪声与局部扰动。

2.点对构建

对于60个采样点,两两组合可形成 60×59/2=1770 个采样点对(pi,pj),BRISK 根据点对之间的欧氏距离 d(pi,pj) 将这些点对划分为两类:

短距离点对:若 d(pi​,pj​)<δmax(设定的最大​距离阈值),则属于短距离点对集合 S,短距离点对主要反映局部纹理与细粒度灰度变化,因此用于后续二进制描述子编码。

长距离点对:若:d(pi​,pj​)>δmin (设定的最小距离阈值),则属于长距离点对集合 L,长距离点对空间跨度较大,更能反映局部区域整体灰度分布趋势,因此用于方向估计。​

3.长距离点对估计主方向

估计主方向:对于长距离点,算法计算两点的灰度差 I(pj​)−I(pi​),并结合对应空间位移方向 (pj​−pi​),构造局部方向向量 g(pi,pj),对所有长距离点对进行向量累加g = \\begin{bmatrix} g_x \\\\ g_y \\end{bmatrix} = \\sum_{(p_i,p_j) \\in \\mathcal{L}} g(p_i,p_j),该向量能够近似表示局部区域整体灰度变化趋势。最终关键点主方向定义为 \\theta = \\operatorname{atan2}(g_y,\\,g_x),该方向用于后续采样模式旋转,从而实现旋转不变性。

采样模式旋转对齐:在获得主方向 θ 后,BRISK 会对整个采样网络进行旋转:S_\\theta = R_\\theta S

,S 为原始采样点集合;Rθ 为二维旋转矩阵。注意:实际旋转的是采样坐标,而不是图像本身。

4.利用短距离点对生成二进制描述子

完成方向对齐后,BRISK 不再使用长距离点对,而是仅利用短距离点对集合 S 进行局部纹理编码。短距离点对空间距离较小,因此能够更敏感地反映局部纹理细节变化。对于每一组短距离点对执行灰度比较,
\\tau(p_i,p_j) = \\begin{cases} 1 & \\text{if } I(p_j) > I(p_i) \\\\ 0 & \\text{otherwise} \\end{cases}

,每次比较生成1个bit,通常生成 512 bit 二进制描述子,最终所有bit按固定顺序拼接形成完整描述子向量:b=(b1,b2,…,b512)。

(6)描述子匹配原理

同样是二进制描述子,与ORB的不同之处在于 BRISK 在关键点检测阶段会输出经过亚像素插值优化后的关键点位置和关键点对应的连续尺度值 σ,因此可以通过尺度比值筛选,例如σ1​,σ2,
r=\\frac{min(\\sigma1,\\sigma2)}{max(\\sigma1,\\sigma2)},如果 r>Ts​(Ts​ 为经验尺度阈值),则说明两个关键点尺度差异过大。此时算法会直接拒绝该匹配候选,而不再继续计算汉明距离,加速匹配。

(7)其它

static Ptr<BRISK> cv::BRISK::create(
int thresh = 30, // FAST 角点检测阈值
int octaves = 3, // 金字塔尺度层数
float patternScale = 1.0f // 采样模式缩放比例
);

名称类型属于哪个层级
FAST Detector 角点检测器
Harris Detector 角点检测器
DoG(SIFT前半部分) Detector 尺度空间检测器
Hessian(SURF前半部分) Detector Hessian检测器
BRIEF Descriptor 二进制描述子
Rotated BRIEF Descriptor ORB描述子
FREAK Descriptor 二进制描述子
SIFT Descriptor Descriptor 浮点描述子
SURF Descriptor Descriptor 浮点描述子

SIFT / SURF / ORB / BRISK 是:Detector + Descriptor 的组合算法

1.5 KAZE

KAZE(日语 “风”,发音 /kaze/)是 2012 年 ECCV 提出的非线性尺度空间特征。

核心:不用高斯模糊(线性)构建尺度空间,用非线性扩散建尺度空间。

(1)优缺点

优点

1. 基于非线性扩散(Nonlinear Diffusion)构建尺度空间,能够在平坦区域平滑噪声、在边缘区域保留结构信息。

2. 边缘与纹理保留能力强,细节损失明显小于传统高斯金字塔。

3. 在弱纹理、低对比度场景下,特征点稳定性通常优于 SIFT、SURF、ORB。

4. 对尺度变化、旋转、光照变化以及一定程度的形变具有较强鲁棒性。

5. 在复杂纹理与自然场景中,匹配精度较高。

 缺点

1. 非线性扩散 PDE(偏微分方程)计算量较大,速度明显慢于 ORB、SURF。

2. 参数较敏感,例如扩散系数、尺度层数、阈值等需要调节。

3. 默认描述子为浮点描述子,内存占用与匹配开销较高。

4. 实时性较差,不适合低算力嵌入式平台。

5. 工程实现复杂度高于传统高斯尺度空间方法。

传统高斯金字塔本质上会对整幅图像进行均匀平滑,高斯是均匀模糊 → 边缘区域被模糊、纹理细节逐渐消失。KAZE 希望做到在平坦区域进行强平滑,在边缘区域尽可能保留结构信息。

(2)相关概念

线性尺度空间:高斯模糊满足线性系统,即 aI1+bI2 经过高斯等于 aG(I1)+bG(I2)。问题是高斯模糊会平等模糊所有区域。

非线性尺度空间:核心思想是不同区域,不同模糊程度,边缘少模糊,平坦区域多模糊,既降噪又保留边缘,使用非线性扩散实现,典型方法有 Perona-Malik Diffusion。

扩散:扩散来自热传导方程 \\frac{\\partial t}{\\partial u}=\\nabla\\cdot(k\\nabla u),例如热量会从高温流向低温。把图像 “当成温度场” ,图像的灰度值 I(x,y),就可以类比成平面上每个点的 “温度”,相邻像素灰度差大 = 温差大,就会产生 “灰度流动” 的趋势。u(x,y,t):空间中位置 (x,y) 在时刻 t 的温度;∇u:温度梯度(哪里温差大,热量就往哪流);k:热传导系数。

线性扩散:当热传导系数 k 是常数时,方程退化为线性热传导方程:\\frac{\\partial I}{\\partial t}=\\Delta I,ΔI 拉普拉斯算子。而这个方程的解,就是高斯模糊!时间 t 对应高斯模糊的标准差 σ:时间越长(t 越大),模糊程度越高,灰度越均匀。这个过程,就是灰度从高值向低值扩散,最终抹平细节和噪声。

非线性扩散:如果让热传导系数 k 依赖于图像梯度(比如梯度大的地方,k 变小),就得到了 Perona-Malik 等非线性扩散:在边缘处(梯度大),扩散被抑制,灰度不怎么流动 ,保留边缘;在平坦区域(梯度小),扩散正常进行,平滑噪声。

非线性扩散时间(Diffusion Time):图像在非线性扩散方程中“被平滑了多久”。越大,扩散时间越长,图像被平滑得越厉害,细节越少,对应更大的尺度。

非线性扩散需要不断迭代:计算图像梯度;根据梯度更新扩散系数 c(x,y,t);更新像素值;再进入下一轮迭代。如果直接使用普通显式数值求解(Explicit Scheme):时间步长必须很小;迭代次数很多;稳定性较差;计算量会非常大。

(3)完整流程

1.构建非线性尺度空间:不降采样,只通过扩散变粗,分辨率全程不变,特征定位更准、小结构保留更好。用AOS解扩散方程,生成0-N层,越往上越粗。

2.检测特征点(Hessian)极值。

3.主方向分配(旋转不变):关键点邻域算梯度方向直方图,取主峰为主方向。

4.生成描述子(浮点):分4*4子块,每块8方向,128维向量,归一化(使得光照不变)。

(4)关键点检测原理

1.非线性尺度空间: KAZE 引入基于偏微分方程(PDE)的非线性扩散模型:\\frac{\\partial I_L}{\\partial t} = \\text{div}\\left( c(x,y,t) \\nabla I_L \\right),c(x,y,t) 为扩散系数,会根据局部梯度动态变化:边缘区域梯度大 → 扩散减弱;平坦区域梯度小 → 扩散增强。因此 KAZE 的尺度空间能够在抑制噪声的同时,更好保留目标边缘与纹理结构。非线性扩散本身需要不断迭代求解偏微分方程(每一步都要算梯度、扩散系数、更新像素),如果直接数值求解,计算量会非常大,使用 AOS 进行快速数值求解。。

2.AOS(Additive Operator Splitting,加性算子分裂):属于隐式 / 半隐式数值方法,
\\frac{L^{t+1} - L^t}{\\tau} = \\sum_{d=1}^{D} A_d L^{t+1},更新 L_{t+1} 时,右边也用L_{t+1}(未知量),所以要解方程。L_{t+1}同时出现在左右两边 → 隐式。

3.Hessian 响应关键点、尺度空间极值检测。

如何保证尺度不变性:非线性扩散\\frac{\\partial I_L}{\\partial t} = \\text{div}\\left( c(x,y,t) \\nabla I_L \\right),这里的 t 就是扩散时间,随着扩散时间 t 的增大,图像会越来越平滑(小结构逐渐消失),因此不同扩散时间 = 不同观察尺度。KAZE在多个尺度上检测关键点,即算法会在 t1,t2,t3… 多个扩散层中寻找尺度空间极值,如果某结构在某个扩散尺度下响应最强,那么该尺度就被记录为特征点尺度σ。

4.亚像素与亚尺度精细化:

 – KAZE 会在空间邻域内对 Hessian 响应进行局部二次曲面拟合(Quadratic Surface Fitting),通过求取连续曲面的极值位置,实现关键点的亚像素级定位。

 – KAZE 同时会在尺度轴上对相邻尺度层响应进行插值拟合,从而估计连续尺度空间中的真实极值尺度 σ,提高尺度估计稳定性。

(5)主方向估计原理

方向估计方法与 SURF 较为接近,主要基于局部梯度统计。在关键点周围邻域内,计算像素 x,y 方向梯度并使用高斯函数加权。使用滑动角度窗口,统计窗口内梯度向量总和,梯度向量和最大的方向被定义为关键点主方向。

(6)描述子计算原理

KAZE 默认使用基于 SURF 改进的浮点描述子,其核心思想是:在关键点邻域统计局部梯度分布,并编码局部结构信息。

1.方向对齐邻域:在获得关键点主方向之后,KAZE 会以关键点为中心,将圆形邻域整体依照求解出的主方向做旋转变换。

2.子区域划分:将局部邻域划分为多个子区域,例如4*4网格。每个子区域分别统计局部梯度信息。

3.梯度统计编码:对于每个子区域,统计:∑dx、∑dy、∑∣dx∣、∑∣dy∣,这些统计量能够反映局部边缘方向、灰度变化强度、纹理结构分布。

4.浮点描述子生成:将所有子区域的四维统计量依次拼接组合,形成固定维度浮点向量。16 个子区域可生成64 维浮点描述子,细分采样可扩展为 128 维浮点描述子。

1.6 AKAZE(Accelerated KAZE)

加速版 KAZE 特征,其核心目标是在保留 KAZE 非线性尺度空间优势的同时,大幅提高实时性能。保留非线性扩散尺度空间,但采用更高效的局部二值描述子。

KAZE 的痛点:1.用 AOS 隐式求解 非线性扩散,迭代重、计算极慢。2.描述子是浮点向量,匹配慢。3.无法实时用于视频 / SLAM。

AKAZE 就是针对性把这两个瓶颈换掉:1.换扩散求解方式:AOS → FED。2.换描述子:浮点 → 二进制 M-LDB

(1)完整流程

1.FED 构建非线性尺度空间:不高斯模糊,边缘保护式平滑,不降采样。

2.Hessian 矩阵检测关键点:和 KAZE 一样,尺度空间极值检测。

3.计算特征主方向:保证旋转不变。

4.生成 MLDB 二进制描述子:最终得到二进制特征向量。

(2)关键点检测原理

1.构建非线性尺度空间。

2.Fast Explicit Diffusion(FED)加速扩散:核心目标是减少扩散迭代次数,同时保持稳定性。L_{t+1} = L_t + \\tau A(L_t),τ 是时间步长,A(⋅) 差分近似的拉普拉斯,右边全是L_t (已知)→ 显式,,不需要解方程,直接显式更新。普通方法时间步长每步都很小,FED 使用一组特殊设计的变化步长,允许某些步骤跨度扩散。

3. Hessian 响应关键点检测、尺度空间极值检测、亚像素与亚尺度定位。

4.主方向估计:AKAZE 的方向估计与 KAZE 基本一致。算法在关键点邻域内统计局部梯度方向,并寻找主导方向 θ,随后采样模式会围绕该方向进行旋转对齐。

(3)描述子计算原理

MLDB(Modified Local Difference Binary) 二进制描述子,目标是在保持 KAZE 鲁棒性的同时,大幅提升匹配速度。

1.旋转对齐邻域:根据关键点方向对局部邻域进行旋转对齐。

2.网格区域划分:将局部邻域划分为多个子区域。普通的二进制描述子(如BRIEF、ORB)只对比像素点的灰度值。而M-LDB对每个子网格内部的所有像素进行统计,取出三个通道的信息:单元格内平均灰度值、x方向平均梯度、y方向平均梯度。

3.子块间二值比较生成描述子:在获得各子区域统计特征后,M-LDB 会对子区域之间的不同通道进行两两比较,所有比较结果按固定顺序拼接形成二进制描述子,常见长度包括 256 bit、486bit、可配置长度。

(4)其它

项目KAZEAKAZE
尺度空间 非线性扩散 非线性扩散
PDE求解方式 AOS FED
检测器 Hessian Hessian
描述子类型 浮点描述子 二进制MLDB
匹配距离 欧氏距离 汉明距离
匹配速度 较慢 更快
尺度空间精度 更高 略低
鲁棒性 更高 较高
实时性 一般 更强
适合场景 高精度匹配 实时SLAM/VO

相关函数:

void detectAndCompute(InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints, OutputArray descriptors, bool useProvidedKeypoints = false);
功能:检测关键点+计算描述子

Mat cv::imread(const String& filename, int flags = IMREAD_COLOR);
功能:从指定路径读取图像。

void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);
功能:将图像缩放到指定尺寸。

void cv::Feature2D::detectAndCompute(InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints, OutputArray descriptors, bool useProvidedKeypoints = false);
功能:检测图像关键点并计算对应的描述子。

void cv::drawKeypoints(InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage, const Scalar& color = Scalar::all(-1), int flags = DrawMatchesFlags::DEFAULT);
功能:在图像上绘制检测到的特征点。

void cv::imshow(const String& winname, InputArray mat);
功能:在指定窗口中显示图像。

int waitKey(int delay = 0);
功能:等待键盘输入

完整特征算法Detector(关键点检测)Descriptor(描述子)描述子类型核心特点优点缺点典型场景
SIFT DoG(高斯差分) SIFT Descriptor 浮点型(128维) 尺度空间极值 + 梯度方向直方图 精度和鲁棒性极强 速度慢、内存大 高精度配准、SfM、三维重建
SURF Hessian Detector SURF Descriptor 浮点型(64/128维) 积分图 + Box Filter 加速 比 SIFT 快 精度略低于 SIFT 图像拼接、目标识别
ORB FAST + 金字塔 Rotated BRIEF 二进制 FAST + 灰度质心 + BRIEF旋转 极快、实时性强 大尺度透视较弱 ORB-SLAM、实时跟踪
BRISK FAST 多尺度检测 BRISK Descriptor 二进制(512bit) 环形采样 + 长距离点对方向估计 尺度鲁棒性强于 ORB 略慢于 ORB 无人机视觉、实时配准
AKAZE 非线性尺度空间(FED) M-LDB 二进制 非线性扩散金字塔 精度高于 ORB 理论较复杂 工业视觉、SLAM
KAZE 非线性尺度空间 KAZE Descriptor 浮点型 保边缘尺度空间 边缘保持能力强 较慢 高精度图像配准
SuperPoint 神经网络学习 神经网络学习 浮点型 Detector+Descriptor 联合学习 弱纹理鲁棒性强 需要GPU 深度SLAM、SfM
LoFTR 无显式关键点 Transformer Dense Matching 深度特征 直接稠密匹配 弱纹理/大视角极强 非常耗算力 大视角配准、复杂场景匹配

SURF关键点是斑点型,圆形,半径表示尺度。ORB关键点特征是角点,小圆点+方向线段(无尺度圆)。BRISK关键点是斑点/角点,同心圆+辐射状采样点,同心圆半径表示尺度。KAZE关键点是斑点/角点,椭圆/圆,圆半径对应非线性尺度。AKAZE,比KAZE更小,半径小。

1.2 基于线/边缘的方法

不提取关键点,而是直接利用边缘位置、边缘方向、边缘形状完成匹配

(1)优缺点

优点

  • 适配弱纹理场景:纯色墙面、走廊、建筑外立面等缺少角点的环境中,仍可稳定提取直线边缘特征,弥补点特征失效缺陷。
  • 光照与轻微模糊鲁棒性强:边缘由灰度剧烈跳变形成,小幅亮度波动、轻度运动模糊不会改变边缘位置与走向,特征稳定性更高。
  • 几何约束能力更强:线段具备长度、角度、空间夹角多维信息,相比单点特征约束更丰富,有效提升位姿求解精度。
  • 耐受局部遮挡:线段仅局部被遮挡时,剩余有效线段仍可建立匹配关系,正常完成位姿约束计算。
  • 缺点

  • 运算开销大实时性差:LSD 线段检测、LBD 线段描述子计算复杂度远高于点特征,提取与匹配耗时久,难以满足高实时性需求。
  • 线段形态易受干扰:受视角变换、阴影遮挡影响,同一物理直线易出现分段断裂、端点偏移问题,大幅增加匹配难度。
  • 建模复杂易出现运动退化:线段参数化维度高于特征点,数学建模难度更大;相机沿线段平行方向运动时,极易出现位姿求解退化现象。
  • 适用场景

  • 室内走廊、办公区等结构化室内环境,以及城市人造建筑场景。
  • 低纹理、高结构化,点特征无法正常工作的视觉场景。
  • 点线融合 VO 与 PL-SLAM 系统,协同点特征提升人造场景定位建图稳定性。
  • (2)整体流程

    1.边缘/线特征提取:先从边缘/线特征中提取边缘/线段/闭合轮廓。典型方法如下:

    类型方法
    边缘检测 Canny、Sobel、Laplacian
    线检测 Hough、LSD、FLD
    轮廓提取 findContours
    深度学习边缘 HED、DexiNed

    2.特征表示:得到边缘点集合、线段集合、多边形轮廓、形状描述子。

    3.特征匹配:寻找线 ↔ 线,边缘 ↔ 边缘,轮廓 ↔ 轮廓。

    方法原理
    几何约束 长度、方向、交点
    最近邻 点到边距离
    Shape Context 轮廓形状描述
    Hausdorff距离 两点集距离
    Chamfer Matching 边缘距离变换
    ICP 点集迭代配准

    4.估计变换:估计平移、旋转、仿射、单应性等。常见RANSAC、PnP、Least Squares、ICP。

    方法特征优点缺点OpenCV
    Canny+ICP 边缘点 精度高 初值敏感 部分支持
    Chamfer 边缘图 鲁棒 较慢 支持
    Hausdorff 点集 抗遮挡 需自己实现
    Hough 直线 稳定 支持
    LSD 线段 快、精度高 短线敏感 支持
    LBD 线描述子 信息少于SIFT opencv_contrib
    Shape Context 轮廓 形状强 计算大 部分
    Snake 动态轮廓 边界精细 易局部最优 部分
    1.2.1 基于边缘的方法

    属于基于几何结构的配准,利用物体边界、灰度突变位置、结构轮廓进行配准。

    (1)相关概念

    图像 I(x,y),边缘的本质是灰度变化剧烈的位置,因此计算\\nabla I=(\\frac{\\partial I}{\\partial x},\\frac{\\partial I}{\\partial y}),即图像在x、y方向的灰度变化率。

    梯度幅值:|\\nabla I| = \\sqrt{I_x^2 + I_y^2},表示变化有多剧烈,边缘强度。

    梯度方向:\\theta=tan^{-1}(\\frac{Ix}{Iy}),表示边缘朝向,梯度垂直于边缘方向,例如左黑右白,边缘是竖直方向,梯度从黑指向白。

    去中心化:把两组点各自平移,将几何中心挪到坐标原点。

    构造协方差矩阵:统计两组去中心化点的关联程度,表征点集形状匹配相似度H=\\sum_{i=1}^{n} p_i' {q_i'}^\\top

    。矩阵数值越大,两组轮廓形状契合度越高。

    SVD 奇异值分解:把协方差矩阵拆分,提取最优旋转分量、最优旋转矩阵,在数学上求解出使点集旋转后贴合度最高的角度变换。

    (2)完整流程

    1. 图像预处理:灰度化、去噪(高斯模糊)。

    2. 边缘提取:使用边缘算子提取边缘图:Sobel、Scharr、Laplacian、Canny(最常用)。

    3. 边缘特征获取:从边缘图中提取可匹配信息:边缘点、边缘轮廓、边缘距离场。

    4. 边缘匹配:计算两张图边缘的对应关系:Chamfer Matching(倒角匹配)、Shape Matching、边缘点匹配、Contour ICP。

    5. 计算几何变换:根据匹配结果求解变换矩阵:平移、旋转、仿射变换、单应矩阵 Homography。

    6. 图像变换与配准:使用变换矩阵将待配准图对齐到参考图。

    (3)边缘检测原理

    寻找灰度突变的位置。边缘提取算子:Sobel、Scharr、Laplacian、Canny。

    1.Sobel 算子

    最基础的梯度方法,核心思想是利用卷积核近似计算​\\frac{\\partial I}{\\partial x}\\frac{\\partial I}{\\partial y}

    Sobel 算子:

    为什么这样设计:[−1,0,1]本质是左右、上下差分,近似\\frac{\\partial I}{\\partial x}\\frac{\\partial I}{\\partial y},核中间2的本质是对邻域做加权平均,降低噪声敏感性,相当于平滑。因此 Sobel = 导数 + 高斯平滑。

    计算过程:对图像卷积得到I_x,\\, I_y,然后梯度的模长(边缘强度)\\mathrm{mag} = \\sqrt{I_x^2 + I_y^2}

    cv::Sobel(img, gx, CV_32F, 1, 0);
    cv::Sobel(img, gy, CV_32F, 0, 1);

    缺点:

     – 对噪声敏感,易产生伪边缘:Sobel 本质上是基于局部差分的算子,通过邻域像素的加权差来计算梯度,噪声点会直接被放大成虚假的边缘。

     – 边缘定位精度较低:3×3 的窗口和固定的加权模式,导致它只能粗略估计梯度,无法精确确定边缘的亚像素位置。测出的边缘往往比较粗,是有一定宽度的模糊带。

     – 边缘方向估计误差大:梯度方向由arctan2(Iy, Ix)计算,而 Sobel 的Ix和Iy本身就是近似值,尤其是在非水平 / 非垂直的斜向边缘上,误差会被放大。

     – 固定的窗口大小,对不同尺度的边缘适应性差:只能检测特定尺度的边缘。对大尺度、宽边缘(如模糊的边缘)检测效果差;而对细小边缘又容易漏检。不像多尺度算法(如 SIFT)能自适应不同尺度。

     – 对局部光照敏感:它的输出 mag 是绝对灰度差的数值,对局部 / 非线性光照变化非常敏感。

    2.Scharr 算子

    是对 Sobel 的高精度改进版,核心目标是在保持 3×3 小核效率的前提下,提高旋转对称性(isotropy)与梯度精度。真正的梯度应该对所有方向的高频变化响应一致,而不是偏向某几个方向,Sobel 隐含假设中间行更重要。

    同样近似一阶导数Gx\\thickapprox\\frac{\\partial I}{\\partial x},Gy\\thickapprox\\frac{\\partial I}{\\partial y},使用优化过后的卷积核权重。

    Scharr 做的是二阶精度匹配,约束:必须满足一阶导数近似;二阶频率误差最小;各方向响应尽量一致,解出来的最优整数近似就是 [−3,−10,−3]。

    Sobel:上下三行一样重要,只是中间更重要一点

    Scharr:中间那一行才是真正的导数主贡献,其他行只是修正

    3.Canny 算子

    边缘方法核心,Sobel的完整工程化升级版。整体流程如下:Input Image → Gaussian Blur → Gradient (Sobel) → Gradient Magnitude/Direction → Non-Maximum Suppression → Double Threshold → Edge Tracking by Hysteresis → Final Edge

  • 高斯模糊:梯度运算会放大噪声,因此先平滑,G(x,y)=\\frac{1}{2\\pi\\sigma^2}e^{-\\frac{x^2+y^2}{2\\sigma^2}},高斯滤波卷积后会保留低频,抑制高频噪声。
  • 梯度计算:使用 Sobel 得到 Ix​,Iy​,然后计算梯度幅值、梯度方向。
  • 非极大值抑制(NMS):
  • 为什么需要NMS:Sobel 得到的边缘很宽,但真正的边缘应该是单像素宽。
  • 核心思想:只保留梯度方向上的局部最大值,其余抑制,实现边缘细化。例如以当前点为中心,同一条梯度法线方向上,比较前后各 1 个邻点,仅当当前像素梯度幅值,大于正反方向相邻两个像素才保留为候选边缘,其余直接置 0 抑制。
  • 双阈值(Double Threshold):高阈值+低阈值。强边缘 M > T_{\\mathrm{high}}直接保留;弱边缘T_{\\mathrm{low}} < M < T_{\\mathrm{high}}可能是真边缘;非边缘M < T_{\\mathrm{low}}删除
  • 为什么不用单阈值:如果阈值高,弱边缘丢失;如果阈值低,噪声太多。
  • 滞后边缘跟踪:弱边缘如果连接到强边缘则保留,否则删除。
  • 为什么有效:真实边缘通常连续,噪声通常独立,因此连续性可以过滤噪声。
  • 最终得到细、连续、抗噪、单像素的边缘图。
  • 4.Laplacian of Gaussian (LoG) 算子

    高斯拉普拉斯算子,本质是先用 Gaussian 做平滑去噪,再用 Laplacian 做二阶导数(检测强度曲率变化)。

  • 高斯模糊:在梯度计算前进行去噪,避免微分放大高频噪声,因为梯度计算本质是微分,微分=高通操作,高通=放大噪声,所以必须先低通滤波。
  • Laplacian Operator:二阶导数,\\nabla^2 I_s = \\frac{\\partial^2 I_s}{\\partial x^2} + \\frac{\\partial^2 I_s}{\\partial y^2},离散实现,常用卷积核\\left[\\begin{matrix}0 & 1 & 0\\\\1 & -4 & 1\\\\0 & 1 & 0\\end{matrix}\\right]\\left[\\begin{matrix}1 & 1 & 1\\\\1 & -8 & 1\\\\1 & 1 & 1\\end{matrix}\\right],检测局部二阶曲率变化。
  • 响应分析:LoG输出是一个响应图,例如正 → 负、负 → 正的位置,进行零交叉检测:边缘出现在 LoG 响应的符号变化位置,如果 LoG(p)⋅LoG(q) < 0,认为存在 edge。
  • 核心目标是找到变换 T 使两幅图边缘尽量重合,E(T)→min。

    1.几种核心思想:

  • 边缘点距离最小化:最基础,目标是E=\\sum_{i} d(Tp_i,\\, q)^2,pi:源图边缘点;T(pi):变换后位置;d(⋅):到目标边缘距离;E2:目标边缘集合。表示变换后的边缘点距离目标边缘越近越好。
  • 边缘方向一致性:不仅位置接近,方向也应一致:E_\\theta=\\sum \\bigl|\\theta_i-\\theta_j\\bigr|
  • 边缘形状一致性:例如轮廓整体形状,可以使用 Shape Context、Hausdorff、Fourier Shape。
  • 2.距离变换(Distance Transform):边缘配准的核心数学工具。核心思想是不再关注是否刚好落在边缘上,而是问离边缘有多远,于是边缘就变成了距离场。

  • 为什么需要:边缘图的本质是0/1二值图,如果直接二值比较,会出现只差 1 像素也会导致边缘点不重合,误差变成1,导致:
  • 误差函数不连续:优化曲线跳变,而不是平滑变化。
  • 对噪声极敏感:一个噪声点可能导致误差剧烈变化。
  • 无法做连续优化:Gauss-Newton / LM 等优化方法要求误差函数连续可导,但二值边缘不可导。
  • 定义:每个像素到最近边缘的距离,DT(x,y) = \\min_{(u,v)\\in E} \\sqrt{(x-u)^2 + (y-v)^2},其中 E 表示所有边缘点几何;(x,y) 表示当前像素;(u,v) 表示边缘点;DT(x,y) 到最近边缘的距离。

  • 二维图:假设目标边缘0001000,中间1是边缘;那么距离图:3210123,0表示边缘处,1表示相邻像素,2、3表示更远处。
  • 3.边缘特征获取方法

  • 边缘点:最基础,例如 Canny、Sobel、Scharr 得到离散边缘像素。简单、数量多、易优化,但是对噪声敏感、缺少结构信息。
  • 边缘链:把连续边缘连接成曲线。可以保留拓扑结构、连续性更好.
  • 轮廓:进一步形成完整闭合结构。几何信息丰富、适合形状匹配,但是对遮挡敏感、提取依赖阈值。
  • (5)边缘配准方法

    1.Chamfer Matching(倒角匹配)

    基于距离场的边缘配准,本质就是 Distance Transform + 边缘点求和。核心思想是模板边缘变换后落到目标边缘附近。

  • 数学定义:误差:E(T)=\\sum_{i} DT(Tp_i);模板边缘 pi 经过变换 T(pi​) 落到目标距离图 DT 上查询距离。
  • 为什么有效:如果边缘重合,则 E(T)→0,误差小。
  • 优点:快、易实现、可连续优化、对轻微噪声鲁棒。
  • 缺点:易局部最优、依赖初值、不考虑方向。
  • Directional Chamfer Matching(定向倒角匹配):加入边缘方向一致性,误差:E=\\sum_{i} DT\\bigl(T(p_i)\\bigr)+\\lambda \\bigl|\\theta_i-\\theta_i'\\bigr|
  • 2.Hausdorff Matching

    豪斯多夫匹配,基于形状描述的匹配,常用于边缘匹配、轮廓匹配、模板匹配、目标检测、图像配准。它不要求点与点严格一一对应,而是衡量两个点集最坏情况下有多远。ICP 先建立对应点再优化,豪斯多夫直接衡量两个几何整体相似性,因此 Hausdorff 更偏全局形状匹配。

  • 数学定义:H(A, B) = \\max_{a \\in A} \\min_{b \\in B} \\|a - b\\|,对 A 中的每个点找到在 B 中最近的点,即\\min_{b \\in B}||a-b||,得到这个点离目标集合最近有多远,然后取其中的最大值,这叫 Directed Hausdorff Distance(单向豪斯多夫距离)。
  • 完整 Hausdorff Distance:因为 h(A, B) \\neq h(B, A),因此需要双向 H(A, B) = \\max\\left(h(A, B), h(B, A)\\right),即 H(A, B) = \\max\\left( \\max_{a \\in A} \\min_{b \\in B} \\|a - b\\|, \\max_{b \\in B} \\min_{a \\in A} \\|b - a\\| \\right)。表示两个集合最坏点的误差。
  • 直观理解:假设两个集合的点几乎重合,豪斯多夫距离很小,但如果其中一个集合有一个远离点,那么豪斯多夫距离会突然变大,因为它关心最坏的那个点。
  • Modified Hausdorff Distance(MHD):解决离群点问题,MHD 把 max 改成 mean,h_{MHD}(A, B) = \\frac{1}{|A|} \\sum_{a \\in A} \\min_{b \\in B} \\|a - b\\|,表示平均最近距离,这样对噪声更鲁棒,对离群点不敏感
  • 匹配流程:1.提取边缘得到点集。2.构造模板、目标点集 A、B。3.计算豪斯多夫距离,不断平移旋转模板,计算H(A,B)。4.找最小距离位置,argminH(A,B),认为此时模板与目标最匹配。
  • 优点:1.不需要显示对应点,不需要一一配对。2.能衡量整体形状差异,适合轮廓匹配。3.对部分遮挡有一定鲁棒性。
  • 缺点:1.对离散群点敏感。2.计算量大,两集合两两搜索,O(MN)。3.不适合精细连续优化,更像匹配评价指标,而不是连续位姿优化器。
  • Hausdorff 看最坏那个点。Modified Hausdorff 看平均最近距离,但保留 Hausdorff 思想。Chamfer Distance 看两个点集整体平均最近距离。

    3.基于方向一致性的匹配

    OCM(Chamfer Matching + Orientation):在 CM 的基础上增加梯度方向约束 ,
    E = d(p,E) + \\lambda \\bigl|\\theta_p - \\theta_q\\bigr|,θ:边缘方向;λ:方向权重。只有距离近、方向也一致才认为匹配正确。

    DCM(Directional Chamfer Matching):把方向加入 DT (距离变换),每个方向,一个 DT,即 0度、10度、20度分别建立距离场,匹配时不仅要求距离最近,还要求方向通道一致。适合线结构,工业定位。

    Edge Orientation Histogram:核心时比较边缘方向统计分布,统计梯度方向,建立方向直方图。

    Normal-based Matching:基于法线的匹配,E=\\|p-q\\|^2+\\lambda\\bigl(1-{n_p}^\\top n_q\\bigr),要求 {n_p}^\\top n_q大,即法线方向一致。

    3.Edge-based ICP(E-ICP)

    Iterative Closest Point,基于最近点迭代的配准,核心思想是不断寻找最近边缘对应点,再优化 R、t,直到收敛。

  • 数学定义:E=\\sum_{i} \\bigl\\|T(p_i)-q_i\\bigr\\|^2。E:整体匹配误差,误差越小对齐效果越好;$\\sum\\limits_i$ :对所有边缘点距离的累加求和;pi:源图像=上第 i 个边缘点;$T(\\cdot)$:空间变换算子(旋转、平移、缩放);$T(p_i)$:经过变换后的源边缘点;$q_i$:目标图像上对应的匹配点;d(⋅):到目标边缘的最近距离;$\\|\\cdot\\|^2$:欧氏距离平方,代表两点空间距离。
  • 迭代优化:
  • 初始状态:给定初始变换参数,初步匹配两组边缘点,生成初始对应点对$(p_i,\\, q_i)$。opencv 中默认自动从 “零变换” 开始(不旋转、不平移)。
  • 求解当前最优变换:对每个源边缘点,在目标边缘点中寻找最近点,生成对应点对(p_i, q_i)。依据当前点对,最小化距离平方和,通过去中心化、构造协方差矩阵、SVD 分解,算出本轮最优旋转矩阵 R 与平移向量 t。
  • 点位更新:用求得的变换更新源边缘点:$p_i' = R\\, p_i + t$
  • 重新匹配对应点:以更新后的点位为基准,在目标边缘上搜寻新的最近匹配点,刷新点对关系。
  • 误差判定收敛:计算新一轮整体误差E,对比上一轮误差:误差降幅小于设定阈值,停止迭代,达到最小距离匹配;误差仍明显减小,返回第二步继续循环优化。
  • 优点:1.实现简单。2.几何意义直观。3.对边缘轮廓配准有效。4.可用于激光点云、边缘地图、Shape Alignment。
  • 缺点:1.依赖初值,通常需要粗配准、金字塔、特征匹配、RANSAC先提供较好初值。2.最近点不一定真对应。3.容易陷入局部最优。
  • 4.Point-to-Line ICP

    普通 IPC 使用点到点欧式距离,当点沿边缘方向滑动时,即使真实位置已经比较接近,距离仍会发生明显变化。于是提出点到线 ICP,不优化整体欧式距离,只优化法线方向误差。

  • 数学定义:E = \\sum_{i} \\left( n_i^T \\left( T(p_i) - q_i \\right) \\right)^2,ni:目标边缘法线;${n_i}^\\top(\\cdot)$:把误差投影到法线方向,本质是计算点的法线方向距离。
  • 为什么稳定:对于边缘,法线方向约束强,切线方向本身不稳定,例如点沿边缘左右滑动,实际上边缘形状几乎没变化,但 Point-to-Point 会认为点位置发生变化,因此误差持续变化。而 Point-to-Line 只关心点是否贴近边缘,因此沿边缘滑动时,法线方向距离几乎不变,误差变化很小。
  • 优点:1.收敛更快,优化方向更准确。2.边缘方向约束更合理。3.小角度配准效果更好,尤其连续帧。
  • 缺点:1.依赖初值。2.需要稳定法线。3.对噪声敏感。
  • 1.2.2 基于轮廓的方法

    轮廓方法是边缘方法的“高级结构化版本”,因为边缘是离散局部几何,而轮廓是连续整体几何,它更关注“物体整体形状”而不是单个边缘点。

    轮廓配准核心目标:$T^*=\\arg\\min E(C_1,C_2)$,其中 C1,C2 表示轮廓曲线;T 是几何变换。本质是让两个形状尽可能一致。

    (1)完整流程

    1.图像预处理:灰度化、高斯去噪。

    2.边缘检测:Canny 算子获取边缘图。

    3.轮廓提取:提取连通轮廓、封闭区域轮廓。通常边缘图 → 连通区域 → 轮廓。

    4.轮廓特征计算:Hu 不变矩、傅里叶描述子等。

    5.轮廓相似度匹配:比对轮廓特征筛选匹配对。

    6.求解几何变换矩阵。

    7.图像变换完成配准对齐。

    (2)与边缘的对比

    对比边缘(Edge)轮廓(Contour)
    本质 局部梯度突变 完整闭合结构
    信息层级 局部 全局
    数据形式 边缘点 曲线/区域
    典型输出 Canny findContours
    关注重点 边缘位置 形状结构
    对噪声 更敏感 更稳定
    对遮挡 较强 较弱
    适合 VO/SLAM 目标识别/医学
    是否闭合 不一定 通常闭合

    (3)轮廓相关概念

    1.轮廓表示方法:

  • 点链:P1 → P2 → P3。
  • 闭合曲线:完整边界。
  • 多边形近似:approxPolyDP()。
  • 2.基础几何量:

  • 面积:contourArea()。
  • 周长:arcLength()。
  • 外接矩形:boundingRect()。
  • 最小外接旋转矩形:minAreaRect()。
  • 凸包:convexHull()。
  • 3.矩(Moments):轮廓方法核心数学工具之一,思想来源于物理中的质量矩,在图像中把像素看成质量,因此图像矩用于描述像素如何分布。

  • 图像矩:m_{pq} = \\sum_{x} \\sum_{y} x^p y^q I(x,y),质心:c_x = \\frac{m_{10}}{m_{00}} c_y = \\frac{m_{01}}{m_{00}}。方向:把坐标移到质心,用二阶中心矩 μ20​,μ11​,μ02​ 算主轴角度。尺度:m00​ 给出整体面积;二阶矩特征值给出长 / 短轴尺寸。
  • 零阶矩:$m_{00} = \\sum_x\\sum_y I(x,y)$,代表图像的总“质量”(所有像素强度之和)
  • 一阶矩:用于计算质心,$m_{10} = \\sum_x\\sum_y x \\cdot I(x,y)$,代表图像在x方向上的加权和;m_{01} = \\sum_x\\sum_y y \\cdot I(x,y),代表图像在y方向上的加权和。
  • 中心矩:去除平移影响,\\mu_{pq} = \\sum_{x}\\sum_{y} (x-\\bar{x})^p (y-\\bar{y})^q I(x,y)(\\bar{x}, \\bar{y})是质心。
  • 归一化中心矩:中心矩仍受缩放影响,所以继续归一化实现尺度不变性,\\eta_{pq} = \\frac{\\mu_{pq}}{\\mu_{00}^\\gamma},其中\\gamma = \\frac{p + q}{2} + 1
  • Hu Moments(Hu 不变矩):基于\\eta_{pq},构造出 7 个不变矩,记作\\phi_1, \\phi_2, ..., \\phi_7。本质是用低阶统计量描述整体形状,低阶矩描述大轮廓、主体结构,高阶矩描述细节、偏斜、局部结构,因此 Hu 更偏全局形状特征。
  • 第一矩:\\phi_1 = \\eta_{20} + \\eta_{02},描述在形状整体扩散程度。
  • 第二矩:\\phi_2 = (\\eta_{20} - \\eta_{02})^2 + 4\\eta_{11}^2,描述形状主方向与方向偏置程度。
  • 第三矩:\\phi_3 = (\\eta_{30} - 3\\eta_{12})^2 + (3\\eta_{21} - \\eta_{03})^2,描述形状的不对称性与偏斜程度。
  • 后面几个矩进一步组合三阶矩与高阶混合项,用于描述形状的对称性、偏斜程度、曲率变化以及复杂几何结构。
  • 直观理解:假设圆形,Hu Moments比较稳定,旋转或方法后的远仍基本不变,因此 Hu 能识别这是同一中形状。
  • (4)匹配算法

    1.Hu Moments Matching

    整体流程:

  • 二值化:将单通道灰度图像转换为仅含两种像素值的图像处理操作,输出图像像素只有两类:前景(目标)与背景,通常取值为 0(纯黑)和 255(纯白)。
  • 提取轮廓:得到的每个轮廓本质上是一圈边缘点。
  • 计算图像矩、中心距、归一化中心矩。
  • 构造 Hu 七个矩:七维形状向量特征,本质是将复杂轮廓压缩成七个数字,例如[hu0, hu1, hu2, hu3, hu4, hu5, hu6]→ [0.182, 0.004, 0.000001, …, …, …, …]。
  • Log 变换:实际中通常$H_i = -\\operatorname{sign}(h_{u_i})\\log\\bigl|h_{u_i}\\bigr|$,因为 Hu Moments 数值跨度极大,不取 log 数值不稳定、小值被淹没。
  • 两个形状进行比较:现在每个形状都有一个 7 维向量,计算特征距离,若 d < T,则认为两个形状相同,否则不匹配。
  • 欧式距离:d = \\sqrt{\\sum_i (H_i^A - H_i^B)^2}
  • L1距离:d = \\sum_i |H_i^A - H_i^B|
  • Cosine Similarity:比较方向相似性。
  • 为什么 Hu 能识别旋转后的目标:在 Hu 构造公式中,旋转项会相互抵消。

    为什么 Hu 对局部缺损不强:因为 Hu 本质是全局统计量,局部缺一块,整体矩都会变化,因此对遮挡鲁棒性不强,不如 Shape Context。

    优点:1.平移、旋转、尺度不变。2.计算速度快,Hu 最终只有 7 维特征,计算复杂度非常低。3.OpenCV 原生支持,实现简单。4.Hu本质是全局形状统计,因此对于圆形、三角形、字符轮廓、Logo等整体结构明显的目标效果更好。

    缺点:1.对局部细节描述弱,Hu 是全局统计量,因此局部细节容易丢失。2.对遮挡鲁棒性一般,Hu统计的是全局像素分布,部分遮挡影响整体特征。3.对噪声敏感,尤其高阶矩对边缘毛刺很敏感。4.区分复杂形状能力有限,只有七个数字,表达能力有限。

    适用场景:1.OCR 字符识别,例如数字、字母、简单汉字,因为字符整体轮廓稳定。2.Logo / 图标匹配,例如商标、图标、简单符号,适合全局形状比较。3.工业零件分类,例如螺母、垫片、工件轮廓,特点是旋转方向不固定、尺度可能变化,Hu的不变性很适合。4.简单目标检测,例如圆形检测、三角形检测、几何模板匹配。5.轮廓快速筛选,Hu 常用于粗匹配快速筛选掉明显不相似的目标,后续再 ICP、Shape Context 精匹配。

    2.Shape Context(形状上下文)

    基于点空间分布统计的形状描述方法,用“某点周围其它点的空间分布”描述该点,每个点都拥有一个局部几何直方图。

    数学定义:对于点 pi,统计其它点 q≠pi 的相对坐标 (r,θ),其中$r = \\| q - p_i \\|,\\quad \\theta = \\angle(q - p_i)$

    。然后将 (r,θ) 划分到对数极坐标网络中,得到h_i(k) = \\#\\{ q \\neq p_i : (q - p_i) \\in \\text{bin}(k) \\}

    ,即第 k 个空间 bin 内有多少个点,这就是 Shape Context Descriptor。

    Log-Polar Histogram(对数极坐标直方图):

  • 角度划分:例如 12 个方向,角度信息天然适合描述形状。
  • 半径划分:例如 5 个距离层,近距离结构更重要,因此半径采用对数分层。
  • 最终形成 12 * 5 = 60 维直方图。
  • 整体流程:

  • 提取轮廓点。
  • 为每个点建立 Shape Context:每个点一个空间直方图,一个例如60维浮点描述子。
  • 点描述子匹配:比较 $h_i,\\, h_j$,通常使用卡方距离(Chi-Square Distance)C_{ij} = \\frac{1}{2} \\sum_{k} \\frac{(h_i(k) - h_j(k))^2}{h_i(k) + h_j(k)},距离越小,两点空间结构越相似。
  • 建立对应关系:通常使用(Hungarian Algorithm)匈牙利算法寻找全局最优点匹配,而不是最近点匹配。
  • 求几何变换。
  • 优点:1.描述能力强,同时包含局部、全局结构。2.对非刚体形变鲁棒。3.对部分遮挡鲁棒。4.不依赖严格最近点。

    缺点:1.计算量大,每个点都要统计与所有其它点的关系。2.参数较敏感,例如 bin 数、半径层数、角度划分。

    3.Fourier Shape Matching(傅里叶形状匹配)

    基于频域形状描述的轮廓匹配方法,核心是将目标轮廓变换到傅里叶频域,用频谱描述整体形状,再比较频谱相似性。本质属于形状描述子(Shape Descriptor)而不是 ICP 那种几何迭代优化。详细见相位相关法。

    核心思想:假设轮廓:一圈边缘点,先把轮廓表示为 (xi​,yi​),然后构造复数序列$z_i = x_i + j y_i$

    ,即z=[z0​,z1​,…,zN−1​],然后做离散傅里叶变换(DFT)F(k) = \\sum_{n=0}^{N-1} z_n e^{-j 2\\pi k n / N} 得到傅里叶描述子

    几何意义​:低频:整体形状,保留大轮廓;高频:局部细节;幅值:形状强度;相位:空间位置。

    Fourier Matching 流程:

  • 提取轮廓:通常Canny等得到边缘点。
  • 轮廓参数化:把轮廓按顺序排列 (xi​,yi​) 形成闭合曲线.
  • 转为复数:例如 (3,2) → 3+2j。
  • 傅里叶变换:计算 F(k) 得到频谱。
  • 提取傅里叶描述子:通常只保留前几个低频系数,因为低频最稳定,用来作为形状特征。
  • 特征匹配:比较欧式距离、cosine similarity、correlation 寻找最相似形状。
  • 优点:1.天然旋转/尺度/平移不变。2.对局部噪声鲁棒,因为低频主导整体形状。3.特征维度低,只需要少量傅里叶系数。4.匹配速度快。

    缺点:1.对局部遮挡敏感。2.对复杂非刚体形变差,因为傅里叶更关注整体结构。3.无法提供精细几何对齐,更适合识别而不是精配准。

    边缘方法本质问题:1.边缘缺少唯一性,例如很多平行线容易歧义,不像SIFT有高维描述子。2.边缘容易断裂,由于噪声、光照、遮挡,边缘可能不连续。3.计算量大,边缘数量通常远大于关键点。现代 SLAM 通常 Point+Line 融合。

    1.预处理与边缘
    GaussianBlur() // 高斯降噪
    Canny() // 边缘检测
    2.轮廓提取核心
    findContours() // 查找轮廓
    drawContours() // 绘制轮廓
    boundingRect() // 获取轮廓外接矩形
    minAreaRect() // 获取轮廓最小包围矩形
    3.轮廓特征计算
    moments() // 计算图像矩
    HuMoments() // 计算Hu不变矩
    4.轮廓相似度匹配
    matchShapes() // 形状轮廓匹配

    特性Hu MomentsShape ContextFourier Shape
    本质 利用图像矩统计整体像素分布,通过不变矩描述全局形状结构 统计每个点周围其它点的空间分布关系,用局部空间结构描述整体形状 将轮廓转换到频域,用傅里叶频率成分描述轮廓结构
    特征类型 全局统计特征 局部+全局空间结构特征 全局频域特征
    局部细节 弱,对局部变化不敏感 强,能描述局部几何关系 中,高频可描述部分细节
    全局结构 很强
    非刚体能力 强,可结合 TPS 处理形变 一般
    遮挡鲁棒性 弱,局部缺失会影响整体矩 强,局部缺损不易破坏整体结构 一般,局部缺失会影响频谱
    噪声鲁棒性 一般,高阶矩对噪声敏感 中,依赖点分布稳定性 较强,低频对噪声较稳定
    旋转不变性 天然支持 通常通过主方向归一化实现 通过频谱幅值实现
    尺度不变性 天然支持 通过距离归一化实现 通过频谱归一化实现
    平移不变性 天然支持 通过相对坐标实现 去除 DC 分量实现
    计算量 很低,仅少量矩运算 很高,需要点间两两统计 中,主要为 FFT 计算
    是否需对应点 是,需要建立点匹配
    是否需要迭代 部分情况下需要
    实时性 很强 一般 较强
    典型应用 OCR、Logo、简单轮廓分类 手写字符、复杂轮廓、非刚体匹配 轮廓识别、目标分类、形状检索
    优势 简单、快速、不变性强 描述能力强,适合复杂结构 全局轮廓表达稳定,频域分析直观
    劣势 局部表达能力弱 计算复杂度高 对局部遮挡与复杂形变敏感
    1.2.3 基于直线的方法(Line-based)

    线特征匹配:利用图像中的线段、直线作为特征,进行两张图像间的匹配。

    (1)相关概念

    极坐标表示:ρ=xcosθ+ysinθ,ρ表示原点到直线距离,θ表示法线方向角。接近垂直时斜率不会变化剧烈对于、垂直线也不会出现斜率无穷,所有方向稳定。

    线段:有限线段长度,通常表示(x1​,y1​,x2​,y2​),还会包含长度、方向、中点、置信度。

    参数空间:横轴 θ,纵轴 ρ,每个边缘点 画一条正弦曲线,如果很多曲线交于同一点则出现亮峰。

    2×2 中心差分 计算梯度:
    g_x(x,y)=\\frac{I(x+1,y)-I(x,y)+I(x+1,y+1)-I(x,y+1)}{2}g_y(x,y)=\\frac{I(x,y+1)-I(x,y)+I(x+1,y+1)-I(x+1,y)}{2}。梯度幅值(强度)$G(x,y)=g_x^2 + g_y^2$

    。梯度方向$\\theta(x,y)=\\arctan2(g_y,\\, g_x)$,梯度方向垂直于边缘方向,LSD 就是靠这个方向做区域生长。

    NFA(Number of False Alarms):期望误检次数,本质上是随机图像中出现当前线段的期望误检次数。随机纹理也可能局部方向一致,如果只靠方向一致,会产生大量伪线段,NFA要解决的问题就是这条线到底是不是偶然出现的。NFA=0.001表示1000张随机图中平均才出现1次,说明几乎不可能随机形成;NFA=10,表示一张随机图平均出现10次这种结构,因此拒绝。

    (2)完整流程

    1.图像预处理:灰度化、高斯滤波去噪

    2.边缘检测:Canny 提取边缘轮廓

    3.直线检测:霍夫变换 / LSD 算法提取线段

    4.提取直线特征:线段长度、倾角、端点坐标、交点等

    5.线段特征匹配:依据几何特征匹配对应直线

    6.筛选匹配点对,求解几何变换矩阵

    7.透视 / 仿射变换,完成图像配准对齐

    (3)直线检测方法

    1.传统霍夫系

    传统霍夫变换(SHT):核心思想是从边缘点中找出“共线点集合”,本质上是全局参数投票方法。图像空间边缘点可能属于很多直线,每个点映射为ρ=xcosθ+ysinθ,在(ρ,θ)空间形成一条曲线,如果很多点在同一直线上,它们的参数曲线会交于同一点,这个交点就是直线参数。

    为什么需要霍夫变换:假设已经得到边缘图,图像中有大量边缘点,要找到哪些点属于同一条直线,如果直接两两连接复杂度O(N2),并且对噪声敏感、断裂边缘难处理、局部判断不稳定,因此霍夫变换提出不在图像空间找线,而是在参数空间找线。

    投票机制:霍夫变换的本质就是参数空间累加投票。

  • 初始化参数空间:建立二维累加器,A(ρ,θ),初始全为0。
  • 遍历每个边缘点:单个边缘点(x,y),遍历一系列角度θ,算出对应ρ,每一组(ρ,θ)位置票数A(ρ,θ)+1。 一个图像边缘点,会在参数空间投出一串票,连成正弦曲线。
  • 寻找峰值:多条曲线交汇的(ρ,θ)位置票数最高,代表大量图像边缘点都归属这条直线,对应原图真实直线。
  • 优点:抗噪声强,噪声点投票分散,不会形成明显峰值;能处理边缘断裂,只要大部分点仍共线,仍能形成峰值;能检测长结构,适合建筑边缘、道路车道线、工业结构,因为长线会积累大量投票。

    缺点:计算量大,对于每一个边缘点,都要遍历大量 θ;参数空间占用大,累加器A(ρ,θ) 通常很大,高分辨率时内存明显增加;分辨率依赖严重,如果分辨率太粗精度下降,如果太细峰值分散,因此量化误差明显;不适合短线,短线投票少,容易被噪声淹没;难以处理复杂曲线,更适合规则参数化形状,例如直线、圆、椭圆。复杂自由曲线困难。

    概率霍夫变换(PHT):传统霍夫最大问题时计算量太大,因此概率霍夫变换不再遍历全部边缘点,而是随机采样,直接输出线段端点(x1,y1,x2,y2),而非无限直线。

    优点:随机采用速度更快;无需完整累加器,内存更低;更适合实习系统;直接输出线段,更符合实际场景。

    缺点:结果存在随机性,不同采样结果可能略有不同;短线因为采样不足可能漏检;稳定性低于SHT。

    2.EDLines(Edge Drawing Lines)

    基于边缘链生长的快速线段检测方法,核心思想是线得到连续边缘链,再从边缘链拟合直线,沿边缘生长找线。

    整体流程:图像→梯度计算→锚点检测→边缘链跟踪→得到连续边缘段→直线拟合→验证线段→输出最终线段

  • 梯度计算:首先计算Gx​, Gy,获得梯度幅值、梯度方向。
  • Anchor(描点)检测:先找可靠边缘起点,一个像素如果梯度明显强于邻域,则认为这里可能是稳定边缘,作为边缘跟踪起点。
  • Edge Drawing(边缘链生长):从锚点开始,按照梯度方向逐像素跟踪边缘(8 邻域、梯度方向接近、强边缘连通),形成连续边缘链,例如p1 → p2 → p3 → p4,得到有序边缘点序列。

  • 线段拟合:对局部链局部拟合直线(通常最小二乘拟合、增量拟合)判断当前边缘链是否近似共线,如果满足则认为是一条线段。
  • 线段验证:不是所有边缘链都是真直线,需要验证点到直线距离、支持点数量、残差大小、长度阈值等,过滤短边、噪声边、曲线段,最终保留高置信线段。
  • 优点:1.速度快,不需要巨大参数空间。2.内存小,不需要累加器。3.适合短线,直接沿边缘跟踪,短线也容易检测。4.线段定位更准确,直接再图像空间拟合。5.输出天然是线段。

    缺点:1.依赖边缘连续性,如果边缘断裂严重,跟踪会失败。2.对噪声边缘敏感,错误边缘可能导致错误生成。3.曲线容易误分段,可能被折成多个短直线。

    3.LSD(Line Segment Detector)

    现代最经典的亚像素级线段检测算法,依靠局部梯度一致性,直接在梯度场中检测线段,避免“先找边缘,再找线”,因此更快、精确、亚像素、参数少。

    核心思想:同一线段上的像素梯度应该一致。

    整体流程:图像 → 梯度计算 → 区域生长 → 形成线支持区域 → 矩形拟合 → 统计验证 → 输出线段.

  • 全像素梯度计算:首先计算梯度方向、梯度幅值但不生成二值边缘图,这是与 Canny + 霍夫 的巨大区别。
  • 梯度方向一致性区域生长(Region Growing):从高梯度像素(种子点)开始寻找梯度方向相近的邻域像素不断扩展形成 Line Support Region(LSR)线支持区域。本质是一群方向一致的像素。
  • 矩形拟合:LSD 假设线段≈狭长矩形,因此对支持区域拟合矩形,得到线段长度、宽度、方向(长边倾角)。
  • 统计验证(核心):使用 NFA(Number of False Alarms)误检概率,判断这条线是不是随机噪声,如果大量像素方向一致,随机出现概率很低,则认为是真实线段。使用统计自动控制误检,因此参数少(传统方法认为设长度、投票、边缘阈值)。
  • 为什么精度高:使用梯度方向,比边缘二值图信息更多;亚像素;局部连续约束,比霍夫更精细。

    优点:1.亚像素精度高,因为直接连续拟合。2.无参数或少参数。3.不需要边缘连接,比EDLines稳定。4.速度快,复杂度接近O(N),单次区域生长,每个像素通常只访问有限次。

    缺点:1.对纹理噪声敏感,大量纹理可能形成伪梯度一致区域。2.曲线会被折成线段,因为只能检测直线。3.弱边缘可能漏检,梯度不足时区域生长困难。

    4.FLD(Fast Line Detector)

    快速线段检测器,是 LSD 的工程加速版本。核心思想是快速扫描梯度变化+区域聚合+线段拟合。重点是工程速度优化,而不是严格统计建模。

    整体流程:图像→梯度计算→快速区域扫描→候选线段生成→线段合并→输出结果。

  • 全像素梯度计算。
  • 强梯度筛选:不会对所有像素都处理,而是只保留强梯度像素 G > T(梯度阈值)。作用是过滤平坦区域、弱纹理、小噪声,保留真正可能属于边缘的像素。
  • 局部区域扫描和聚类:扫描图像中的强梯度像素,寻找方向相近且空间连续的像素集合形成候选线区域。本质是寻找局部共线区域。
  • 候选线段生成:聚类完成后,每个区域可能对应一条线段,因此对区域进行初步直线拟合。通常使用最小二乘直线拟合目标是找到 ax+by+c=0,使得$\\sum {d_i}^2$最小,其中di​表示点到直线的距离。
  • 线段生长:沿着当前线方向继续扩展,尝试吸收更多共线像素。初始聚类可能只覆盖局部区域,真实线段通常更长,因此需要进一步扩展。
  • 线段合并:不同区域可能属于同一真实直线,因此 FLD 会进一步检查。合并条件:方向接近、空间距离接近、共线性强。
  • 线段验证和过滤:会过滤低质量候选线段(长度太短、支持点太少、拟合误差过大),输出最终线段。
  • 方法传统霍夫(SHT/PHT)EDLinesLSDFLD
    核心思想 参数空间投票 边缘链生长 + 直线拟合 梯度方向一致性区域生长 快速梯度聚类 + 线段拟合
    工作空间 参数空间 图像空间 梯度场 梯度场
    基础输入 二值边缘点 边缘链 梯度方向场 梯度方向场
    是否依赖边缘检测 强依赖(通常Canny) 强依赖(ED边缘) 不依赖二值边缘图 不依赖二值边缘图
    是否全图梯度计算 通常不是核心 局部使用
    是否参数空间投票
    是否使用累加器
    是否有区域生长 有(边缘链跟踪) 有(LSR生长) 有(快速聚类)
    线支持区域 边缘链 LSR(Line Support Region) 候选共线区域
    直线表示 ((\\rho,\\theta)) 线段端点 狭长矩形 + 端点 线段端点
    输出形式 无限直线 / 线段 线段 线段 线段
    是否直接输出端点 PHT可以
    方向信息利用 很强 较强
    梯度方向一致性分析 部分 核心 核心之一
    是否使用统计验证 很少 强(NFA) 很弱
    是否使用NFA
    亚像素精度 一般 较高 很高 一般
    长线检测能力 很强
    短线检测能力 较弱
    对边缘断裂鲁棒性 很强 一般 较强 一般
    对噪声鲁棒性 很强
    对纹理伪线抑制 一般 一般 很强 一般
    参数依赖 较强 中等 很少 较强
    量化误差 明显 很小 很小
    计算量 较小 中等 很小
    内存占用 中等
    实时性 一般 非常强
    理论严谨性 很强 偏工程
    工程实现复杂度
    OpenCV支持 较少
    典型OpenCV接口 HoughLines 第三方实现较多 createLineSegmentDetector FastLineDetector
    适合场景 建筑、车道线、长结构 工业线段、实时视觉 SLAM、重建、几何视觉 实时SLAM、嵌入式
    现代SLAM使用 较少 较多 非常多 工程化较多

    (4)线描述子

    线检测后(LSD/Hough/FLD)只得到线的位置、方向、长度,因此使用线描述子点描述这条线(线本身信息太少,有区分性的是线两侧纹理结构),从而实现同一条线跨图像稳定匹配。

    线描述子的困难:1.点特征局部纹理唯一,但是线天然重复,局部纹理高度相似。2.线描述子需要考虑沿线方向、垂直方向。3.线长度变化大,有长线、短线、部分遮挡,因此线描述要适应尺度变化。

    核心思想:本质都在做统计附近区域的梯度/纹理结构。

    线描述区域(Band Region):线是长结构,不能像点一样简单单用方块,如以点为中心,取正方形Patch。通常建立带状区域,例如========,长度是线段长度,宽度为w。

    局部坐标系:建立线自身坐标系,定义沿线方向dL,垂直方向d⊥,因此旋转不变。

    1.LBD(Line Band Descriptor)

    线带描述子,线版BRIEF,统计线附近梯度结构。

  • 建立Band Region:设线段 L=(x1​,y1​,x2​,y2​),计算线方向$d_L=\\frac{(x_2-x_1,\\, y_2-y_1)}{\\|L\\|}$,法线方向d⊥​=(−dy​,dx​),得到局部坐标系。
  • 构建支持区域:围绕线段建立长条区域,例如 width = 7~15 pixels。
  • Band划分:把带状区域沿线方向均匀切分成多个Band,每个Band包含一个局部子区域。
  • 梯度计算:对Band内所有像素计算图像梯度,g=(gx​,gy​)。
  • 梯度投影:线有主方向,因此把梯度分别投影到 沿线方向 gL​=g⋅dL,表示沿线变化;垂直方向 g⊥​=g⋅d⊥​,表示跨边缘变化。当梯度方向与参考方向夹角小90度时投影为正。
  • 梯度统计:对每个Band,分别对两个方向统计正负梯度均值$\\mu=\\frac{1}{N}\\sum g_i$,表示整体方向趋势;方差$\\sigma=\\sqrt{\\frac{1}{N}\\sum\\bigl(g_i-\\mu\\bigr)^2}$,表示纹理变化复杂程度;绝对均值
    $\\mu_{\\mathrm{abs}}=\\frac{1}{N}\\sum_{i=1}^{N}\\bigl|g_i\\bigr|$,表示纹理变化复杂程度。

  • 分别对两个方向统计,沿线方向$\\mu_L,\\; \\sigma_L,\\; \\bigl|\\mu_L\\bigr|$;法线方向$\\mu_{\\perp},\\; \\sigma_{\\perp},\\; \\bigl|\\mu_{\\perp}\\bigr|$。假如有9个Band,每个Band产生8维特征,最终得到72维浮点描述子。
  • 形成描述向量:将所有Band统计拼接形成Descriptor=[f1​,f2​,…,fn​]。

  • 二值化:类似BRIEF,比较两个描述子元素之间大小,例如$f_i > f_j$,生成二进制串。

  • 优点:1.局部坐标系提供旋转鲁棒。2.梯度统计提供光照鲁棒。3.Band结构提供线结构表达能力。

    缺点:1.区分性弱于点描述子。2.平行线容易混淆。3.遮挡敏感,线断裂后描述子容易变化。

    2.MSLD(Mean-Standard deviation Line Descriptor)

    均值-标准差线描述符,LBD前身。统计均值和方差,不二值化。

    整体流程:

  • 线检测(LSD/EDLines)。
  • 建立线支持区域,构造局部坐标系。
  • 划分为多个band。
  • 计算像素梯度,投影到线、法线方向。
  • 统计每个band的梯度均值、梯度标准差,得到4维特征。
  • 拼接为浮点描述子,假设8个band,得到32维浮点描述子。
  • 优点:1.对弱纹理鲁棒,线比点更稳定。2.对光照比较稳定,因为使用均值、方差、归一化。3.对旋转鲁棒,使用线局部坐标系。4.几何约束强,线具有长度、方向,比点稳定。

    缺点:1.匹配速度慢。2.对线检测依赖较强,如果LSD/EDLines检测不好,描述子也会受影响。

    3.Line-SIFT

    把 SIFT 思想扩展到线特征,核心目标是为线段构建具有尺度/旋转鲁棒性的描述子。在线附近建立局部区域,再统计梯度方向分布。更接近 SIFT 的方向直方图思想,MSLD/LBD 更偏 mean/std statistics。

  • 线检测。
  • 建立线支持区域,构造局部坐标系。
  • 划分子区域(cell)。
  • 计算每个像素的梯度。
  • 梯度方向统计:Line-SIFT 对每个 cell 统计 orientation histogram(方向直方图),例如 8 bins,MSLD统计方差/均值。
  • 计算梯度方向:方向 $\\theta=\\arctan\\biggl(\\frac{g_y}{g_x}\\biggr)$,幅值 $m=\\sqrt{g_x^2 + g_y^2}$,用幅值作为投票权重,梯度方向分布比单纯的均值、方差表达能力更强。
  • 最终描述子:例如 8个cells,每个cell 8-bin 直方图,最终得到64为浮点描述子。
  • 缺点:计算较重,不太用于实时系统。

    4.LLD(Local Line Descriptor)

    局部线描述子,轻量级线特征描述方法,核心目标是低计算量、低内存、实时匹配。本质上属于 LBD/MSLD 体系的轻量化版本,重点不是复杂统计,而是快速、局部、可实时。

    核心思想:用尽可能少的计算 描述线附近局部结构。

    传统线描述子,例如MSLD 需要均值、方差、多 band 统计、浮点运算;Line-SIFT 需要统计直方图、梯度防线、高维浮点运算。LLD的目标是保留线结构信息,同时尽可能快。

    典型流程:

  • 线检测
  • 构建局部支持区域,通常更窄,更小。
  • 局部梯度采样:不会对整个区域做复杂统计,而是稀疏采样,例如沿线均匀采样 N 个点,每个采样点支取简单梯度信息。
  • 轻量化计算:往往只做简单比较,例如梯度 g>0?,邻域比较 $I(p_1) > I(p_2)$,局部模式类似BRIEF,因此很多LLD 是二进制描述子。
  • 二进制描述子:在采样点对比完成时就生成了二进制串。
  • 优点:1.适合实时系统,描述子小、匹配快、内存小。2.鲁棒性,线几何结构更稳定。

    缺点:1.表达能力有限,因为描述子太简单。2.重复纹理容易误匹配。3.对复杂光照变化不如深度特征。

    5.SOLD2

    Self-supervised Occlusion-aware Line Description and Detection,深度学习线描述子,集线检测、线描述、线匹配于一体化的系统,让网络自己学习什么样的结构最容易匹配。

    传统方法的几大问题:1.线容易断裂,例如遮挡、阴影。2.重复结构严重,例如窗框,栅栏。3.手工描述子区分性不足,LBD/MSLD本质还是梯度统计。4.部分可见性问题,很多线只出现一半。

    总体结构:Image→CNN Backbone→Line Detector→Line Heatmap→Line Segments

    Line Detector(线检测器):CNN 预测线概率,输出 Line Heatmap(线热力图),例如每个像素属于线的概率。CNN 能利用大范围上下文,即使线断裂,网络也能推断它仍然属于同一条线。

    Descriptor Decoder(描述子解码器):传统方法统计梯度、方向直方图。CNN 直接输出特征嵌入。SOLD2 线得到稠密特征图,然后沿线采样取特征,最后average pooling、attention、aggregation形成整条线描述子。

    为什么比LBD强:只能表达局部梯度关系,而SOLD2 特征包含质地、上下文、语义、全局结构。

    优点:1.光照不变性。2.遮挡鲁棒性。3.重复纹理区分能力。4.上下文语义。5.非线性结构表达。

    缺点:1.计算量大。2.内存大,通常浮点描述子。3.CPU实时性较差。4.部署复杂。

    方法类型核心思想Descriptor类型匹配距离速度鲁棒性计算量是否实时主要优点主要缺点典型场景
    MSLD 统计型 统计线支持区域的 mean/std Float L2 较慢 较大 一般 信息量丰富;匹配稳定 匹配慢;内存大 高精度匹配
    LBD 二值型 Band统计 + Binary Encoding Binary Hamming 很快 较强 很强 实时性优秀;内存小 信息损失;重复纹理易误匹配 VO/SLAM
    Line-SIFT Histogram型 统计梯度方向分布 Float L2 很强 较差 尺度与旋转鲁棒性强 descriptor维度高 离线配准
    LLD 轻量局部型 局部区域快速编码 多为Binary Hamming 很快 中等 轻量化;CPU友好 区分性一般 Embedded/实时系统
    SOLD2 深度学习型 CNN学习线结构特征 Learned Float Embedding Cosine/L2 较慢 最强 很大 GPU下可实时 光照/遮挡/重复纹理鲁棒性强 需要GPU;部署复杂 现代深度SLAM

    (5)几何约束

    1.方向约束

  • 线方向:线段$l=(p_s,\\, p_e)$,方向向量$v=\\frac{p_e-p_s}{\\|p_e-p_s\\|}$
  • 方向夹角:两条线 l1​,l2,夹角θ=arccos(v1​⋅v2​)。
  • 匹配条件:θ<τθ。​​
  • 2.Overlap约束

    不仅方向一致,还应在线方向上有重叠。

  • 统一方向
  • 将两线投影映射到同一轴上,得到两个区间 [a1​,b1​],[a2,b2]。
  • 计算重叠长度:$L_o=\\max\\bigl(0,\\; \\min(b_1,b_2)-\\max(a_1,a_2)\\bigr)$
  • 归一化:r=\\frac{L_o}{max(L_1,L_2)},如果r > 0.5 说明至少有一半重叠。
  • 3.长度约束

    同一物理线,长度不会差太离谱。要求 rl​ > τ,通常 τ = 0.5。r_l=\\frac{min(L_1,L_2)}{max(L_1,L_2)}

    4.中点距离约束

  • 定义中点 c=\\frac{ps+pe}{2}
  • 距离$d_c=\\|c_1 - c_2\\|$
  • 条件 dc ​< τc。​
  • 适合视频跟踪,VO连续帧。

    5.点到线距离约束

    线重投影误差核心,SLAM 核心,已知地图线、相机位姿,得到投影后的线,再比较观测线端点到投影线距离。

    2. 特征匹配

    特征匹配的本质是特征描述子的最近邻搜索,每一个关键点提取一个高维描述子向量,然后算向量距离,距离最小的就当成匹配对。

    为什么必然有错误匹配:1.只看向量相似度,不看几何关系。2.重复纹理必然撞车。3.SIFT/ORB 都是局部小邻域特征,只有小块纹理信息,没有整张图的全局位置逻辑;

    2.1 BFMatcher

    暴力匹配,最简单、最直接:对每个特征点,遍历另一张图所有点找最近的。

    优点:简单直接,,精度高,容易理解。

    缺点:慢、容易产生错误匹配,重复纹理场景不稳定。

    距离度量:ORB(二进制描述子)使用汉明距离(Hamming Distance),参数为cv::NORM_HAMMING,即两个二进制串有多少位不同;SIFT / SURF(浮点描述子)使用欧氏距离(L2 Distance),参数为cv::NORM_L2。

    cv::BFMatcher matcher(cv::NORM_HAMMING);// 第二个参数=true = 交叉验证
    std::vector<cv::DMatch> matches;
    matcher.match(des1, des2, matches);

    2.2 KNN 匹配 + Lowe Ratio Test

    这是经典局部特征(SIFT / SURF / ORB)中最标准、最常用的鲁棒匹配方法。原理:对每个点找 2 个最近邻,如果最近邻 / 次近邻 < 0.75,说明匹配可靠,否则是模糊匹配 。

    优点:大幅减少误匹配,对重复纹理效果好,SIFT/ORB 标准流程。

    缺点:匹配数会减少。

    cv::BFMatcher matcher(cv::NORM_L2);
    std::vector<std::vector<cv::DMatch>> knnMatches;

    matcher.knnMatch(des1, des2, knnMatches, 2);

    std::vector<cv::DMatch> goodMatches;

    for (auto& match : knnMatches) {
    if (match[0].distance < 0.75 * match[1].distance) {
    goodMatches.push_back(match[0]);
    }
    }

    为什么非常有效?例如:

    正确匹配:最近邻 10,第二近邻 40。说明唯一性强。

    错误匹配:最近邻 20,第二近邻 22。说明很多点都很像,不可靠。

    2.3 radiusMatch

    半径匹配/距离阈值过滤匹配,属*暴力匹配的一种,核心思想:对每个特征点,计算它与另一张图所有特征点的描述子距离,只保留距离 ≤ 设定阈值(maxDistance)的匹配,大于阈值的全部丢弃,认为“不够像”。它不限制匹配数量(0/1/多个都行),只看相似度够不够高。

    优点
    – 简单直观,可控性强(直接用距离控制质量)
    – 可以保留一对多的正确匹配(某些场景需要)
    – 不需要像 KNN 那样依赖次近邻,适合特征少的图

    缺点
    – 速度慢(暴力遍历)
    – 阈值需要手动调,不同图、不同特征要改参数
    – 重复纹理场景仍然容易出错

    cv::BFMatcher matcher(cv::NORM_L2);  // SIFT用L2,ORB用HAMMING

    std::vector<std::vector<cv::DMatch>> radiusMatches;
    float maxDistance = 150;  // 距离阈值(SIFT常用 100~200)

    matcher.radiusMatch(des1, des2, radiusMatches, maxDistance);

    // 转成一维好使用
    std::vector<cv::DMatch> goodMatches;
    for (auto& matchVec : radiusMatches) {
        if (!matchVec.empty()) {
            goodMatches.push_back(matchVec[0]);  // 取最近的一个
        }
    }

    为什么有效?
    – 正确匹配:描述子距离很小
    – 错误匹配:描述子距离很大

    直接设定一条“及格线”,只留下高分匹配。

    2.3. FLANN 快速匹配

    Fast Library for Approximate Nearest Neighbors,特征点超多时用。核心思想:不用暴力搜索,而是用索引结构加速最近邻查找.

    优点:很快,大规模匹配优秀。

    缺点:近似搜索。

    适用:SIFT/SURF、几千以上特征点

    cv::FlannBasedMatcher matcher;
    std::vector<cv::DMatch> matches;
    matcher.match(des1, des2, matches);

    2.4 RANSAC (Random Sample Consensus)

    它不是匹配方法,而是匹配后过滤。

    RANSAC的目标是从一堆带错误的匹配里,找出正确的内点,扔掉错误的外点。特征匹配之后一定存在错误匹配,而图像拼接真正需要的是,几何一致的匹配。

    Inlier(内点):真正符合同一个几何模型的匹配点

    Outlier(外点):错误匹配,不满足整体几何关系

    随机一致性抽样的核心思想:先随机抽少量点,用这些点计算单应矩阵H,拿这个H去验证所有匹配点。先猜一个模型,看谁支持它,然后不断重复,找出”支持人数最多“的哪个H。

    Lowe Ratio看的是描述子像不像,属于局部纹理一致性,RANSAC看的是几何关系是否一致。

    Reprojection Error(重投影误差):RANSAC会先随机猜一个模型(H或Affine),用这个模型预测源点应该投影到哪里。3.计算预测位置和真实匹配位置之间的距离,这就是重投影误差。如果误差 < ransacReprojThreshold,则认为是内点,否则认为是外点

    cv::Mat H = cv::findHomography(
    srcPoints, // 源图像点
    dstPoints, // 目标图像点
    cv::RANSAC, // 开启 RANSAC
    5.0 // 误差阈值(一般 3~5)
    );
    输出 mask,表示哪些是内点(inlier)

    方法本质常用描述子/算法优点缺点典型使用场景
    BF Match 暴力最近邻匹配 ORB、BRIEF、AKAZE 简单、精确 速度慢 小规模特征匹配、学习与调试
    BF Match + CrossCheck 开启交叉验证(双向最近邻一致) ORB、BRIEF 匹配更稳定、误匹配更少 匹配数量减少 ORB 图像配准、实时视觉、小范围运动场景
    KNN Match + Lowe Ratio Test 多近邻匹配 + 最近邻唯一性过滤 SIFT、SURF、ORB 鲁棒性高、有效减少误匹配 会丢失部分正确匹配 高精度图像配准、拼接、SLAM、三维重建
    FLANN 近似最近邻搜索 SIFT、SURF 大规模匹配速度快 精度略低于暴力匹配 大量特征点匹配、离线重建、大场景检索
    RANSAC 几何一致性筛选 配合所有特征算法使用 去除离群点、提高配准稳定性 不是匹配器,需要依赖前序匹配 单应矩阵估计、图像配准、位姿估计、SLAM

    void cv::DescriptorMatcher::match(InputArray queryDescriptors, InputArray trainDescriptors, std::vector<DMatch>& matches, InputArray mask = noArray());
    功能:对两组描述子进行最近邻匹配。
    参数:mask:匹配掩码,用于限制那些描述子允许匹配,默认为noArray,表示全图匹配

    void cv::drawMatches(InputArray img1, const std::vector<KeyPoint>& keypoints1, InputArray img2, const std::vector<KeyPoint>& keypoints2, const std::vector<DMatch>& matches1to2, InputOutputArray outImg, const Scalar& matchColor = Scalar::all(-1), const Scalar& singlePointColor = Scalar::all(-1), const std::vector<char>& matchesMask = std::vector<char>(), int flags = DrawMatchesFlags::DEFAULT);
    功能:绘制两幅图像之间的匹配特征点。
    参数:
    matches1to2:匹配结果,通常来自matcher.match()或good_matches;
    outImg:输出绘制图像
    matchesMask:匹配掩码,用于只绘制部分匹配,通常配合RANSAC内点使用
    flags:绘制方式控制,常用 DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS 表示不绘制未匹配点

    2.5 图像配准过程中使用到的数据结构

    (1)cv::Mat

    OpenCV中图像/矩阵的统一数据结构,本质是二维矩阵

    // 1. 存储图像:cv::Mat img
    // 2. 存储描述子:cv::Mat descriptors
    // 3. 存储单应矩阵:3×3 变换矩阵 cv::Mat H
    // 4. 内点掩码:cv::Mat mask(RANSAC 输出,标记内点/外点)
    class cv::Mat
    {
    public:
    int rows; // 矩阵的行数
    // – 图像:高度(图像的行数,即Y方向尺寸)
    // – 描述子集合:特征点的数量(每个特征点描述子占一行)
    // – 单应矩阵 H:3(3×3矩阵的行数)
    // – 内点掩码 mask:匹配点对的数量(每个点对对应一行)

    int cols; // 矩阵的列数
    // – 图像:宽度(图像的列数,即X方向尺寸)
    // – 描述子集合:描述子的维度
    // SIFT / SURF:128 或 64(浮点型)
    // ORB / BRISK / FREAK:32 字节(256 位,字节型)
    // – 单应矩阵 H:3(3×3矩阵的列数)
    // – 内点掩码 mask:1(每一行只有一个值,表示内点/外点)

    int type; // 矩阵元素的数据类型及通道数(用 CV_ 宏表示)
    // – 图像:
    // · 灰度图:CV_8UC1
    // · 彩色图:CV_8UC3(BGR 顺序)
    // – 描述子集合:
    // · SIFT / SURF:CV_32F(32位浮点,每个维度一个 float)
    // · ORB / AKAZE / BRISK:CV_8U(二进制描述子,通常为 8U 单通道,多个字节连续存储)
    // – 单应矩阵 H:多数使用 CV_64F(双精度)提高精度,也可用 CV_32F
    // – 内点掩码 mask:CV_8U(8位无符号整数,取值 0(外点)或 1(内点))

    void* data; // 指向矩阵实际存储数据的指针(按行顺序连续存放)
    // – 图像:指向像素数据的首地址(按行优先存储)
    // – 描述子集合:指向所有特征描述子数据的首地址(每行一个描述子)
    // – 单应矩阵 H:指向 9 个浮点数(或 6 个仿射元素)的首地址
    // – 内点掩码 mask:指向字节数组的首地址,每个字节为 0 或 1
    };

    (2)cv::KeyPoint

    保存特征点信息,本质是一个关键点对象。包括坐标、尺度、方向、响应值等信息

    class KeyPoint
    {
    public:
    cv::Point2f pt; // 坐标 (x,y)
    float size; // 特征点直径/尺度
    float angle; // 方向 0~360°
    float response; // 响应强度(稳定性)
    int octave; // 金字塔层数
    int class_id; // 分类ID(默认-1)
    };

    (3)cv::Point2f

    保存二维浮点坐标,KeyPoint保存完整的特征信息,但几何变换只需要坐标,因此用来提取匹配点

    struct Point2f
    {
    float x; // X坐标
    float y; // Y坐标
    };

    (4)cv::Match

    保存两个描述子的匹配关系

    class DMatch
    {
    public:
    int queryIdx; // 图1的特征点索引
    int trainIdx; // 图2的特征点索引
    int imgIdx; // 图像索引(一般=0)
    float distance; // 描述子距离(越小匹配越好)
    };

    (5)完整流程中的数据流

    Mat img1,img2 → vector<KeyPoint> → Mat descriptors → vector<DMatch> → vector<Point2f> → Mat H → warpPerspective → Mat registered

    3. 几何变换模型

    几何变换模型,用来描述两张图像之间像素位置的映射关系,建立从源图像 → 目标图像的空间变换规则,实现整幅图像对齐、配准、矫正。

    相关概念:

    自由度 DoF:唯一确定一种变换,最少需要多少个独立未知参数。参数越多 → 能描述的形变越复杂 → 模型表达能力越强。

    3.1 Rigid

    刚体变换,支持平移和旋转。

    3 自由度:2D 平面,x 平移、y 平移、旋转角度 → 3 个参数。长度不变、角度不变、形状完全不变,能变的东西最少,所以自由度最低。

    数学形式:x′=Rx+t,其中,R为旋转矩阵,t为平移向量。

    特点:保持距离、角度、形状不变。

    刚体变换矩阵是2*3矩阵,只能表示旋转+平移,专门给刚体变换/仿射变换使用。

    // 刚体变换(Rigid Transform)
    // 仅:旋转 + 平移,不允许缩放

    // 计算刚体变换矩阵(2×3)
    cv::Mat rigidMat = cv::estimateAffinePartial2D(
    pts1, // 源点
    pts2, // 目标点
    mask, // RANSAC 内点 mask
    cv::RANSAC, // 鲁棒估计
    3.0 // ransacReprojThreshold(重投影误差阈值)
    );

    // 对图像应用刚体变换
    cv::Mat alignedRigid;
    cv::warpAffine(img1, alignedRigid, rigidMat, img2.size());

    3.2 Similarity

    相似变换,支持平移、旋转、等比例缩放。刚体 + 等比例缩放,形状不变、大小可改。

    4 自由度:x 平移、y 平移、旋转、缩放系数 → 4 个参数。

    数学形式:x′ = s·R·x + t,其中,s:缩放因子(等比例),R:旋转矩阵,t:平移向量。

    特点:保持物体内部角度、形状、长宽比例不变;仅改变整体位置、整体尺寸大小、整体旋转朝向。

    相似变换矩阵是 2×3 矩阵,表示:旋转 + 平移 + 统一缩放。

    // 相似变换(Similarity Transform)
    // 旋转 + 平移 + 等比例缩放,不允许错切
    // OpenCV 没有专门“相似变换”函数
    // 实际工程里通常仍用 estimateAffinePartial2D

    // 计算相似变换矩阵(2×3)
    cv::Mat simMat = cv::estimateAffinePartial2D(pts1, pts2, mask, cv::RANSAC, 3.0);

    // 对图像应用相似变换
    cv::Mat alignedSim;
    cv::warpAffine(img1, alignedSim, simMat, img2.size());

    3.3 Affine

    仿射变换,支持平移、旋转、拉伸、倾斜、不等比例缩放。不再保形状、不保角度,只保留平行线永远平行

    6 自由度:2D 仿射矩阵 6 个独立元素 → 6 个参数

    数学形式:x′ = A·x + t,其中:A:2×2 仿射矩阵(包含旋转、缩放、错切)t:平移向量。

    特点:保持平行性、保持直线性,不保持距离、不保持角度。

    // 3. 仿射变换(Affine Transform)
    // 旋转 + 平移 + 缩放 + 错切
    // 使用:estimateAffine2D

    // 计算仿射变换矩阵(2×3)
    cv::Mat affineMat = cv::estimateAffine2D(pts1, pts2, mask, cv::RANSAC, 3.0);

    // 对图像应用仿射变换
    cv::Mat alignedAffine;
    cv::warpAffine(img1, alignedAffine, affineMat, img2.size());

    3.4 Homography

    单应性变换,支持平移、旋转、缩放、错切、透视畸变。最大的特点是支持透视变化,如斜拍、近大远小、视角变化。

    8 自由度:3×3 单应矩阵,尺度冗余后有效独立参数 8 个

    数学形式:齐次坐标下

    特点:仅保持直线性(直线变换后仍是直线);不保持平行、不保持角度、不保持比例、不保持距离;可处理近大远小透视形变。

    成立条件:必须满足场景近似平面或相机纯旋转,场景所有点,深度必须一样。

    视差 Parallax:物体离相机远近不同(深度不同),相机一动,像素位移量不一样。

    为什么非平面,Homography 必败:Homography 的数学假设是整张图所有像素点,服从同一个 3×3 投影映射规则。隐含条件:所有点深度相同,运动规律完全一致。一旦场景不是平面,有近点、有远点 → 不同深度产生不同视差每个点的像素运动规律不一样。

    两种 Homography 能正常工作的情况:

    1.场景严格共平面,墙面、地面、书本、棋盘格所有点深度几乎一致 → 没有视差差异所有点像素运动统一 → H 完美成立。

    2.相机只有旋转、没有平移,相机原地转圈,不往前走、不左右移,没有平移就没有视差,远近点看不出前后位移,整幅图像变化等效于纯投影变形 → H 也能成立。

    [ h11  h12  h13 ]   // 线性变换 + 水平平移
    [ h21  h22  h23 ]   // 线性变换 + 垂直平移
    [ h31  h32  h33 ]   // 透视变换分量

    H (单应性矩阵)共 9 个元素,尺度固定剩 8 个未知量;一对点给 2 个方程,8/2=4,所以只要 4 对点。

    适用场景:1.场景物体在现实中是严格平面。2.相机纯绕光心旋转(原地转圈、俯仰、左右转头)、无平移相机。

    普通图像变换(刚体 / 相似 / 仿射)只是像素层面的几何形变,纯 2D 图像内部拉扯、旋转、缩放,和真实三维空间无关。

    Homography 单应性前提必须有:真实物理平面。是3D 平面 → 两个 2D 像素平面 之间的投影几何约束,单应是同一个空间平面,换个相机看的投影关系。

    cv::Mat cv::findHomography(
        InputArray    srcPoints,     // 源图像特征点集 pts1
        InputArray    dstPoints,     // 目标图像特征点集 pts2
        OutputArray   mask,          // 输出内点掩码 mask
        int           method,         // 鲁棒估计方法,常用 cv::RANSAC
        double        ransacReprojThreshold, // RANSAC重投影误差阈值(像素)
        int           maxIters = 2000,       // RANSAC最大迭代次数,默认2000
        double        confidence = 0.99,     // RANSAC置信度,默认0.99
        int           refineIters = 5       // 最终优化迭代次数,默认5
    ); 
    // 功能:计算包含透视的 3×3 单应变换矩阵
    // 输出:Mat 类型,大小 3×3

    void perspectiveTransform(
    InputArray src, // 输入:原始点集 (2D点 或 3D点)
    OutputArray dst, // 输出:变换后的点集
    InputArray M // 3×3 单应矩阵 H 或 投影矩阵
    );
    //用单应矩阵 H 把图 1 的点映射到图 2

    // 应用单应透视变换
    void cv::warpPerspective(
        InputArray    src,            // 输入原始图像 img1
        OutputArray   dst,            // 输出配准后图像
        InputArray    M,              // 3×3 单应变换矩阵 H
        Size          dsize,          // 输出图像尺寸,一般用 img2.size()
        int           flags = INTER_LINEAR,    // 插值方式,默认线性插值
        int           borderMode = BORDER_CONSTANT, // 边界填充模式
        const Scalar& borderValue = Scalar()    // 边界填充颜色,默认黑色
    );

    // 求单应变换矩阵(含透视畸变,3×3)
    cv::Mat H = cv::findHomography(pts1, pts2, cv::RANSAC);

    // 把 pts1 用 H 变换到目标位置
    std::vector<cv::Point2f> pts1_proj;
    cv::perspectiveTransform(pts1, pts1_proj, H);

    // 对图像 做单应变换 (warpPerspective)
    cv::Mat alignedImg;
    cv::warpPerspective(img1, alignedImg, H, img2.size());

    3.5 非刚性变换(Non-rigidTransformation)

    不满足整体统一几何模型,局部可以各自形变、拉伸、扭曲;没有全局固定的 2×3 / 3×3 统一矩阵,每一块区域形变都可以不一样。

    数学特点:无统一全局公式 x ′ =Mx;

    特点:不保持距离、不保持角度、不保持平行、不保持直线,无统一全局变换矩阵,允许局部非均匀形变.

    是逐点 / 局部映射关系,每个像素的偏移量可以独立变化。

    支持形变:弯曲、扭曲、局部拉伸、弹性形变、人脸形变、医学图像形变、地表形变等。

    适合:医学影像配准、人脸对齐、曲面物体配准、形变拼接。

    非刚性没有一个固定矩阵求解函数,常用方案:

  • 薄板样条插值 TPS(最经典非刚性配准)
  • 基于稠密光流(Optical Flow)
  • 基于曲面形变(B-Spline)
  • 和前面四类的核心区别:

    前面四种:刚性类变换(刚体、相似、仿射、单应),全局同一个矩阵,整张图像一套变换规则,只能整体旋转 / 平移 / 缩放 / 透视;

    非刚性变换:无全局统一矩阵,局部可以弯、可以扭、可以单独拉伸,自由度极高,适配不规则形变。

    二、基于灰度的图像配准方法

    基于灰度的配准方法,也叫直接法(Direct Methods)/基于像素的方法(Pixel-based Methods)/基于强度的配准(Intensity-based Registration),在OpenCV及相关文献中,有时也归类为 基于区域的配准(Area-based Registration),以区别于基于特征的配准。

    特征法的问题:如果遇到没有稳定特征点的场景,如白墙、地面、天空、模糊、弱纹理,可能根本没有稳定特征点,于是detect不到点,后面全挂。因此出现 Direct Methods。

    直接法的核心思想:不依赖特征点、描述子、匹配,而是直接选一批像素,优化相机位姿让这些像素的灰度误差最小,最小化两张图像的灰度误差(Photometric Error),寻找最优 Warp(变换),使 warp 后的图像灰度尽可能一致,本质是 Photometric Optimization(光度优化)。

    先预估两图之间粗略的旋转与平移变换关系,选取图像中高梯度像素,依据当前预估关系把第一张图像素映射到第二张图对应位置,计算重合位置的像素灰度差值。再借助高斯牛顿、LM 等优化算法,朝着缩小灰度误差的方向持续调整变换参数,不断迭代修正,直至灰度误差达到最小,最终得到最优的图像变换关系与相机位姿。

    (1)优缺点与适用场景

    优点

  • 直接利用像素灰度信息,不依赖特征点,弱纹理甚至无纹理区域也能工作。

  • 不需要特征提取与描述子匹配,避免了大量特征匹配开销。

  • 纯传统优化方法,无需训练模型。

  • 在小运动、高帧率场景下计算效率较高,适合实时系统。

  • 能充分利用整幅图像信息,局部对齐精度通常较高。

  • 缺点

  • 基于灰度一致性假设,对光照变化较敏感。

  • 对大尺度变化、旋转及强透视变化适应能力有限。

  • 本质属于局部优化,容易陷入局部最优。

  • 通常需要较好的初始位姿或粗对齐结果。

  • 对动态物体、遮挡和非刚性形变较敏感。

  • 在低梯度区域(纯色区域)中约束不足,容易退化。

  • 适用场景

  • 弱纹理、低纹理环境。

  • 高帧率、小位移连续运动场景。

  • 实时视觉里程计(VO)与 SLAM。

  • 边缘丰富、灰度连续变化明显的场景。

  • 视频稳像、短时帧间跟踪与局部精细对齐。

  • 医学图像、遥感图像等高精度灰度配准任务。

  • 不适合场景

  • 大位移、大视角变化场景。

  • 强光照变化或曝光变化明显的场景。

  • 动态目标较多的场景。

  • 大面积纯色、低梯度区域。

  • 存在严重遮挡或非刚性形变的场景。

  • 初始位姿误差较大的场景。

  • (2)核心概念

    Brightness Constancy(亮度恒定假设):灰度法最核心的假设,假设同一个物理点在短时间内灰度近似不变,即I(x,y,t) = I(x+dx,y+dy,t+dt),同一个点虽然像素位置变了,但是灰度值没变。

    Photometric Error(光度误差):E = I1(p) – I2(p'),第一张图像素灰度减第二张图对应位置灰度,直接法的目标是最小化所有像素误差。

    Wrap(图像变换):本质是几何投影,通过相机模型、位姿变换、投影模型,把 Image1 中的像素映射到 Image 2。1.将当前像素反投影得到 3D 点。2.使用相机位姿对 3D 点做刚体变换。3.再投影回到图像平面得到下一帧像素位置。这是现代  Drect VO / DSO / LSD-SLAM 核心。

    Image Gradient(图像梯度):直接法极度依赖灰度变化,因为优化必须知道往哪个方向移动误差下降最快,梯度本质是灰度变化率,如果区域完全平坦,没有梯度就无法优化,所以直接法依赖 Gradient(梯度) 而不是 corner(角点)。

    Optical Flow(光流):图像中像素随时间运动形成的运动场,是图像平面上的表观运动。;例如,frame1: pixel(x,y); frame2: pixel(x+u,y+v),其中(u,v)就是光流。光流算法建立在 Brightness Constancy(亮度恒定)上,这是 LK、IC-LK、Horn-Schunck、Direct VO 共同基础。

    光流约束方程(Optical Flow Constraint Equation):有 I(x,y,t) = I(x+dx,y+dy,t+dt),对右边做一阶泰勒展开,得到 I(x+dx,y+dy,t+dt) ≈ I(x,y,t) + Ix·dx + Iy·dy + It·dt,其中 Ix = ∂I/∂x、Iy = ∂I/∂y、It = ∂I/∂t,即图像梯度(灰度变化率),代回并除以dt得到光流约束方程:Ix·u + Iy·v + It = 0,其中 u = dx/dt,v = dy/dt,即像素运动速度;It表示时间方向的灰度变化,I(t+1)-I(t),这公式的真正含义是位移造成的灰度变化应该抵消时间灰度变化。这个方程有两个未知数 u、v,因此无法直接求解,这叫 Aperture Problem(孔径问题),即单个像素无法确定真实运动方向。

    (3)分类

    稀疏直接法,只优化少量关键区域(Patch),只选择高梯度像素,再做 Patch 灰度跟踪。只在少量稳定点附近 Photometric Error。

    优点:1.非常快:只优化少量点。2.实时性极强:CPU即可运行。3.数学简单:小窗口优化。4.亚像素精度高:灰度优化。5.工程成熟:OpenCV大量支持。

    缺点:1.依赖角点:平坦区域无梯度。2.光照敏感:Brightness Constancy。3.长期漂移:Tracking Error 累积。4.遮挡容易失败:Patch 被破坏。5.大位移困难:线性化要求小运动

    适用场景:1.视频跟踪:非常适合。2.VO Frontend:非常适合。3.SLAM 前端:非常适合。4.视频稳像:适合。5.医学影像:一般。6.大视角变化:不适合

    LK、KLT Pipeline:输入两帧图像 → Shi-Tomasi 检测角点 →
    Pyramid LK 光流 → 得到对应点 → RANSAC → Homography → warpPerspective

    稠密直接法(Dense Direct Methods)的特点是对全图所有像素做优化,信息更多、但计算量巨大。

    优点:1. 信息量巨大,使用全部像素。2. 弱纹理更强,不依赖角点。3. 对齐精度高,Dense Constraint。4. 连续运动场,稠密Flow。

    缺点:1. 计算量巨大,全图优化。2. 很吃内存,Dense Flow。3. 对光照敏感。4. 容易局部最优,非线性优化。5. 实时性差,计算重。

    场景适配:1. 医学配准:非常适合。2. 遥感配准:非常适合。3. 视频稳像:适合。4. Dense VO:适合。

    Farneback Pipeline:输入两帧图像 → 灰度化 → 建立 Pyramid
    → 局部区域做 Polynomial Expansion(多项式展开)
    → 估计 Dense Flow → 得到全图 Motion Field
    → 根据 Flow 估计 Warp → warpAffine / warpPerspective

    TV-L1 Pipeline:输入两帧图像 → 灰度化 → 建立多尺度 Pyramid
    → 建立 Optical Flow Energy → TV Regularization(总变差正则化)
    → L1 Photometric Optimization → 迭代优化 Flow
    → 得到 Dense Optical Flow → 根据 Flow 求 Warp

    半稠密直接法(Semi-Dense Direct Methods),现代 Direct VO 核心。选取优化高梯度区域(整片梯度足够的像素区域),即:∣∇I∣>threshold。因为平坦区域没有信息。通过高梯度像素实现了精度与速度的平衡。

    优点:1. 比Dense快很多,不优化无信息区域。2. 比Sparse信息更多,使用大量边缘。3. 更稳定,高梯度区域约束强。4. 更适合VO,兼顾精度与速度。

    缺点:1. 系统复杂,需要深度/位姿联合优化。2. 数学门槛高,SE(3)+BA。3. 光照敏感,Photometric Error。4. 初始化困难,非线性优化。

    场景适配:1. Direct VO:非常适合。2. Direct SLAM:非常适合。3. AR/VR:非常适合。4. 实时定位:非常适合。5. 医学配准:一般。

    代表系统:LSD-SLAM,DSO,SVO。

    DSO Pipelline:输入图像 → 图像金字塔 → 选择高梯度点
    → 估计深度 → 建立 Photometric Error → SE(3) Warp
    → Gauss-Newton → 联合优化:Pose + Depth + Exposure
    → Keyframe → Sliding Window BA

    LLSD-SLAM Pipeline:输入 Monocular Video → 建立 Pyramid
    → 提取高梯度像素 → Depth Estimation → Direct Image Alignment
    → Photometric Optimization → Pose Tracking → Keyframe Selection
    → Depth Map Fusion → Pose Graph Optimization

    Global Direct Alignment(全局直接配准):直接优化整张图 Warp,整图建立统一光度约束,求解全局唯一变换(单应 / 刚体 / 仿射)。

    优点:1.光照鲁棒。2.亚像素精度。3.依赖梯度而非角点,边缘区域即可提供约束。4.不需要特征点。

    缺点:1.速度较慢,相比稀疏特征法计算量更大,需要处理更多像素。2.对初始化敏感,非线性优化易陷入局部最优,依赖良好初始位姿。3.动态场景差,光度误差模型假设场景静态,动态物体会破坏约束。4.大透视变化困难,线性化假设要求运动幅度小,视角剧烈变化易失效。

    适合场景:图像配准、视频稳像、医学图像、遥感图像、弱纹理配准。

    ECC Pipeline:初始化 Warp → Warp 图像 → 计算灰度误差
    → 计算梯度 → Jacobian → Hessian → Gauss-Newton → 更新 Warp → 收敛。

    Frequency-domain Direct Methods(频域直接法):频域直接法不直接在像素空间做灰度优化,而是通过傅里叶变换(FFT)将图像转换到频域,利用相位相关 / 互相关求解图像间的平移偏移,实现快速配准。

    优点:1.超快,频域互相关利用 FFT 实现,时间复杂度为 O (N log N)。2.抗噪声,频域滤波特性天然抑制高频噪声。3.实现简单。4.大平移稳定。

    缺点:1.只能估计平移。2.无法处理复杂形变。3.不适合透视变化。

    场景:平移配准、工业检测、视频稳像、快速粗对齐。

    Phase Correlation Pipeline:输入两张图 → FFT(傅里叶变换)
    → 计算 Cross Power Spectrum → IFFT → 峰值检测 → 得到平移量(dx,dy) → warpAffine

    类别核心思想典型算法稀疏/稠密是否优化灰度是否需要特征点是否需要Descriptor是否属于VO/SLAM核心OpenCV是否支持OpenCV函数/APIC++Python典型用途优点缺点
    Sparse Direct Methods(稀疏直接法) 只优化少量 Patch 灰度 LK、Pyramid LK、KLT、IC-LK 稀疏 通常需要角点 不需要 是(Frontend核心) 支持(IC-LK无独立API) calcOpticalFlowPyrLK() 支持 支持 Tracking、VO Frontend、SLAM Frontend 极快、实时性强、CPU友好 对光照敏感、大位移困难、长期漂移
    Dense Direct Methods(稠密直接法) 对全图所有像素优化 Farneback、TV-L1、Horn-Schunck 稠密 不需要 不需要 部分属于 支持(Horn-Schunck无) calcOpticalFlowFarneback() DualTVL1OpticalFlow 支持 支持 Dense Flow、Motion Analysis、视频理解 信息量大、运动连续 计算量巨大、内存高
    Semi-Dense Direct Methods(半稠密直接法) 只优化高梯度区域 LSD-SLAM、DSO、SVO 半稠密 不一定 不需要 是(现代Direct VO核心) 不支持 需第三方库 需第三方库 Direct VO、SLAM、AR 精度高、弱纹理强、效率比Dense高 数学复杂、工程难、光照敏感
    Global Direct Alignment(全局直接配准) 直接优化整图Warp ECC、Image Alignment 全局/稠密 不需要 不需要 不属于完整VO 支持 findTransformECC() 支持 支持 图像配准、视频稳像、医学图像 亚像素精度高、弱纹理可用 对初始化敏感、动态场景差
    Frequency-based Direct Methods(频域直接法) 在频域估计运动 Phase Correlation、Fourier-Mellin 全局 间接 不需要 不需要 不属于 部分支持 phaseCorrelate() 支持 支持 平移配准、工业检测、快速粗对齐 超快、抗噪声、大平移稳定 通常只能处理平移或简单变换

    (4)特征法的本质区别

    Feature-based:优化几何对应关系,即点对点对应,例如:ORB、SIFT、SURF,优化目标 Reprojection Error(重投影误差)。

    Direct Method:优化灰度一致性,即 Pixel-to-pixel Alignment(像素对齐),优化目标 Photometric Error(光度误差)。

    特征法直接法
    使用关键点 不需要关键点
    使用 descriptor(描述子) 使用灰度值
    先匹配再优化 直接优化
    稀疏 correspondence 稠密 / 半稠密优化
    几何驱动 光度驱动
    对光照更鲁棒 对光照敏感
    对初始化不敏感 对初始化敏感
    适合大位移 适合小位移

    1.稀疏直接法

    1.1 Lucas-Kanade Optical Flow(LK 光流)

    LK 属于基于灰度的稀疏直接法,依靠灰度不变假设与图像梯度。先在参考图提取 Shi-Tomasi 角点,再在另一张图中跟踪这些特征点的运动位置;得到成对匹配点后,再求解变换矩阵实现图像对齐。无需对整张图计算,只做局部特征点跟踪,速度快,适合帧间小运动、连续视频或小幅偏移图像配准。LK的本质是局部灰度一致性优化,找一个小位移让窗口灰度差最小,找最优 warp 参数 p 让 warp 后的图 ≈ template。

    LLK光流只需搜寻图像块灰度差异最小的匹配位置完成块对齐。其优化目标为最小化灰度平方误差SSD,公式为$\\min\\sum(I_1-I_2)^2$,通过迭代求解最优像素偏移量,实现精准运动跟踪。

    (1)优缺点

    优点

  • 计算速度极快,只优化局部小窗口(Patch)。
  • 数学模型简洁优雅,基于最小二乘优化。
  • 灰度直接优化,可达到较高亚像素精度。
  • 非常适合实时跟踪与视频处理。
  • 是经典 Direct Method 与 Optical Flow 的基础。
  • 缺点

  • 对光照变化敏感,依赖 Brightness Constancy(灰度一致性假设)。
  • 大位移场景困难,因为泰勒展开线性化要求小运动,因此通常需要 Pyramid LK。
  • 弱纹理区域效果差,梯度不足会导致约束退化。
  • 容易出现长期漂移(Tracking Drift)。
  • 遮挡或快速运动时容易跟踪失败。
  • 本质属于局部优化,容易陷入局部最优。
  • 适用场景

  • 视频目标跟踪。
  • 视频稳像。
  • VO / SLAM 前端跟踪。
  • 高帧率小运动场景。
  • 实时光流估计。
  • 稀疏特征跟踪(KLT Tracking)。
  • (2)核心概念

    Lucas-Kanade(LK):LK 的伟大之处在于“一个像素不够,那就看一个 patch (小窗口)”,假设窗口内所有像素运动一致,于是窗口内的每一个像素都有一个光流约束方程,最后得到超定方程组 A*d = b,然后用最小二乘求解。

    边缘不好、角点最好:例如竖直边缘只有 x 方向变化,无法确定 v,因此边缘不可稳定跟踪;角点x、y方向都有变化,所以 Harris/Shi-Tomasi 适合LK。

    金字塔 LK(Pyramidal LK):普通 LK 只能处理小位移,因为泰勒展开要求 dx 很小,如果运动太大就是直接失效,于是有了图像金字塔。先在顶层金字塔(低分辨率)开始跑 LK 流光,算出粗略位移u,v。把上层得到的位移作为初始值,传到下一层,每层都用 LK 迭代微调位移,一直迭代到原图层,得到最终精确光流。金字塔 LK = 图像金字塔 + 粗到细迭代,已知前一帧关键点,输出这些点再下一帧跑到哪了,本质是点对点轨迹跟踪,不需要重新检测角点、做描述子匹配。而传统特征匹配需要在两帧各自重新检测角点、重新做描述子匹配。

    (3)LK Pipeline

    1.检测特征点,通常Harris、Shi-Tomasi。2.取patch。3.计算图像梯度。4.建立光度误差。5.Gauss-Newton Optimization(高斯牛顿优化)求dx、dy。5.得到 optical flow(光流)。

    Lucas-Kanade 光流本质是跟踪,不是检测、不是匹配。既能用视频连续帧,也能用两张间隔很小的图片。先使用 Shi-Tomasi 提角点,后面每一帧不用再重新检测关键点,LK 直接跟着灰度变化,算出每个点跑到哪。

    1.2 IC-LK(Inverse Compositional Lucas-Kanade)

    如果说 LK 能工作,IC-LK 则能够实时工作,它把原本每次迭代都要重复的大量计算,提前预计算,这是它的本质。

    普通 Forward Additive LK:每次迭代都要重新求 1. Warp image。2. 计算当前图像梯度。3. 计算 Jacobian。4. 计算 Hessian。5. 求 Δp。6. 更新 p。问题是Hessian/Jacobian 每轮都重新计算,代价很大,尤其:视频 60FPS,每帧几百特征点,每点几十次迭代,计算爆炸。

    IC-LK:发现真正变化的是 warp,template 根本没变,于是,它将普通 LK 的优化 I(W(x;p+Δp)) ≈ T(x) 更新 Current Image,反过来 I(W(x;p)) ≈ T(W(x;Δp)) 更新 Template,这就是 Inverse(逆)Compositional(组合)名字的来源。

    为什么这样就快了:因为 Template 是固定的,所以 Template 的 Gradient、Jacobian、Hessian 全部可以预计算,不需要每次去计算warp后的图像。

    局限性:1.只能做小运动,因为依赖(Taylor Linearization)泰勒线性化。2.光照变化敏感,因为目标还是 SSD。3.遮挡敏感,局部 patch 被挡住,优化目标错误。4.低纹理区域容易失败,因为 ∇I≈0,Hessian 不稳定。

    IC-LK 与 金字塔 LK 的关系:IC-LK 解决计算速度慢、迭代效率低的问题,金字塔 Pyramid 解决帧间大位移问题,通过图像金字塔由粗到精逐层缩小位移。工程实际组合:Pyramid IC-LK。

    1.3 KLT(Kanade-Lucas-Tomasi Tracker)

    Kanade-Lucas-Tomasi 跟踪器,本质上是:Shi-Tomasi 角点检测 + Pyramid LK 光流跟踪。它不是新的光流理论,而是一个完整的稀疏点跟踪框架,KLT 属于基于灰度的稀疏直接法,利用:Brightness Constancy(亮度恒定)、Local Patch Alignment(局部灰度对齐)、Pyramid LK(多层金字塔光流)在连续帧中跟踪稳定角点运动。

    KLT 最大特点:第一帧检测角点,后续只跟踪,不重新匹配。因此相比传统 Feature Matching:不需要 descriptor、brute-force matching、FLANN,速度极快。非常适合:Video Tracking(视频跟踪)、Visual Odometry(视觉里程计)、SLAM Frontend(SLAM 前端)。

    (1)优缺点

    优点:1.速度极快。2.适合实时视频。3.亚像素精度高。4.实现简单。5.不需要 descriptor。6.CPU 即可实时运行。

    缺点:1.对光照变化敏感。2.大位移困难。3.快速运动容易漂移。4.长期跟踪容易累计误差。5.遮挡后容易失败。6.弱纹理区域效果差。

    (2)相关问题

    为什么 KLT 必须使用角点:因为 KLT 本质仍然依赖图像梯度。如果区域完全平坦,或者只有单方向边缘,则无法稳定跟踪,因为 Hessian 会退化。例如竖直边缘只有 x 方向梯度,无法确定 y 方向运动,因此边缘不稳定;角点同时具有 x、y 两个方向梯度,因此 Hessian 可逆,适合稳定跟踪。

    为什么 Shi-Tomasi 最适合 KLT:Shi-Tomasi 会寻找两个方向都有明显梯度变化的位置,即真正适合光流跟踪的点,因此 KLT 通常第一步都会使用 goodFeaturesToTrack() 检测 Shi-Tomasi Corner。

    为什么 KLT 非常快:因为 KLT 不做 descriptor、不做 brute-force matching、不做 Hamming Distance、不做 FLANN,只做 Local Patch Optimization(局部灰度优化),因此计算量极小,经典 CPU 实时 Tracking 大量使用 KLT。

    KLT 与 LK 的关系:LK(Lucas-Kanade)本质是光流优化算法,负责求解光流:(u,v)。而 KLT 是完整跟踪框架,本质是:Shi-Tomasi + Pyramid LK + Track Management。因此 KLT 可以理解为工程化的 LK Tracker。

    为什么 KLT 会漂移(Drift):KLT 每一帧都基于上一帧结果继续跟踪,因此误差会不断累计,这叫 Drift(漂移)。长期 Tracking 后,点的位置会越来越偏,因此 VO / SLAM 中通常需要 Re-detect Feature(重新检测特征点)、Keyframe(关键帧)以及 Bundle Adjustment(BA)修正漂移。

    为什么 KLT 适合 VO / SLAM Frontend:VO 前端最需要的是快速稳定 Tracking,而不是复杂 descriptor matching,因此 KLT 非常适合 Frame-to-frame Tracking(帧间跟踪)、Sparse Correspondence(稀疏对应)以及 Motion Estimation(运动估计)。

    (3)KLT Pipeline

    1.输入视频连续帧。2.第一帧检测 Shi-Tomasi 角点。3.对每个角点取 patch。4.计算图像梯度。5.建立 Photometric Error(光度误差)。6.使用 LK 求解光流。7.更新点位置。8.下一帧继续跟踪。本质是 detect once + track many frames。

    经典 VO 通常使用:KLT + RANSAC + Essential Matrix 进行运动估计。

    void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
    参数:src 原图,dst 输出图,code 转换类型,dstCn 输出通道数
    void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask = Mat(), int blockSize = 3, bool useHarrisDetector = false, double k = 0.04);
    参数:image灰度图,corners输出角点,maxCorners最大点数,qualityLevel质量阈值,minDistance点最小间距,mask掩码,blockSize窗口尺寸,useHarrisDetector是否启用 Harris 角点,kHarris 系数
    void calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize = Size(21,21), int maxLevel = 3, TermCriteria criteria = TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,30,0.01), int flags = 0, double minEigThreshold = 1e-4);
    参数:prevImg前帧灰度图,nextImg当前帧灰度图,prevPts前帧特征点,nextPts输出跟踪点,status跟踪状态,err匹配误差,winSize搜索窗口,maxLevel金字塔层数,criteria迭代终止条件,flags算法标志,minEigThreshold最小特征值阈值
    // 应用
    cv::Mat gray1, gray2;
    cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
    cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);

    std::vector<cv::Point2f> pts1, pts2;
    cv::goodFeaturesToTrack(gray1, pts1, 200, 0.01, 10, cv::Mat(), 3, false, 0.04);

    std::vector<uchar> status;
    std::vector<float> err;
    cv::calcOpticalFlowPyrLK(gray1, gray2, pts1, pts2, status, err, cv::Size(15,15), 3, cv::TermCriteria(cv::TermCriteria::EPS|cv::TermCriteria::COUNT,10,0.03));

    // 筛选有效点
    std::vector<cv::Point2f> good1, good2;
    for (int i = 0; i < status.size(); i++)
    {
    if (status[i])
    {
    good1.push_back(pts1[i]);
    good2.push_back(pts2[i]);
    }
    }

    2.稠密直接法

    1.Horn-Schunck Optical Flow:经典 Dense Optical Flow。核心思想:除了满足光流约束,还假设全图光流平滑。目标是同时满足光流约束、全局平滑。

    2.Farneback Optical Flow:OpenCV 常用 Dense Flow,calcOpticalFlowFarneback()。特点:稠密、连续运动场、实时性较好。

    3.TV-L1 Optical Flow:高精度 Dense Optical Flow。相比 Farneback 更抗噪声、抗光照、抗异常值,但计算更慢。

    cv::Ptr<cv::optflow::DualTVL1OpticalFlow> tvl1 = cv::optflow::createOptFlow_DualTVL1();
    cv::Mat flow;
    tvl1->calc(gray1, gray2, flow);
    cv::Mat warp = cv::findTransformFromOpticalFlow(flow, cv::MOTION_HOMOGRAPHY);
    cv::warpPerspective(img1, aligned, warp, img1.size());

    4.Motion Estimation(基于块匹配的直接配准)

    OpenCV 内置 cv::motempl:: 模块 全图分块 → 直接计算灰度差 → 输出全局变换

    cv::Mat flow;
    cv::calcOpticalFlowFarneback(gray1, gray2, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
    cv::Mat warp = cv::findTransformFromOpticalFlow(flow, cv::MOTION_AFFINE);
    cv::warpAffine(img1, aligned, warp, img1.size());

    类别Sparse Optical Flow(稀疏光流)Dense Optical Flow(稠密光流)
    核心思想 只跟踪少量关键点运动 估计每个像素的运动
    跟踪对象 特征点 / Corner / Patch 全图所有像素
    输出 几十~几百个点的位移 整张 Flow Map(二维运动场)
    数据量 极大
    速度 快,适合实时 慢,计算重
    精度 局部较准 全局连续更完整
    适合场景 Tracking、VO、SLAM Motion Analysis、视频理解
    是否需要特征点 通常需要 不需要
    是否利用整图灰度 部分 全部
    对弱纹理区域 容易失败 相对更好
    对大运动 一般需 Pyramid 现代方法更强
    内存占用
    工程复杂度 较低 较高
    OpenCV 常用接口 calcOpticalFlowPyrLK() calcOpticalFlowFarneback()
    典型算法 LK、KLT、IC-LK Horn-Schunck、Farneback、RAFT
    数学本质 Patch Alignment Dense Motion Field Estimation
    常见优化 Pyramid、IC-LK Multi-scale、CNN
    典型用途 点跟踪、稳定角点 视频分割、动作分析

    3.全局直接法

    3.1 ECC(Enhanced Correlation Coefficient)

    ECC(增强相关系数)属于基于灰度的全局直接法,是对整张图优化,让两张图整体尽可能一致,本质上是求一个Warp(变换),使 Image Warp 后尽可能和 Image2 一致,也就是对齐。

    LK 的本质是最小化 SDD(灰度差),而 ECC 关注灰度变化趋势是否一致,即最大化 Correlation(相关性)。本质上两张图越相似,ECC 越大,优化目标是 max corr(I1, I2)。

    普通直接法非常怕亮度变化、对比度变化、曝光变化,而 ECC 会去值除方差,因此抗光照变化,即使整体亮一点或暗一点,只要纹理结构一致,仍然能对齐。

    (1)优缺点

    优点:1.亚像素精度高,因为直接优化灰度。2.光照鲁棒。3.不需要特征点,弱纹理也能工作。4.数学优雅。

    缺点:1.对初始化敏感,如果初始化差距太大,容易失败。2.计算量较大,因为整图优化。3.动态场景差,移动物体会破坏 photometric consistency(光度一致性)。4.大透视变化困难,尤其非平面场景。

    (2)相关问题

    为什么需要 Warp Jacobian:因为优化器需要知道:参数变化->像素位置变化->灰度变化,也就是warp改一点图像会怎么变化,所以ECC本质还是 Nonlinear Optimization(非线性优化)。

    为什么需要 Pyramid:原始 ECC 问题只能处理小位移,如果两图距离差距太大,优化会掉进 Local Minimum(局部最优),所以使用 Image Pyramid(金字塔),与 Pyramid LK 思想一样。

    为什么动态场景容易失败:因为动态物体会破坏 Photometric Consistency(光度一致性),于是优化目标错误,所以对于动态场景,基于特征的方法更鲁棒,ECC 更脆弱。

    ECC 和 LK 关系:LK 本质是 Patch Alignment(小窗口)对齐;ECC 本质是 Whole Image Alignment 整图对齐。两者共同核心都是 Photometric Optimization(灰度优化)。

    Photometric Optimization(光度优化/灰度优化):不用特征点、不用匹配点,直接用像素灰度值做误差最小化,迭代求解相机位姿 / 图像变换矩阵的优化方式。

    为什么属于直接法:没有keypoint、descriptor、matching,而是 warp(x;p) 直接优化 p(变换参数,Transformation Parameters),使 warp 后图像与目标图像灰度最相似。

    (3)Pipeline

    1.初始化warp,例如平移、仿射、单应性。2.Warp Image1,把 Image1 投影到 Image2 坐标系。3.计算 ECC Score,即两张图相关性。4.Compute Jacobian、Build Hessian、Gauss-Newton Optimization。5.更新Warp。6.直到收敛。

    double findTransformECC(InputArray templateImage, InputArray inputImage, InputOutputArray warpMatrix, int motionType, TermCriteria criteria, InputArray inputMask, int gaussFiltSize);
    功能:基于增强相关系数(ECC)的全局灰度图像配准,无需特征点,直接迭代计算两幅图像之间的变换矩阵,实现整图对齐。
    参数:
    templateImage:基准 / 参考图像(灰度图)
    inputImage:待配准的输入图像(灰度图)
    warpMatrix:输出变换矩阵(平移 / 旋转 / 仿射 / 单应)
    motionType:变换类型
    – MOTION_TRANSLATION:平移,2 DOF
    – MOTION_EUCLIDEAN:平移 + 旋转(刚性),3 DOF
    – MOTION_AFFINE:仿射,6 DOF
    – MOTION_HOMOGRAPHY:透视单应,8 DOF
    criteria:迭代停止条件(次数 + 精度)
    inputMask:掩码(不需要填 Mat ())
    gaussFiltSize:高斯滤波窗口大小(默认 5)

    内部基本for iteration:1. Warp input image 2. Compute image gradient 3. Compute ECC score 4. Compute Jacobian 5. Build Hessian 6. Solve delta_p 7. Update warp 8. Check convergence
    本质是 Gauss-Newton nonlinear optimization(高斯-牛顿非线性优化)。

    注意:1.必须是灰度图。2.必须 float32。

    方法类型速度精度适合场景OpenCV 函数
    LK 光流 + 单应 稀疏直接法 极快 小运动、视频稳像 calcOpticalFlowPyrLK
    ECC 全局直接法 中慢 很高 整图对齐、医学图像、弱纹理 findTransformECC
    Phase Corr 频域直接法 超快 低(仅平移) 平移图像 phaseCorrelate
    Farneback 稠密直接法 中高 连续帧、视频 calcOpticalFlowFarneback
    TV-L1 稠密直接法 最高 高精度配准、噪声图像 DualTVL1OpticalFlow

    4.相位相关法(Phase Correlation)

    基于频域的图像配准方法,利用傅里叶变换的平移性质通过频谱相位差估计两幅图之间的平移量。

    核心思想:假设两幅图仅存在平移,$g(x,y)=f(x-\\Delta x,\\, y-\\Delta y)$

    (1)相关概念

    傅里叶变换:图像再空间域中的平移会变成傅里叶域中的相位变化,而幅值不变。假设两张图,I2​(x,y) 是 I1​(x,y) 平移得到 $I_2(x,y)=I_1(x-\\Delta x,\\, y-\\Delta y)$,那么它们傅里叶变换满足。幅值不变$F_2(u,v)=F_1(u,v)e^{-j2\\pi(u\\Delta x+v\\Delta y)}$,只改变相位增加 $e^{-j2\\pi\\bigl(u\\Delta x + v\\Delta y\\bigr)}$,这意味着图像平移关系完全隐藏再相位差里面,因此只要分析相位就能恢复 (Δx,Δy)。

    为什么幅值不变:F1​(u,v) 本身是一个复数,可以写成幅值 + 相位的形式:F_1(u,v)=|F_1(u,v)|\\cdot e^{j\\phi_1(u,v)} 。后面乘的e^{-j2\\pi(u\\Delta x+v\\Delta y)}也是一个复数,它的形式是单位复数,幅值永远是 1(因为\\big|e^{j\\theta}\\big| =1)它的相位是 −2π(uΔx+vΔy)。将 F1 的复数形式带入得F_2(u,v) = \\left( |F_1| \\cdot e^{j\\phi_1} \\right) \\cdot e^{-j2\\pi(u\\Delta x + v\\Delta y)}F_2(u,v) = |F_1| \\cdot e^{j\\left( \\phi_1 - 2\\pi(u\\Delta x + v\\Delta y) \\right)},幅值部分还是 |F1| 没有变化;相位部分:变成了\\phi_1 - 2\\pi\\left(u\\Delta x + v\\Delta y\\right) ,比原来多了一个固定的线性偏移,所以说 “只改变相位”。任何复数都可以写成极坐标形式:z = r \\cdot e^{j\\theta}。其中:r=∣z∣ 是模(幅值),θ 是辐角(相位),\\left| e^{j\\theta} \\right|是单位复数,乘以单位复数,幅值不变,只会让复数在复平面上绕原点旋转一个角度 θ,也就是相位变化。

    傅里叶域(频域):图像原本以像素坐标 (x,y) 描述,叫空间域;经过傅里叶变换后,改用频率 (u,v) 描述,这个新的表达空间,就是傅里叶域(频域)。

    幅值和相位:傅里叶变换公式 F(u)=A(u)⋅ejφ(u),A(u) 幅值,该频率分量的强度 / 权重;φ(u) 相位,代表该频率分量的位置 / 偏移信息,决定波形在空间中的分布、位置、形状轮廓。

    计算互功率谱归一化幅值:F_2^{*},是 F2​ 的复数共轭(虚部取反),互功率谱
    R(u,v)=e^{j2\\pi(u\\Delta x+v\\Delta y)},幅值全部被归一化,只剩相位信息。

    R(u,v) = \\frac{F_1(u,v)\\,F_2^*(u,v)}{\\left|F_1(u,v)\\,F_2^*(u,v)\\right|}

    分子:F_1 \\cdot F_2^* = F_1 \\cdot F_1^* \\cdot e^{j2\\pi(u\\Delta x + v\\Delta y)}F_1 \\cdot F_2^* = \\left|F_1\\right|^2 \\cdot e^{j2\\pi(u\\Delta x + v\\Delta y)}\\left|F_1 F_2^*\\right| = \\left|F_1\\right|^2 \\cdot \\left|e^{j2\\pi(u\\Delta x + v\\Delta y)}\\right|

    分母:\\left|F_1 F_2^*\\right| = \\left|F_1\\right|^2 \\cdot \\left|e^{j2\\pi(u\\Delta x + v\\Delta y)}\\right|

    相除化简:R(u,v) = \\frac{\\left|F_1\\right|^2 \\cdot e^{j2\\pi(u\\Delta x + v\\Delta y)}}{\\left|F_1\\right|^2}=e^{j2\\pi(u\\Delta x + v\\Delta y)}

    傅里叶逆变换:记逆变换为 \\mathcal{F}^{-1}I(x,y)=\\mathcal{F}^{-1}\\left[R(u,v)\\right],根据傅里叶变换对偶性质:
    \\mathcal{F}^{-1}\\left\\{e^{j2\\pi(u\\Delta x+v\\Delta y)}\\right\\} = \\delta(x-\\Delta x,\\; y-\\Delta y),空域图像 I(x,y) 上,仅在坐标 (Δx,Δy) 处出现一个尖锐峰值;其余位置数值近似为 0。峰值所在坐标 (Δx,Δy),就是两幅图像之间的平移量。

    平移性质:空间域平移 g(x,y)=f(x−Δx,y−Δy),在频域变成相位移动。

    旋转性质:空间域旋转 f(r,θ)→f(r,θ−Δθ),在极坐标里旋转变成角度方向平移。

    缩放性质:空间域缩放 f(ax,ay),会在频域产生半径方向缩放,对半径取log,log(ar)=loga+logr,将缩放变成了平移。

    低通滤波:保留低频,滤除 / 削弱高频。

    (2)优缺点

    优点:1.亚像素配准。2.抗光照,使用互功率谱去掉幅值。3.FFT,快速傅里叶变换,时间复杂度为O(NlogN)。4.无需特征点。

    缺点:1.只能处理整体平移,解决方法 Fourier-Mellin Transform(梅林变换)。2.对遮挡敏感,傅里叶变换是全局变换。3.对局部形变差。4.周期纹理可能多峰,多个对齐都可能对齐成功。

    (3)FMT(傅里叶–梅林变换)

    Phase Correlation 的扩展版,用于解决平移 + 旋转 + 缩放配准问题。核心是将旋转和缩放转换成平移,然后再用 Phase Correlation 求解。

    整体流程:

  • 对图像 f(x,y) 做 FFT 快速傅里叶变换得到 F(u,v):平移只影响相位,而旋转/缩放只要影响频谱结构。
  • 取频谱幅值:取 \\left|F(u,v)\\right|,去除平移影响。
  • 转极坐标:坐标 (u,v) 变成 (r,θ)。此时旋转变成了θ方向平移。
  • Log-Polar变换:对半径 r 取对数 ρ=logr 得到 (ρ,θ),将缩放变成ρ方向平移。
  • 相位相关:对 Log-Polar 图重新做 FFT,构造互功普率,傅里叶逆变换,寻找峰值,得到 (Δρ,Δθ),Δθ就是图像旋转角度,Δρ=logs,Δρ=logs,缩放半径s=e^{\\Delta \\rho}
  • 去除旋转缩放后,在做一次普通 phase correlation,求(Δx,Δy)。
  • (4)基于傅里叶极坐标的方法

    不做log,只做 Polar Transform + Phase Correlation。

    整体流程:

  • FFT。
  • 取频谱幅值。
  • 转极坐标。
  • 对极坐标图做相位相关。
  • 去除旋转,做普通相位相关求平移
  • FMT只是经典频域配准框架,还有很多改进版。传统FMT的问题有对透视弱、对局部形变差、对遮挡敏感、边缘效应明显、对重复纹理不稳定、对非均匀尺度差。因此现代很多改进本质都是让频域配准更局部、鲁棒、稳定。

    (5)Windowed FMT

    在FMT前加窗口函数 Hanning/Hamming 减少 spectral leakage(频谱泄漏)。FFT 默认图像边界周期连续,强行周期延拓,实际边缘会突变导致频谱泄露。例如图像:黑边 | 图像 | 白边;延拓 … 白边 | 黑边 | 图像 | 白边 | 黑边 | 图像 | 白边 …。

    窗口本质上是一个权重函数,对边缘逐渐衰减,例如中心权重为1,边缘逐渐变0。

    (6)Pyramid FMT

    多尺度FMT,构建 Gaussian Pyramid,从粗尺度到细尺度逐层FMT,提升对大尺度变化和噪声的鲁棒性。。

    整体流程:

  • 构建图像金字塔。
  • 每一层独立做 FMT。
  • 粗到细:从低分辨率到高分辨率,粗尺度估计全局结构,系尺度做精确
  • 结果融合:常见融合方式:1.置信度加权T=\\sum w_l\\,T^l。2.频谱峰值一致性投票。3.只用低层初始化,用高层特征修正。
  • 金字塔的作用:1.降低频谱复杂度,低分辨率下高频被抑制,主结构更明显。2.增强大位移鲁棒性,大位移在高分辨率下很难匹配,在低分辨率变成小位移。3.减少 log-polar 采样误差,log-polar 对高频很敏感,金字塔的天然低通滤波。

    (7)Local FMT

    LFMT 对局部patch 进行FFT,对每个patch 独立估计旋转、缩放、平移,再进行全局融合。

    标准 FMT 假设整图图像满足“全局相似变换”,1.遮挡,FFT被污染;2.动态物体,非刚性扰动;3.视差,局部几何不一致;4.非平面场景,单一单应性不成立;5.局部纹理强但全局弱,峰值不稳定;这些场景可能失败。

    核心思想是从全局频域 → 局部频域集成,将图像划分为 patch:I→{P1​,P2​,…,PN​},对每个patch:

  • 局部 FFT。
  • log-polar 变换
  • 相位相关:估计局部变换,T_i=\\left(\\Delta x_i,\\;\\Delta y_i,\\;\\theta_i,\\;s_i\\right)
  • 不直接输出一个全局变换,而是输出一组局部运动场。
  • 融合策略:1.RANSAC 融合,假设大部分 patch 满足同一运动模型。2.加权平均,T=\\sum w_{i}\\,T_{i},权重来自 FFT 峰值锐度、频谱能量、区域纹理丰富度。3.图优化(高级版本)。
  • (8)Sub-pixel Phase Correlation

    标准 Phase Correlation 得到的峰值位置(位移)通常只能精确到整数像素,亚像素相位相关对 correlation peak 做局部曲面拟合,把位移估计从整数像素精度 → 亚像素精度。

    常见的亚像素估计方法:

    1.抛物线拟合(最常用):在峰值附近取 3*3 或 1维邻域 f(−1) f(0) f(1),拟合 f(x)=ax2+bx+c,峰值位置\\delta x=\\frac{r_{-1}-r_{+1}}{2(r_{-1}-2r_0+r_{+1})},最终亚像素位置x=x_0+\\delta x。简单、快。

    2.高斯拟合:假设峰值服从f(x)=Ae^{-\\frac{(x-\\mu)^2}{2\\sigma^2}},取log:\\ln f(x)=-\\frac{(x-\\mu)^2}{2\\sigma^2},拟合得到 μ = 亚像素位置。更平滑、抗噪更好。

    3.质心法:在峰值邻域求x^{*}=\\frac{\\sum x_i f_i}{\\sum f_i}。稳定,不需要拟合模型,但是对噪声敏感,峰不尖锐时误差大。

    4.sinc 插值(理论最优):理想相关峰是 sinc 函数,对离散点做 sinc interpolation(幸格插值)得到连续函数。理论最精确,但计算复杂,工程较少用。

    (9)WPC(Weighted Phase Correlation)

    普通 PC 所有频率权重一样。但低频容易受光照影响,高频容易受噪声影响。加权相位相关引入权重函数R_W(u,v)=\\frac{F(u,v)\\cdot G^{\\ast}(u,v)}{W(u,v)\\cdot\\vert F(u,v)\\cdot G^{\\ast}(u,v)\\vert},将频域变成加权投票系统。

    权重函数:

    1.​低频优先(Low-frequency emphasis):W(u,v)=\\frac{1}{1+\\sqrt{u^2+v^2}},​会强化结构轮廓、抑制高频噪声,适合模糊图像、低纹理场景。

    2.高频增强(Edge-aware):W(u, v) = \\sqrt{u^2 + v^2},强化边缘信息、提高定位锐度,适合高纹理、需要精确亚像素定位的场景。

    3.带通加权(Band-pass weighting):W(u, v) = \\begin{cases} 1, & r_1 \\leq \\sqrt{u^2 + v^2} \\leq r_2 \\\\ 0, & \\text{otherwise} \\end{cases}

    ,只让中频结构参与相位相关,结构信息更稳定,抗光照变化(去低频),抗噪声(去高频),峰值更尖锐(更利于 sub-pixel)。但是参数 r1,r2r_1, r_2r1​,r2​ 需要调,场景变化大时容易失效(尺度不匹配),

    4.SNR-based weighting(工程常用):V(u, v) = \\frac{\\left|F(u, v)G^{*}(u, v)\\right|}{\\left|F(u, v)G^{*}(u, v)\\right| + \\epsilon}

    ,根据信噪比自适应加权,信噪比高权重大,噪声频率低权重低。

    5.现代 Direct VO / SLAM

    VO(Visual Odometry):视觉里程计,估计相机运动,输入连续图像,每一帧只和前一帧做帧间对齐 / 运动估计,不断累加帧间运动,跑出相机行走轨迹。

    SLAM(Simultaneous Localization and Mapping):同步定位与地图构建,目标是一边定位,一边建图,即不仅知道 camera 在哪里,还知道环境长什么样。在 VO 连续逐帧对齐算轨迹基础上再加:1.构建三维环境地图。2.回环检测:隔很久的旧帧和当前帧匹配对齐,修正轨迹漂移。3.全局 BA 优化统一校正所有位姿与地图点

    对齐方法:

    1. 特征点法对齐(间接法):先提取特征→匹配特征→用匹配对求解相对位姿

    常用特征

     – FAST、Harris、Shi-Tomasi 角点

     – ORB(工程首选,FAST 角点 + 旋转 BRIEF 描述子)

     – SIFT、SURF(精度高、速度慢)

    优点:对光照、轻微形变鲁棒,稳定性强

    缺点:极度依赖纹理,弱纹理场景无特征直接失效

    代表:ORB-SLAM 系列

    2. 直接法对齐(不靠特征,纯灰度优化):利用灰度不变假设,最小化帧间灰度误差优化位姿

    (1)稀疏直接法

    代表:LK/KLT 光流、DSO

    做法:只选取高梯度稀疏像素 / 角点周边小图像块,做局部 Patch 对齐,最小化 SSD 灰度平方误差

    特点:速度快;弱纹理效果差,无梯度区域无法跟踪

    流程:提角点→块灰度匹配→求像素偏移→解位姿

    (2)半稠密直接法

    代表:LSD-SLAM

    做法:选取整片梯度达标连续区域成片像素参与优化

    特点:兼顾速度与像素利用率,普通弱纹理可适配,纯白无梯度区域失效

    (3)稠密直接法

    做法:使用图像全部像素构建光度误差

    特点:弱纹理适配最强,依靠全局像素关联推断运动;运算量大、实时性差

    (4)全局直接对齐 ECC

    原理:最大化全局灰度互相关,匹配整张图灰度变化趋势,求解统一全局变换矩阵

    特点:不依赖局部特征点,适合整张图像整体对齐;大面积弱纹理 + 光照变化效果下降

    3. 现代深度学习对齐方法

    (1)深度特征匹配:SuperPoint+SuperGlue、LoFTR

    弱纹理、大视差、遮挡场景匹配能力远超传统特征

    (2)深度光流对齐

    代表:RAFT、PWC-Net、RAFT

    代表:PWC-Net、RAFT,替代传统 LK,大运动、弱纹理跟踪更稳

    (3)端到端位姿对齐

    DeepVO、DPVO 直接输入前后帧回归相对位姿,跳过人工匹配流程。

    为什么会需要 Camera Model(相机模型):因为相机拍到的图像本质是 3D 世界投影到 2D图像,VO / SLAM 必须知道 3D 点如何变成 2D 像素,否则无法从图像恢复运动。

    Pinhole Camera(小孔成像模型):这是视觉 SLAM 最基础模型,核心思想是光线穿过一个小孔投影到成像平面。三维点:P=(X,Y,Z)

    其中:fx、fy 表示焦距;cx、cy 主点;Z 深度。

    Intrinsics(相机内参):相机如何把 3D 映射到像素坐标。

    Distortion(畸变):真实镜头并不是理想 pinhole(针孔),因此会产生畸变。1.Radial Distortion(径向畸变),表现为图像边缘弯曲,包括:Barrel(桶形)Pincushion(枕形)。2.Tangential Distortion(切向畸变),镜头安装不完全平行导致。为什么必须矫正?因为 VO / SLAM 极度依赖几何精度,畸变会导致:Projection Error、Pose Error、Tracking Error。

    Projection(投影):这是 3D → 2D 过程,即 P=(X,Y,Z) 变成 p=(u,v),投影本质是相机看到世界。

    Back Projection(反投影):这是2D → 3D 过程,但是单个像素无法恢复 3D,因为缺少 Depth,所以必须像素+深度三维点,P=(p,d)/π。

    DIrect VO 的 Warp 本质就是 p′=π(T(p,d)/π):1.当前像素p反投影得到3D点。2.相机运动T∈SE(3)。3.再重新投影得到下一帧像素p′。

    Reprojection Error(重投影误差):Feature-based SLAM 核心 e=p−p^,即真实位置减去预测投影位置。假设有 3D 点和相机位姿,那么可以预测这个 3D 点应该投影到哪里​。

    Photometric Error(光度误差):这是 Direct SLAM 灵魂,例如:LSD-SLAM、DSO。本质不是比较点的位置,而是比较灰度,即E=I1​(p)−I2​(p′)。所以 Feature-based 优化几何误差、Direct Method 优化光度误差。

    SE(3)(Special Euclidean Group 3D):现代 SLAM 核心,三维特殊欧氏群(旋转 + 平移),描述三维空间刚体变换。

    SO(3):三维特殊正交群(只表示旋转),是所有旋转矩阵集合。

    Lie Algebra(李代数):这是现代 SLAM 最大门槛之一。为什么需要李代数,因为旋转矩阵不能直接加减。优化时不能:R = R + dR,这是错的。正确做法是使用 Lie Algebra 进行小扰动更新。

    为什么 Brightness Constancy 不成立:真实相机存在 Auto Exposure、Gamma、Vignetting、Sensor Response、Motion Blur,因此即使同一个点,灰度也会变化,所以现代 Direct VO 不再假设 I1=I2,而是I2=aI 1+b,甚至更复杂曝光模型。

    Bundle Adjustment(BA):视觉优化核心,本质是联合优化 Camera Pose、3D Landmark 使整体误差最小,不是局部修正,而是全局联合优化。Feature-based 最小化 Reprojection Error。Direct-based 最小化 Photometric Error。

    类别Feature-based SLAM(特征法)Direct SLAM(直接法)Semi-Direct SLAM(半直接法)
    核心思想 提取特征点并匹配 直接优化像素灰度 特征 + 灰度混合
    优化对象 Reprojection Error(重投影误差) Photometric Error(光度误差) 两者结合
    使用内容 Keypoint + Descriptor Pixel Intensity(像素灰度) Sparse Feature + Gray
    是否需要 Descriptor 需要 不需要 通常只部分需要
    是否需要 Matching 需要 不需要显式 Matching 部分需要
    数学核心 几何优化 光度优化 几何 + 光度
    本质驱动 Geometry-driven Photometric-driven Hybrid-driven
    典型误差 || p−p^​ || 平方 || I1​−I2​ || 平方 混合误差
    对光照变化 更鲁棒 较敏感 中等
    对弱纹理区域 较差 更强 中等
    对运动模糊 较鲁棒 较敏感 中等
    对初始化敏感 较低 很高 中等
    是否依赖梯度 间接依赖 强依赖 部分依赖
    是否依赖角点 强依赖 不一定 部分依赖
    是否需要高纹理 通常需要 不完全需要 中等
    稀疏 / 稠密 稀疏 稀疏 / 半稠密 / 稠密 半稀疏
    计算量 中等 较高 中等
    实时性 较好 Dense 较慢 很好
    抗大位移能力 中等
    亚像素精度 中等 很高 较高
    是否容易局部最优 相对不容易 容易 中等
    是否适合动态场景 更适合 较差 中等
    是否适合弱纹理 较差 更强 中等
    是否适合低算力设备 较适合 Dense 不适合 很适合
    地图表示 Sparse Landmark Dense / Semi-Dense Map Sparse Map
    BA 优化对象 Pose + Landmark Pose + Photometric Pose + Sparse Depth
    典型系统 ORB-SLAM、PTAM LSD-SLAM、DSO SVO
    典型前端 ORB/SIFT/SURF Direct Alignment Feature + Direct
    典型优化 Bundle Adjustment Photometric BA Hybrid Optimization
    代表核心公式 e=p−p^​ E=I1​−I2​ 混合
    工程难点 特征稳定性 光照、初始化、优化稳定性 系统融合复杂
    现代趋势 稳定成熟 精度高、理论优雅 工程实用性强
    适合初学者 最适合 数学门槛高 中等
    本质区别 优化几何对应关系 优化灰度一致性 同时利用两者

    三、基于深度学习的方法

    Feature-based 问题:弱纹理困难、光照敏感、重复纹理容易误匹配。

    Direct Method 问题:光照敏感、初始化敏感、动态场景困难。

    核心思想:利用 CNN 自动学习哪些点稳定、哪些 descriptor 更适合匹配;让 feature 对旋转、尺度、光照、模糊更加鲁棒。

    深度学习特征提取器:

    方法核心定位一句话特点
    SuperPoint Learned Keypoint + Descriptor 端到端学习的角点检测 + 描述子,是深度学习特征的 “标配”,常和 SuperGlue 搭配使用。
    DISK 可学习特征 轻量高效的可学习局部特征,兼顾精度和速度,适合实时场景。
    R2D2 Reliability-aware feature 带 “可靠性感知” 的鲁棒特征,能预测特征质量,过滤低质量点,抗干扰更强。
    D2-Net Dense CNN Feature 密集 CNN 特征,不依赖稀疏关键点,直接在特征图上做匹配,弱纹理场景更稳。

    深度学习匹配 / 光流方法(做对应关系):

    方法核心定位一句话特点
    SuperGlue Learned matching 基于 Transformer 的可学习匹配器,专门给 SuperPoint 这类特征做 “精准配对”,抗误匹配能力极强。
    LoFTR Dense matching 无关键点的密集匹配,用 Transformer 直接在特征图上建立对应,视角变化大时表现很好。
    RAFT Optical flow 基于循环迭代的光流估计,精度高、鲁棒性强,是深度学习光流的标杆方法。

    端到端深度 SLAM/VO(直接输出位姿):

    方法核心定位一句话特点
    DROID-SLAM Deep SLAM 端到端的深度 SLAM,用深度学习做前端匹配 + 后端优化,单目也能实现稳定的三维重建。
    DPVO Deep VO 基于光流的深度视觉里程计,直接估计相机运动,在快速运动、弱纹理场景表现远超传统 VO。

    优点:

    极强的鲁棒性与语义理解:网络不仅能看梯度,还能理解“这是一张桌子,那是一堵墙”。对极端光照变化(白天到黑夜)、剧烈动态模糊、大范围视角更迭具备传统算法无法比拟的鲁棒性。

    摆脱人工假设:不需要生搬硬套“亮度恒定”或“几何刚性”等假设,通过数据规律自适应拟合复杂退化场景。

    精度上限高:在学习了海量场景先验后,在特定或复杂环境下的配准精度往往能超越传统方法。

    缺点:

    算力与功耗要求高:需要强大的 GPU 算力支持,在嵌入式设备(如小型无人机、微型传感器)上落地存在严重的实时性挑战。

    泛化能力(Generalization)受限:在训练集类似的场景表现惊艳,但一旦进入全新的“未知领域”(Out-of-Distribution),网络可能产生难以预测的离奇漂移。

    可解释性差(黑盒模型):由于缺乏严谨的几何数理推导,系统出错时很难进行局部 debug 或给出置信度上限。

    1. SuperPoint

    深度学习局部特征。SIFT、ORB、AKAZE全都是人手工设计规则,SuperPoint第一次让网络自己学习什么点稳定、什么描述最好,本质是用神经网络同时学习关键点+描述子。

    传统特征本质靠人工规则,如梯度、角点、Hessian、灰度差,而SuperPoint直接从大量数据中学习什么特征最稳定,因此,它对光照变化、弱纹理、模糊、复杂视角通常更稳定。

    本质结构:输入Image,网络输出Heatmap(关键点概率)、Descriptor Map(描述子),即Detector + Descriptor同时输出。

    传统ORB:FAST + BRIEF;而SuperPoint:CNN + CNN(网络自己学哪些位置适合做关键点、如何描述局部纹理)。

    整体流程:

    1. 输入图像:输入单张灰度图像(尺寸任意,通常缩放到模型预设尺寸)。

    2. CNN Backbone(主干编码器):采用类 VGG 风格的卷积网络,通过卷积 + 池化提取高维特征。最终输出:分辨率为原图 1/8 的特征图(输入 H×W → 输出 H/8 × W/8 × C)。

    3. 双分支输出头:

    3.1 Detector Head(关键点检测头):对主干特征图做卷积,生成关键点概率图(Heatmap)。输出维度:H/8 × W/8 × 65(65 = 8×8 网格内 64 个候选位置 + 1 个无特征点背景通道)。

    3.2 Descriptor Head(描述子头):对主干特征图做卷积,生成稠密描述子图(Dense Descriptor Map)。(输出维度:H/8 × W/8 × 256,每个像素位置对应一个 256 维描述向量,用于后续特征匹配)。

    4. NMS 非极大值抑制:从概率图中提取候选关键点,保留局部响应最强的点,去除局部重复响应。输出:一组稀疏、高精度关键点坐标。

    5. 提取对应描述子:根据关键点坐标,在稠密描述子图上双线性插值(由于关键点坐标通常不是整数位置,因此 Dense Descriptor Map 需要使用 Bilinear Interpolation(双线性插值)从邻近四个点,计算当前关键点的 descriptor。这样,descriptor 更平滑、更稳定)得到每个关键点的 256 维描述子,并做 L2 归一化。

    6. 描述子匹配:对两幅图像提取的描述子进行最近邻匹配 / 比率测试,得到初始匹配点对。

    7. RANSAC 剔除误匹配:使用 RANSAC 估计几何模型,自动剔除外点。

    8. 输出最终变换:输出单应矩阵 H,完成图像配准。

    相关概念:

    CNN(Convolutional Neural Network,卷积神经网络) 是一类专门用于处理网格状数据(如图像、视频、时序信号)的深度学习模型。它的核心特点是利用卷积运算自动提取局部特征(如边缘、纹理、形状),并通过参数共享和稀疏连接大幅减少计算量。

    SuperPoint 是 Fully Convolutional Network(全卷积网络):意思是网络中只有:Convolution(卷积)Pooling(池化),没有Fully Connected Layer(全连层),因此输入图像尺寸可以变化,因为输出Feature Map(特征图)会自动同比缩放。

    Detechtor Head :输出每个位置是关键点的概率,网络自己学习哪些点稳定、可重复。

    Cell/Grid(网格单元)思想:由于Backbone(主干网络)经过Pooling(池化)和Stride(步长下采样),最终原图:H × W,特征图:H/8 × W/8。所以特征图上一个像素,对应原图8 × 8 区域,因此Detector Head并不是检测这个像素是不是关键点,而是这个 8×8 Cell(网格单元)内哪个位置是关键点。这也是65=64+1的来源。

    Softmax(归一化概率):Detector Head 输出后需要做Softmax(概率归一化),将65个通道转换成所有位置概率和=1,即网络预测这个Cell内最可能出现关键点的位置。

    Background Channel(背景通道):Detector Head 输出H/8 × W/8 × 65,其中前64个通道表示8*8网格中64个候选位置,第65个通道表示Background(背景),相当于一个垃圾桶,让网络可以选择这个 cell 里不输出任何关键点。

    Descriptor Head:输出每个像素位置对应一个高维向量,例如256维描述子,之后在关键点位置直接取对应descriptor用于匹配。

    Dense Descriptor(稠密描述子):传统特征先检测关键点,再计算描述子。而SuperPoint一次性计算整张图所有描述子,网络直接输出H/8 × W/8 × 256,后面只需要在关键点位置Sampling(采样)即可。

    训练思想:1.MagicPoint:先合成几何图形,例如:线、角、三角形,训练角点检测。2.Homographic Adaptation:对真实图像不断做Homography变换,学习哪些点在变换后仍稳定。

    SuperPoint Descriptor:通常256维浮点向量,匹配一般使用L2距离。

    Repeatability(可重复性):SuperPoint 真正优化的是重复检测能力,意思是同一个物理点,在不同光照、视角、尺度、模糊情况下还能再次被检测出来。

    SuperPoint 的局限性:1.大视角变化仍有限,因为仍然属于Local Feature(局部特征)。2.重复纹理容易误匹配,例如:窗户、地砖、栅栏。3.弱纹理区域仍困难,例如白墙、天空。4.描述子维度高,计算和内存更大。

    SuperGlue:SuperPoint负责检测和描述,SuperGlue负责Learned Matching(学习匹配),使用Graph Neural Network(图神经网络)、Attention(注意力机制)学习哪些点应该匹配。传统匹配(BFMatcher、FLANN)只看:描述子像不像。SuperGlue 看三样东西:1.描述子相似度(像不像)。2.关键点坐标位置(在哪)。3.整张图的上下文结构(场景布局)。用 Transformer 做全局推理(相当于 “理解场景”),几乎不会错匹配。

    Deep Feature + Classical Geometry(深度特征 + 传统几何):SuperPoint只学习特征点和描述子,但后面匹配 RANSAC、Homography 仍然是Classical Geometry(传统几何)。

    Grayscale Image(灰度图像):SuperPoint 通常输入 Grayscale Image,因为局部特征更关注边缘、梯度、几何结构,而不是颜色语义。

    传统 ORBSuperPoint
    FAST Detector Head
    BRIEF Descriptor Head
    detect() Heatmap
    compute() Descriptor Map
    人工规则 神经网络学习

    2. SuperGlue

    深度学习特征匹配网络,输入两张图的关键点 + 描述子(通常来自 SuperPoint),输出精准匹配 + 自动剔除错误匹配,尤其在重复纹理(墙、地面)、光照变化、大视角变化、遮挡。

    传统匹配(BFMatcher、FLANN):只看描述子距离、没有全局上下文、重复纹理必乱配、必须手动 RANSAC 筛外点。

    SuperGlue:使用Graph Neural Network(图神经网络)、Attention(注意力机制)学习哪些点应该匹配。SuperGlue 看三样东西:1.描述子相似度(像不像)。2.关键点坐标位置(在哪)。3.整张图的上下文结构(场景布局)。用 Transformer 做全局推理(相当于 “理解场景”),几乎不会错匹配。

    SuperGlue 只有两大块:1.Attentional Graph Neural Network(注意力 GNN)。2.Optimal Matching Layer(最优匹配层,Sinkhorn)。

    整体流程:关键点 + 描述子 → 特征编码 → 多头自注意力 + 交叉注意力 → 匹配得分矩阵 → Sinkhorn(熵正则化最优传输(OT)快速求解算法) → 最终匹配

    特征编码:把每个关键点的128维描述子d、坐标(x,y)合并成一个新向量,让网络同时懂外观和位置。

    多头注意力 GNN:两种注意力来回做4~6层:

     – Self-attention(图内):同一张图里,关键点互相看上下文(比如 “这个点在角落,周围点少,应该是独特特征”)。

     – Cross-attention(图间):两张图的关键点互相看(比如 “A 图的这个点,在 B 图哪个区域最像”)。

     – 结果:每个关键点的向量都被全局上下文增强,不再是孤立的 128 维。

    Sinkhorn 最优匹配:

     – 传统最近邻匹配问题:贪心就近匹配,会出现一对多抢同一个点比如 A1、A2 都匹配到 B1,匹配冲突、错乱,不符合真实一对一匹配规则。

     – SuperGlue + Sinkhorn :把特征匹配改成可微分最优分配问题,用 Sinkhorn 迭代算出双随机匹配矩阵 P,满足三条规则:1.源图一个特征点最多只匹配目标图一个点。2.目标图一个特征点最多只被一个源点匹配。3.允许无匹配(整行 / 整列为 0),适配遮挡、外点、无对应特征。

     – 得出匹配:矩阵里数值P ij 越大,代表 A 第 i 个点与 B 第 j 个点匹配置信度越高,直接取数值最大的位置,作为最终正确匹配对。

    3. LoFTR

    基于Transformer的无检测器局部特征匹配方法(Detector-Free Local Feature Matching with Transformers)。传统方法全都是先检测关键点、提取描述子,再做匹配,如果detector检测不到点,后面就全没了。而LoFTR的核心思想是不要检测器,直接对整张图提取稠密特征,让网络自己学哪里该匹配。以前先找点,现在先找对应关系,这是本质变化。

    优点:1.弱纹理强,因为不依赖 detector。2.大视角强,Attention能学习全局关系。3.模糊强,因为上下文帮助巨大。

    缺点:1.很慢,因为Dense Attention复杂度高。2.很吃显存,尤其高分辨率。3.移动端部署难,因为Transformer重

    方案范式是否要关键点适用场景
    SuperPoint+SuperGlue 先检测关键点→提描述子→Transformer 匹配 纹理丰富、普通图像
    LoFTR 稠密特征 + 粗粒度→细粒度 双层 Transformer 匹配 不要关键点 弱纹理、重复纹理、反光、室内复杂场景

    整体流程:Image0 + Image1->CNN Backbone(卷积主干网络)->Dense Feature Map(稠密特征图)->Positional Encoding(位置编码)->Local Feature Transformer->Self-Attention(自注意力)->Cross-Attention(交叉注意力)->Coarse Matching(粗匹配)->Fine-Level Refinement(精细匹配)->Final Correspondence(最终对应点)。

    Dense Feature(稠密特征):传统方法只对关键点提取特征,LoFTR对整张图每个位置都有feature,也就是稠密描述子图。

    Self-Attention(自注意力):同一张图不同位置之间互相通信,例如左边墙壁点会知道自己附近结构、全局上下文、周围纹理关系。

    Cross-Attention(交叉注意力):两张图会互相寻找对应关系,这已经不是descriptor 最近邻了,而是学习匹配关系。

    Positional Encoding(位置编码):Transformer本身不知道谁在左边、谁在右边,所以必须加入位置信息,否则Attention没有空间概念。

    Coarse Matching(粗匹配):LoFTR不会直接全分辨率匹配,否则直接计算爆炸,所以先低分辨率全局匹配,例如在1/8 feature map中先找到大概对应区域。

    Fine Matching(精匹配):在粗匹配附近局部窗口细化,在粗匹配找到的 “小区域” 里,做像素级的精准匹配,把位置修正到原图真实坐标。

    4.深度学习 Optical Flow

    传统光流:LK、Horn-Schunck、Farneback

    问题:大位移困难、遮挡困难、弱纹理困难;局部 patch 假设容易失败;复杂运动建模能力弱。

    深度学习光流:FlowNet、PWC-Net、RAFT。

    核心思想:网络直接学习像素运动场(Dense Motion Field);不再依赖局部泰勒展开,而是全局学习 motion correspondence。

    对比维度传统光流(LK/Farneback)深度学习光流(RAFT/FlowNet)
    核心假设 亮度不变 + 局部平滑约束 数据驱动学习全局运动模式
    大位移处理 差,易失效 强,金字塔 / 迭代优化适配大位移
    遮挡 / 弱纹理 差,易漂移 / 失效 强,全局上下文建模处理遮挡
    复杂运动 差,非刚性形变建模弱 强,数据驱动适配复杂运动
    泛化能力 依赖参数调优,场景敏感 数据驱动泛化,鲁棒性强
    计算效率 快(轻量级算法) RAFT 实时性较好,FlowNet 略慢

    FlowNet:传统光流依靠亮度恒定假设与局部优化求解,面对快速运动、复杂遮挡场景稳定性差。FlowNet 是首个基于 CNN 的光流网络,核心思想实现端到端映射:图像对直接输出光流场,无需传统手工约束与迭代求解。

    PWC-Net:传统稠密光流整体优化计算开销大,运行速度慢,难以实用落地。 PWC-Net 融合金字塔、特征扭曲、代价体三大模块:利用金字塔结构适配大位移运动,由粗到细通过特征扭曲完成精细化优化,借助代价体表征像素匹配相似度。

    RAFT(主流最优):Recurrent All-Pairs Field Transforms。传统光流局限于局部块跟踪,缺少全局像素关联建模能力,难以处理大幅度运动、遮挡区域与非刚性运动。 RAFT 全称递归全对场变换,核心思路构建全像素关联代价体,建立所有像素间相似度关联,搭配循环迭代机制持续优化细化光流结果。 本质是神经网络化的稠密光流迭代优化框架。 优势:预测精度顶尖,对大位移、遮挡、复杂非刚性运动鲁棒性极强,是现阶段工业与学术领域最主流的标杆级光流算法。

    适用场景:

    做研究、高精度、VO/SLAM:一律 RAFT
    工程落地、实时加速:PWC-Net
    无 GPU、简单场景:Farneback
    教学实验、稀疏跟踪:LK

    5.Deep VO

    传统 VO:特征匹配 → PnP 求解位姿 → BA 后端优化

    问题:pipeline 长;误匹配会传递错误;动态场景脆弱;特征依赖严重。

    核心思想:直接学习:Image Sequence → Camera Pose。即:RGB 输入 → 网络直接输出位姿。

    PoseNet:简单、端到端、不依赖特征点,缺点是精度较低。

    DeepVO:输入连续图像,输出连续位姿

    UnDeepVO(Unsupervised Learning):不需要真实位姿标签,利用光度一致性、几何约束、重投影误差进行自监督训练。

    DROID-SLAM:现代最强 Deep SLAM/VO 之一。融合 Deep Feature、Optical Flow、Optimization、Dense Matching,精度极高。属于Learning + Geometry Hybrid,学习与几何融合。

    优势:1.不依赖人工特征,因此弱纹理区域更稳定。2.网络可以学习哪些区域不可靠,动态场景更鲁棒。3.端到端,直接输出位姿。

    问题:1.泛化差。2.可解释性差,黑盒网络,很难分析失败原因。3.需要大量数据。

    现代趋势是 Learning + Geometry 融合,Deep Feature + Geometry Optimization。

    四大方法本质区别

    方法本质驱动力
    特征法 几何驱动(Geometry-driven)
    线/边缘法 结构驱动(Structure-driven)
    直接法 光度驱动(Photometric-driven)
    深度学习法 数据驱动(Data-driven)

    典型Pipeline对比:

    1. 特征法 Pipeline

    Image → Detect Keypoints → Compute Descriptor → Matching → RANSAC → PnP/BA → Pose

    核心:先建立 Correspondence(对应关系),再做 Geometry Optimization。

    2. 线/边缘法 Pipeline

    Image → Edge Detection → Line Extraction → Line Matching → Geometry Optimization

    核心:使用结构信息,利用平行线、消失点、边缘约束。

    3. 直接法 Pipeline

    Image → Compute Gradient → Build Photometric Error → GN/LM Optimization → Pose

    核心:不做 matching,直接优化灰度一致性。

    4. 深度学习法 Pipeline

    Image Sequence → Neural Network → Pose / Depth / Flow

    核心:不手工设计特征,网络自己学习表示。

    对比维度基于特征的方法(Feature-based)基于线/边缘的方法(Line/Edge-based)直接法(Direct Method)基于深度学习的方法(Deep Learning-based)
    核心思想 提取关键点与描述子,通过匹配恢复几何关系 利用边缘、直线、轮廓等结构信息建立约束 直接最小化像素灰度误差(Photometric Error) 使用神经网络学习特征、匹配、深度、光流或位姿
    使用信息 Corner、Descriptor、Geometry Edge、Line、Gradient、Structure Pixel Intensity、Image Gradient RGB、Feature Map、Semantic Context
    是否需要特征点 需要 不一定 不需要 不一定
    对弱纹理场景能力 很差,白墙、天空、地板容易无特征点 中等,仍可利用边缘结构 较强,只要存在灰度梯度即可优化 更强,可利用全局上下文与语义信息
    对动态场景能力 中等,可通过RANSAC剔除部分动态点 一般,动态边缘容易破坏线约束 较差,动态物体破坏光度一致性 较强,可学习运动模式与动态区域
    对大位移能力 强,Descriptor Matching 对大运动鲁棒 中等 弱,通常必须 Pyramid 强,现代网络对大运动非常鲁棒
    对平移(Translation)适应性 小平移强,大平移弱
    对旋转(Rotation)适应性 较强,SIFT/ORB 具有旋转不变性 中等,线方向变化会影响稳定性 较弱,大旋转容易优化失败
    对缩放(Scale Change)适应性 强,SIFT/SURF 天生多尺度 中等 较差,尺度变化容易破坏灰度一致性
    对透视变化(Perspective Change)适应性 较强,可结合 Homography / Epipolar Geometry 中等 较弱,非平面场景容易失败 较强
    对光照变化适应性 中等,Descriptor 有一定鲁棒性 中等 较差,Brightness Constancy 容易失效 较强,可学习光照不变特征
    是否依赖初始化 不敏感 中等敏感 非常敏感 相对较弱
    是否依赖梯度 不强依赖 强依赖边缘梯度 极度依赖图像梯度 不完全依赖
    是否依赖描述子 强依赖 一般不依赖 不依赖 网络自动学习表示
    是否需要训练 不需要 不需要 不需要 需要大量训练数据
    工程复杂度 中等 较高 很高 极高
    计算资源需求 中等 中等 较高 极高(通常GPU)
    数学核心 多视几何、RANSAC、BA 线几何、消失点、约束优化 Photometric Optimization、GN/LM CNN、Transformer、Differentiable Optimization
    典型算法 SIFT、SURF、ORB、AKAZE、SuperPoint LSD、EDLines、FLD、PL-VIO LK、IC-LK、ECC、DSO、LSD-SLAM RAFT、LoFTR、SuperGlue、DROID-SLAM
    OpenCV支持 强支持 部分支持 部分支持 基本不直接支持
    典型应用 VO、SLAM、AR、SfM 室内SLAM、结构化环境 Direct VO、图像配准、稳像 自动驾驶、机器人、现代SLAM
    本质驱动力 Geometry-driven(几何驱动) Structure-driven(结构驱动) Photometric-driven(光度驱动) Data-driven(数据驱动)

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 图像配准方法全梳理:传统特征、灰度直接法与深度学习方案
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!