这是视频处理课程上的一个作业,说起来是有点难的,但我感觉还挺有意思的,写一写免得自己以后忘了。
Scale-invariant feature transform,尺度无关特征变换,可以说是很棒的一个东西了。
尺度,在我看来就是大小和清晰度的结合,尺度用来描述这个物体离观察者有多远。因为在日常生活中,近大远小,以及远处的东西一般要模糊一点,用尺度来描述物体离观察者的距离还是不错的。在计算机中,可以用“高斯金字塔”这种结构来模仿不同尺度下的物体,其中大小用图片分辨率实现,模糊清晰可以用高斯滤波实现。
顾名思义,SIFT就是想要找到两幅图像中和尺度无关的特征。
比如我离一辆车10米拍了一张照片,和离同一辆车100米拍了一张照片,而且还有一定程度的旋转平移。我们寄希望于寻求一种算法,能找出两章图片中相同的特征。
更有甚者,如果两章照片照了一个物体的不同部分,根据重叠部分的特征,可以将这两个图片拼接起来。
步骤???
第一步,找出所有特征点
第二步,特征点匹配
第三部,估计单应性矩阵
第四部,拼接
什么样的点可以作为特征点呢?
一般的特征点就用角点。但是这个算法里得用特征描述子找出来的点。
Harris角点,角点是梯度变化最快的地方。

可以看出其实有一点描边的感觉。
角点并不稳,会随着尺度的变化而变化。
所以得用这个东西来描述每一个像素点:
所以其实每一个点我们可以用两个最显著的特点来标识它,特征描述子的主方向、特征描述子的模。
这里“模”的概念和向量的模的概念相仿。我们可以找出模最大的一些点作为关键点,并且标识出它的主方向。
因为这个地方的主方向是和像素点周围环境有关系的,所以就拥有了尺度不变形和旋转不变性。
如何匹配两张图上的特征点?
有了两章图的关键点后,我们知道每一个关键点的主方向和模,然后依次去寻找。这一步我了解不是特别清楚,直接调用了matlab里的函数。
估计单应性矩阵
变换无非是平移旋转缩放,单应性矩阵可以表示成一个3x3的矩阵,为啥不用2x2呢,因为如果用2x2表示平移需要用到加法,为了齐次就用3x3的了。


最后的单应性矩阵其实就是这三个矩阵的乘积。
在matlab里,可以直接用estimateGeomatricTransform这样一个函数去找到单应性矩阵。
图片拼接
有了单应性矩阵,直接乘一下原图,就可以得到变换后的图像了。然后再进行拼接,拼成一章大图片。
例子
比如下面这张图
特征点是这样的
第二张图是这样的

变换情况,两张图的特征点匹配点之间连线
第一张图变换之后是这样的
最终效果