这个学期在上数字图像处理这门课。这门课没有考试,只有大作业,要求使用labwindows和NI Vision进行开发。我选的题目是全景图像的合成(图像拼接),其中要使用到一些特征点检测和匹配的算法。本文主要讨论一下opencv中一些尺度不变特征检测算法的实现。
1.概述
在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用,包括目标识别、图像配准、视觉跟踪、三维重建等。这个概念的原理是,从图像中选取某些特征点并对图像进行局部分析(即提取局部特征),而非观察整幅图像。只要图像中有足够多的可检测的兴趣点,并且这些兴趣点各不相同且特征稳定、能被精确地定位,上述方法就十分有效。
因为要用于图像内容的分析,所以不管图像拍摄时使用了什么视角、尺度和方位,理想情况下同一场景或目标位置都要检测到特征点。视觉不变性是图像分析中一个非常重要的属性,目前有大量关于它的研究。
目前一些广为人知的特征点检测算法有:
- 不带尺度不变特征的检测,如Harris、FAST、AGAST等。在我上一篇文章中提到过,本文不进行讨论。
- 尺度不变特征的检测,如SIFT、SURF、BRISK、ORB等。本文主要讨论SIFT。
2.算法原理
根据我的理解,尺度不变特征检测的算子基本都基于这样一个假设
对图像进行缩放或者进行高斯滤波,可以模拟人眼在不同距离下观察物体时的场景
SIFT算法的第一个步骤,就是通过对原图像进行不断的缩小和高斯滤波,生成图像金字塔,以用来进行后续的分析.
SIFT算法使用了高斯差分(DOG)这个概念。高斯滤波器可以提取图像的低频成分,过滤的频率范围取决于参数σ。那么,用两个不同带宽的高斯滤波器对一幅图像做滤波,然后相减,就可以得到图像中的一定频段构成的图像。这种运算就叫高斯差分。而SIFT算法对每个Octave的图像进行不同程度的高斯滤波后生成高斯差分金字塔。