3. 特征点提取与匹配:图像特征点概述、Harris角点检测、SIFT特征提取原理、SIFT特征描述子、特征匹配与比值测试、RANSAC剔除误匹配
3.1 图像特征点概述
做3D重建,第一步就是找特征点。
说白了,特征点就是图像里那些“特别”的像素点。比如墙角、桌角、纹理丰富的地方。这些点有个特点:换个角度拍,它还在那儿。我刚开始做重建时,总想着用所有像素点去算,结果计算量爆炸,效果还差。后来才明白,用特征点就够了。
一个好的特征点,要满足几个条件:
- 重复性:换个视角,还能找到它
- 独特性:每个点长得不一样,容易区分
- 局部性:只依赖小区域,不怕遮挡
- 数量可控:不能太多,也不能太少
嗯,这里要注意,特征点不是越多越好。我曾经有个项目,提取了上万个特征点,结果匹配时全是噪声。后来把阈值调高,只留几百个,效果反而好了。
核心观点:特征点是3D重建的“锚点”。没有好的特征点,后面的重建就是空中楼阁。
3.2 Harris角点检测
Harris角点检测是经典中的经典。它怎么工作的?
你想想看,一个像素点,往上下左右移动一点点,如果灰度变化很大,那它大概率是个角点。如果只在一个方向变化大(比如边缘),那就不是角点。
数学上,Harris用一个矩阵M来描述这个变化:
M = ∑ w(x,y) [ Ix² IxIy ]
[ IxIy Iy² ]
其中Ix、Iy是图像梯度。然后算一个响应值R:
R = det(M) - k * trace(M)²
R大于某个阈值,就是角点。k一般取0.04到0.06。我习惯用0.05。
个人经验:Harris对光照变化比较鲁棒,但对尺度变化敏感。如果你拍的物体忽远忽近,Harris可能就不太灵了。我曾经在无人机航拍项目里用Harris,结果同一栋楼在不同高度拍,角点完全对不上。
3.3 SIFT特征提取原理
SIFT(尺度不变特征变换)解决了Harris的痛点。它能在不同尺度下找到稳定的特征点。
怎么做?构建高斯金字塔。说白了,就是把图像不断模糊、降采样,得到一组不同尺度的图像。然后在相邻尺度间做差分,得到DoG(高斯差分)金字塔。
在DoG金字塔里找极值点。每个像素点要和它周围的26个邻居比较(同层8个,上下层各9个)。如果它是最大值或最小值,就候选为特征点。
注意:极值点不一定都是好的。有些点对比度太低(在边缘上),需要剔除。SIFT会用泰勒展开做亚像素定位,同时去掉低对比度的点和边缘响应点。这一步很关键,我见过有人跳过这步,结果匹配时全是假点。
下面这张图展示了SIFT的整体流程:
3.4 SIFT特征描述子
找到特征点后,怎么描述它?SIFT用128维向量。
具体做法:以特征点为中心,取16x16的邻域。分成4x4的格子,每个格子统计8个方向的梯度直方图。4x4x8 = 128维。
为什么要128维?高了区分度好,但计算量大。低了容易误匹配。128是个折中。我个人觉得这个设计很巧妙,既保证了独特性,又控制了维度。
避坑指南:描述子生成后,要做归一化。我曾经忘了这步,结果光照一变,匹配全乱套。归一化后,描述子对光照变化就鲁棒多了。
3.5 特征匹配与比值测试
匹配就是找两幅图像里最像的特征点。最常用的方法是最近邻搜索。
对每个特征点,在另一幅图里找欧氏距离最近的点。但这样会有很多误匹配。怎么办?比值测试。
比值测试的思路:对每个特征点,找最近邻和次近邻。如果最近邻距离远小于次近邻,说明匹配很可靠。如果两者差不多,说明这个点很模糊,容易误匹配,直接扔掉。
if (最近邻距离 / 次近邻距离) < 阈值:
保留匹配
else:
丢弃
阈值一般取0.6到0.8。我习惯用0.7。阈值越小,匹配越少但越准。阈值越大,匹配越多但噪声也多。看具体需求调整。
经验之谈:比值测试是SIFT匹配的精髓。没有它,SIFT的匹配效果会大打折扣。我在做文物重建时,纹理重复很多,比值测试帮我过滤掉了大量误匹配。
3.6 RANSAC剔除误匹配
比值测试后,还有误匹配怎么办?上RANSAC。
RANSAC(随机抽样一致性)的思路很暴力:随机选几个点,拟合一个模型(比如单应矩阵或基础矩阵),然后看其他点符不符合这个模型。符合的叫内点,不符合的叫外点。重复多次,选内点最多的模型。
具体步骤:
- 随机选4对匹配点(计算单应矩阵需要4对)
- 计算模型参数
- 用模型检验所有匹配点,统计内点数量
- 重复步骤1-3,比如1000次
- 选内点最多的模型,用所有内点重新计算
注意:RANSAC不是万能的。如果误匹配太多(超过50%),RANSAC可能失效。我遇到过这种情况,后来先手动调整了特征提取参数,提高了匹配质量,RANSAC才正常工作。
RANSAC的迭代次数怎么定?理论上,迭代次数越多,找到正确模型的概率越大。但也不能太多,否则计算量太大。一般1000次就够用了。如果匹配点很少,可以适当增加。
个人习惯:我一般先用比值测试(阈值0.7)过滤一遍,再用RANSAC。这样两步下来,匹配质量基本就稳了。如果还有问题,我会检查特征点提取的参数,看看是不是特征点本身就有问题。
好了,特征点提取与匹配就讲到这里。这部分是3D重建的基石,一定要打好基础。下一章我们会讲怎么用这些匹配点去恢复相机位姿。
公众号:蓝海资料掘金营,微信deep3321