前言
图像是由一堆的像素点堆砌在一起构成了,如何让计算机可以理解这些像素点从而做一些简单的事情,比如比较两幅图片中是否有同一个物体。这个时候,我们就需要在图片中寻找一些有代表性的点或区域组成一个集合作为物体的描述。计算机认识了这几个点或区域,也就侧面认识到了这个物体。
用以描述和表征图像的特征有很多,在实际应用中往往根据需要来选择对应的特征。认识到这个特征的特点,就可以理论性地、有逻辑地根据特点来推导出这些特征检测的方法,这样说来,这些是手动设计的特征。(另一类通过深度学习获得的特征是系统自己学习的非人工特征。)
下面介绍的是局部特征,仅对某一个邻域做操作获得到的特征
good feature
怎么算是一个好的特征呢,有大致的四个原则:
- 对于同一场景的不同images,都可以找到feature;
- 不同的features之间是可以区分的;
- features的数量应该远远小于image中的pixels的数量;
- feature是基于区域的,而不是全局的。
Harris conner
基本思想:在image的某个小块,向它四周移动一定的像素后,移动窗口前后对应的每个像素差的平方和相对比较大的,就是harris conner。(即无论哪个方向移动窗口,框口内的像素变化都比较大)
其中要点:对于向邻域移动微小像素,可用泰勒公式展开,留下一阶和二阶,化简整理只剩下一阶的梯度项;用高斯滤波的原因是减小噪声的影响和不同距离的点对中心像素的影响程度不同;采用角点响应函数可以免去特征值的计算过程。
harris 算法步骤:
- 对图像进行高斯滤波;
- 对于每个像素,计算垂直的两个方向的梯度值;(可用导数卷积核来卷积实现)
- 计算角点响应函数R;
- 选择阈值,确定候选角点;
- 进行局部极值抑制获得harris角点。
harris cooner的特点:
- 对亮度和对比度变化不敏感;
- 具有旋转不变性;
- 不具有尺度不变性。
特征点和特征描述子
特征点的数据量太小了,只有坐标和亮度,仅凭这样的信息,是无法用来匹配和比较的;如果说就仅仅利用两幅images中的特征点来做相关,一一匹配试验,那肯定不行阿,因为相关不是旋转不变的。而且,一旦图片的尺度,亮度,角度变化了,那么不同images中同一特征所对应的特征值确实不一样的,该怎么知道它们是同一个点呢,接下来又该怎么来做匹配呢。
把特征点和邻域内的其他像素信息利用起来,构建一个特征向量,这样一个描述子除了特征点的坐标亮度信息外,把尺度不变,旋转不变,方向信息等等都包含进去,所以,在不同的images里,同一特征点具有相同的描述子,那么这样充分信息的一个描述子就可以用来做接下来的匹配了。
SIFT
由上边的分析,我们知道,一个点的信息量不够,还要借助邻域像素的信息,另外,尺度变化的问题也许需要解决,这时SIFT就出现了。
基本思想:要解决尺度变化的问题,那就去寻找当尺度变化了,特征点仍然不变的点;要解决旋转的问题,就把所有的特征点转到指定的方向。
其中要点:
- 高斯拉普拉斯(loG)运算是比harris、梯度等其他操作更稳定的,却可以实现尺度不变的算子,但LoG的运算量较大,而高斯差分(DoG)运算可近似LoG,所以用DoG来计算。
- 对图像进行DoG操作之后,用中心点是否是局部极值来作为特征点的判断依据。
- 把特征点邻域内的像素点的梯度的变化的主要方向作为该点的方向,然后把角度调整到指定方向,那所以的点就同意了,不必在意是否旋转的问题了。
SIFT特征提取步骤:
- 构造高斯金字塔,进行尺度不变点(即特征点)检测;
- 计算特征点邻域的梯度,求梯度的直方图,获得特征点的主方向;
- 将前面获得的特征点,尺度信息,特征方向组合成特征描述子;
获得了SIFT以后,就可以进行特征匹配了,在此不再研究。