目录
一、前言
本文章只讲解原理于思路,具体代码可以自行去寻找学习。
“图像匹配”我对它的理解就是:两张图片,有没有相同的地方,如果有就是匹配,如果没有那就是不匹配。大概概念就是这样,具体的用途就很多了,你可以发动你聪明的小脑瓜去想想。>_<
本文只是研究了三种经典的点特征图像匹配算法:SIFT算法,SURF算法和ORB算法,其实这三种算法的博客网上有很多,但是对于一些细节总是不能很清晰的阐述所以写下本文。
二、SIFT算法
在讲解第一个算法的时候我会先提供一下我的思路:图像匹配是为了分别找到两张图像中的一些“特殊点”,通过比对两张图的“特殊点”去判断两张图像是否匹配。那么什么是图像的“特殊点”呢?聪明的小脑瓜快去想想。>_<
SIFT算法很经典的一种算法,由Lowe大牛创作,在这里我将它的步骤分成:1、寻找特征点;2、寻找主方向;3、描述特征点。
1、寻找特征点
在这里将构建高斯金字塔和差分金字塔等操作归纳为一步。
首先介绍一下它寻找特征点的思路,在这里我以一种需求渐进式的思路来讲解。
1.我要找到特征点,那么咋样算是特征点呢?
答:一张图像在计算机中表示可以看做一个由像素点的值构成的大矩阵,可以将一些像素值变化大的点或者一些极值点作为特征点。
2.图像在实际情况下可能会产生模糊度,导致图像特征点提取困难,该怎么做?
答:可以先对图像进行高斯平滑(也就是卷积,会使得图像模糊)。之后再提取问题1中“特征点”。但是考虑到实际的模糊程度我们并不知晓,因此需要对图像进行不同参数的高斯平滑,这样我们就会得到很多的图像如下图:
这样再去按照问题1的方法去寻找“特征点”就会很麻烦,因为你得去一幅图一幅图寻找。所以就有了差分金字塔!如下图:
将经过高斯平滑处理的图像进行作差,得到高斯差分图像,再去寻找高斯差分图像中的最大值点,在这里要通过比较周围26个点,如下所示:
这样我们会得到一个什么样的点呢?聪明的小脑瓜快去想想。>_<。是不是变化最大的点?是不是就是极值点?是不是就是我们要找的特征点?
为什么呢?作差在比较大小得到变化最大的点,你可以去联想一下离散的导数。
3.实际中图像的尺寸也可能发生变化,你怎么保证两张尺寸不一样的图像去匹配呢?
答:提前对图像进行尺度变化,类似于问题2的解决方法,如下图:
在这里以相同尺寸大小的图像为一组(这里作图时出现了一点错误),一组之中不同参数的高斯平滑分为不同层,高斯金字塔模型就构建好了!如下图:
构建好模型之后还有一些精确定位方法去对特征点进行精确定位,去除不稳定点提高算法精确度。
2、寻找主方向
通过提取到主方向,在对特征点进行构建描述符的时候,以主方向作为基准,这样就能使得上述问题得到改善。
3、构建描述符
图像匹配时,需要一个量去表示图像,对两张图像之间的量进行比对就可以判断相似性,这个量就是描述符。在SIFT算法中检测到的特征点有很多,所以需要对每个点进行描述。结合上一步当中的主方向,可以使得构建出的描述符具有旋转不变性。构建描述符的方法类似于提取主方向,不同的是这一步会将邻域分成一个个4×4的子邻域,从中提取出一个8维的向量,视具体子邻域的个数,最后排列成一个更高维的向量。一般生成一个128维的描述符。描述符的构建方式如图所示:
4、总结
SIFT算法可以说是一个很强大的点特征图像匹配算法,构建的高斯金字塔使得算法具有了模糊不变性和尺度变形,提取的主方向再与构建的描述符结合起来使得算法具有了旋转不变性,这样该算法在实际应用中就具有了稳定性,不会因为实际操作中距离物体远近、光学传感器旋转等问题造成图像匹配错误。但是这一系列的操作也使得该算法的速度不能很好的得到提升。
三、SURF算法(不看后悔)
1、思路整理
在学习SURF算法的时候对它的基本步骤和原理总是不能很好地理解,尤其是在寻找特征点的地方。看了很多文章和大佬写的博客,总算理清了思路。
2、寻找特征点
很多文章总说SURF算法通过构建Hessian矩阵和积分图的应用大大提高了算法的运行速度。。。。只知道提高了,但是怎么提高的呢?且听我慢慢道来(如下是我的论文!)
2.1构建Hessian矩阵
在这里该算法定义的特征点就是明暗变化最大的点,采用Hessian矩阵行列式的极大值来判 断。Hessian矩阵行列式如下:
所以,Hessian矩阵的构建就变得很重要了。对一幅图像中的任意点,其Hessian矩阵为:
式中、和是高斯二阶微分在点处与图像的卷积,下标的不同与高斯二阶微分方向不同有关,如下图:
这个图就是高斯滤波的模板,对应小方块就是卷积时,各个原始图像的像素应该乘上的系数。这个系数是高斯函数经过对y二阶偏导得到的。
考虑到要对全图进行Hessian矩阵运算,但是高斯二阶微分的计算确实很复杂,为了简化运算,提高计算速度,SURF采用盒子滤波来代替上述微分计算,该滤波器大大提高了计算速度,且性能近似相等。盒子滤波器模板如图所示:
由上图可以看出模板的系数,即白色、黑色小方块所代表的值得到了极大的简化。
这时Hessian矩阵为
这个时候,考虑到用盒子滤波代替了高斯二阶微分滤波,这种代替会产生误差,故需要对Hessian矩阵的行列式进行补偿,如下式所示:
式中的一般取0.9。
如果只是这样的提升,SURF算法也不会成为现在主流的算法之一。该算法作者在使用盒子滤波器的同时,将积分图与其结合了起来,使得算法复杂度得到了很大的改善,极大提高了运算速度。具体原理如下所述。
知道用盒子滤波器与图像中一点进行卷积时,就是各个图像的像素应该乘上模板的系数之后再相加,而运用积分图后,就不需要一个个对应相乘相加了,只需要知道卷积区域的四个端点,在积分图上取值,在做加减运算即可。如下图:
当要计算时只需要1、4处的值相加减去2、3处的值就好了。
2.1生产尺度空间
SURF算法构建尺度空间也是和SIFT算法一样分成组和层,但是有一点不同就是在SIFT算法中需要对图像进行隔点取样以减小图像尺寸,但是在SURF算法中是不减小图像尺寸的,而是改变模板的大小以此来达到图像尺寸减小的目的。
SURF算法检测到特征点之后也需要一些精确定位函数进行一个精确的定位。
3、寻找主方向
主方向的提取方法有很多,SURF算法先定位到特征点,然后获取它的圆形邻域,在其中计算Haar小波特征,然后统计好数据。通过比对那个方向上的特征响应值累计最大,那个方向就作为主方向。
4、构建描述符
类似于SIFT算法,不再赘述。
5、总结
- 运算高速性。SURF算法中将Hessian矩阵与积分图像进行了结合,通过积分图简化了近似高斯二阶微分的运算,极大提高了运算速度。
- 光照不变性。Haar小波特征可以在不同光照下仍然稳定,所以使得该算法的描述符当中有了关于光照的信息,使得稳定性进一步增强。
四、算法改进思路
SURF算法的鲁棒性是很好的,这得益于Hessian矩阵+积分图的应用,所以可以使用SURF算法作为提取特征点的方法
构建描述符的方法可以采用ORB算法,这样一个简单地改进思路就有了。我具体去实现了一下,效果还算可以。
我用的代码是网上找到的开源的MATLAB代码,想操作的可以去网上找,问我要也行。
我只是一个小白。。。。。
我一点代码都没讲!!!!!
有啥问题的我们也可以一起讨论!!!!