计算机视觉中,我们经常要匹配两幅图像。匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配。
相对于边,角更适合描述图像特征,比如下面的图像中,大概有6种特征,我们用A、B、C、D、E、F来描述,其中A, B是平的区域,在图像中很难精确定位,C,D是边,比A,B好些,但是图像中的边也很多,定位到某个边也比较困难,相比来说E,F的角更适合描述当前的图像的特征,也更好检测,因为你不论怎么移动图像,这些角的特征都和图像其它部分不同。所以在计算机视觉中,我们通常用角来描述图像特征。
E,F中的角我们通常称作角点(corner points),他们具有以下特征:
–局部窗口沿各方向移动,均产生明显变化的点
–图像局部曲率突变的点
斑点通常是指与周围有着颜色和灰度差别的区域。在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点。由于斑点代表的是一个区域,相比单纯的角点,它的稳定性要好,抗噪声能力要强,所以它在图像配准上扮演了很重要的角色。
各种图像特征的演进关系
Moravec角点检测用一个二值窗口在图像的某个像素点的所有方向上进行移动,并计算移动后和移动前像素强度变化的平均值,得到的***最小***的值定为该点的角点响应值。用公式表示,即为:
x,y是待检测点的图像坐标。
u,v是待检测点邻域图像块的移动方向。
w是可调节的权重。
一般计算这个像素点水平、垂直、对角线、反对角线4个方向上的灰度差平方和。
参考博客:
1、Harris 角点检测(Harris Corner Detection)(OpenCV实现)
https://blog.csdn.net/u014485485/article/details/79056666
2、Harris Corner Detector 原理及编程实现
https://blog.csdn.net/tanhongguang1/article/details/8898927
Harris角点检测是Chris Harris和Mike Stephens在1988年提出的。主要用于运动图像的追踪。
Harris角点检测来自于Moravec检点检测(1977,Moravec),并对它进行了改进和更强的数学建模。
OpenCV 函数:cornerHarris
与Moravec角点相比,Harris角点的优点:
Moravec角点有一些缺点,导致它的检测不精确,Harris改良了这些缺点。
1.Moravec响应是各向异性的,因为只考虑了45度倍数方向上的响应。
Harris通过对shift region进行泰勒展开,覆盖所有方向的移动。
2.Moravec响应容易受到噪声的干扰,因为窗口是二值的,且为方形。
Harris改用具有平滑效果的高斯圆形窗口。
3.Moravec响应对边缘、角点的判决过于简单,因为响应只考虑E的最小值。
Harris重新设计了一种衡量边缘、角点的方式——利用E的方差。
Harris角点的缺点:
由上述分析也可以看出,Harris角点没有尺度不变性,因为框的设计并没有考虑这一点。所以当图像尺寸变化时,框的大小不相应调整,就会出现错误的分类。
在一个尺度下是Harris角点, 在在另一个尺度下可能就不是Harris角点了.
Harris角点具有平移不变形和旋转不变形,但是没有尺度不变形。
SIFT对于平移、旋转、尺度缩放、亮度变化都保持不变性。
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
SIFT由David Lowe在1999年提出,在2004年加以完善 [1-2] 。SIFT在数字图像的特征描述方面当之无愧可称之为最红最火的一种,许多人对SIFT进行了改进,诞生了SIFT的一系列变种。SIFT已经申请了专利。
The SIFT algorithm is patented in the United States and cannot be used in commercial products without a license from the University of British Columbia.
下载opencv,如果使用3.0及以上版本,一定要使用opencv-contrib-python,因为在opencv-python中移除了SIFT,SURF等算法。移除的理由是这些算法受专利保护。最简单的方法为在命令行中运行
pip install opencv-contrib-python
参考资料:
1、David G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision, 60, 2 (2004), pp. 91-110. [PDF][CODE][project homepage][author’s homepage]
2、原理讲解(中文)
[SIFT算法详解及应用,讲解全面形象,百度文库下载]
[SIFT算法详解及应用,讲解全面形象,CSDN下载]
[SIFT算法的Matlab实现(blog) ]
zddhub, SIFT算法详解: http://blog.csdn.net/zddblog/article/details/7521424
Rachel Zhang, SIFT特征提取分析: http://blog.csdn.net/abcjennifer/article/details/7639681
JiePro, SIFT算法:特征描述子: http://www.cnblogs.com/JiePro/p/sift_4.html
3、代码
作者提供的matlab演示代码,sift关键函数没有开源代码:https://www.cs.ubc.ca/~lowe/keypoints/siftDemoV4.zip
Rob Hess, OpenSIFT源码,C语言版本: https://github.com/robwhess/opensift
SIFT算法的Matlab实现(github下载)matlab语言版本 :https://github.com/sun11/sw-sift
近来不断有人改进SIFT,其中最著名的有 SURF(计算量小,运算速度快,提取的特征点几乎与SIFT相同)和 CSIFT(彩色尺度特征不变变换,顾名思义,可以解决基于彩色图像的SIFT问题)。
SIFT特征和SURF特征比较: https://blog.csdn.net/blateyang/article/details/76512398
为了提高特征点检测速度,Edward Rosten和Tom Drummond在2006年发表的“Machine learning for high-speed corner detection”文章中提出了一种FAST特征,并在2010年对这篇论文作了小幅度的修改后重新发表。
FAST的全称为Features From Accelerated Segment Test。(FAST主要用于角点检测)
1.从图片中选取一个像素P,下面我们将判断它是否是一个特征点。我们首先把它的亮度值设为Ip。
2.设定一个合适的阈值t。
3.考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素(如图1所示)。
4.现在,如果在这个大小为16个像素的圆上有n个连续的像素点,它们的像素值要么都比Ip+t大,要么都比Ip−t小,那么它就是一个角点。(如图1中的白色虚线所示)。n的值可以设置为12或者9,实验证明选择9可能会有更好的效果。
上面的算法中,对于图像中的每一个点,我们都要去遍历其邻域圆上的16个点的像素,效率较低。我们下面提出了一种高效的测试(high-speed test)来快速排除一大部分非角点的像素。该方法仅仅检查在位置1,9,5和13四个位置的像素,首先检测位置1和位置9,如果它们都比阈值暗或比阈值亮,再检测位置5和位置13。如果P是一个角点,那么上述四个像素点中至少有3个应该必须都大于Ip+t或者小于Ip−t,因为若是一个角点,超过四分之三圆的部分应该满足判断条件。如果不满足,那么p不可能是一个角点。对于所有点做上面这一部分初步的检测后,符合条件的将成为候选的角点,我们再对候选的角点,做完整的测试,即检测圆上的所有点。
参考:
Features From Accelerated Segment Test:
https://www.cnblogs.com/ronny/p/4078710.html?utm_source=tuicool
EPFL的Calonder在ECCV2010上提出了一种可以快速计算且表达方式为二进制编码的描述子。
SIFT特征采用了128维的特征描述子,由于描述子用的浮点数,所以它将会占用512 bytes的空间。
如果一幅图像中有1000个特征点,那么SIFT或SURF特征描述子将占用大量的内存空间,对于那些资源紧张的应用,尤其是嵌入式的应用,这样的特征描述子显然是不可行的。
而且,越占有越大的空间,意味着越长的匹配时间。
但是实际上SFIT或SURF的特征描述子中,并不是所有维都在匹配中有着实质性的作用。
BRIEF提供了一种计算二值串的捷径,而并不需要去计算一个类似于SIFT的特征描述子。它需要先平滑图像,然后在特征点周围选择一个Patch,在这个Patch内通过一种选定的方法来挑选出来nd个点对。然后对于每一个点对(p,q),我们来比较这两个点的亮度值,如果I§>I(q),则这个点对生成了二值串中一个的值为1,如果I§
一旦维数选定了,我们就可以用汉明距离来匹配这些描述子了。
值得注意的是,对于BRIEF,它仅仅是一种特征描述符,它不提供提取特征点的方法。所以,如果你必须使一种特征点定位的方法,如FAST、SIFT、SURF等。总体来说,BRIEF是一个效率很高的提取特征描述子的方法,同时,当图像发生很大的平面内的旋转,它有着很好的识别率。
参考资料
SIFT、SURF、Harris、BRIEF、FAST、DAISY、FAST等描述符介绍:https://blog.csdn.net/qq_29828623/article/details/52403562
参考资料:
特征匹配,sift,surf,orb,brisk,brief: https://blog.csdn.net/sinat_31337047/article/details/52760780
ORB是Oriented FAST and Rotated BRIEF的简称。ORB将在本文中详细描述。Ethan Rublee and Vincent Rabaud and Kurt Konolige and Gary Bradski,《ORB: an efficient alternative to SIFT or SURF》, ICCV 2011。OpenCV2.3中已经实现。
主要贡献在于:
1、对于FAST算法,增加了快速准确的方向指向功能;
2、高运算效率的具有指向功能的BRIEF特征;
3、具有指向功能的BRIEF特征的方差及相关性分析;
4、基于旋转不变且去关联性的BRIEF特征的方法,用于减少近邻取样(点取样)应用中。
计算速度: ORB>>SURF>>SIFT(各差一个量级)
旋转鲁棒性: SURF>ORB~SIFT(表示差不多)
模糊鲁棒性: SURF>ORB~SIFT
尺度变换鲁棒性: SURF>SIFT>ORB(ORB并不具备尺度变换性)
所以结论就是,如果对计算实时性要求非常高,可选用ORB算法,但基本要保证正对拍摄;如果对实行性要求稍高,可以选择SURF;基本不用SIFT。
参考资料:
SURF SIFT ORB三种特征检测算法比较: https://blog.csdn.net/zilanpotou182/article/details/66478915
ORB 一种特征匹配替代方法:对比SIFT或SURF : https://blog.csdn.net/u012525173/article/details/70332181
LBP(Local Binary Pattern),局部二值模式是一种描述图像局部纹理的特征算子,该算子是由T.Ojala等人于1994年首次提出的,后经过发展改进可应用于图像特征分析,该算子具有旋转不变性与灰度不变性(不怕光照变化)等显著优点。
LBP特征描述的是一种灰度范围内的图像处理操作技术。LBP特征是高效的图像特征分析方法,经过改进与发展已经应用于多个领域之中,特别是人脸识别、表情识别、行人检测领域已经取得了成功。
参考资料:https://blog.csdn.net/yuanlulu/article/details/82148429
求取前先灰度化然后Gamma校正,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰。
HOG主要捕获轮廓信息。统计每个cell的梯度直方图,然后若干个cell直方图组成一个block的descriptor。所有block组成整幅图片的descriptor。
这里注意,同一个block之间的cell之间像素不重叠,但是不同的block之间回有像素重叠。其实每个block更像是一个滑窗,滑窗的步长一般小于block边长。
滑窗和block关系参考下图(图中的cell是8X8,每4个cell组成一个block,水平和垂直上的滑窗步长都是8)
由于大滑动窗口之间是由很多重合的,所以opnecv里实现HOG的时候使用了很高明的缓存技术加速计算过程。
对图像几何的和光学的形变都能保持很好的不变性,适合检测行人这种居于有一定刚性的物体,可以容许行人有一些细微的肢体动作。
人脸检测最为经典的算法Haar-like特征+Adaboost。这是最为常用的物体检测的方法(最初用于人脸检测),也是用的最多的方法。
训练过程: 输入图像->图像预处理->提取特征->训练分类器(二分类)->得到训练好的模型;
测试过程:输入图像->图像预处理->提取特征->导入模型->二分类(是不是所要检测的物体)。
Haar-like特征是很简单的,无非就是那么几种,如两矩形特征、三矩形特征、对角特征。后来,还加入了边缘特征、线特征、中心环绕特征等。使用积分图可以加速计算特征。最后,使用集成的方法Adaboost进行训练。
参考资料:https://blog.csdn.net/yuanlulu/article/details/82148429
https://blog.csdn.net/vonzhoufz/article/details/46594369
Canny Edge Detect,
A Computational Approach to Edge Detection, 1986. The Canny edge detector is an edge detection operator that uses a multi-stage algorithm to detect a wide range of edges in images.
Harris,
A combined corner and edge detector, 1988. considering the differential of the corner score with respect to direction directly.
GFTT,
Good Features to Track,1994, Determines strong corners on an image.
Matas-2000,
Robust Detection of Lines Using the Progressive Probabilistic Hough Transform. 霍夫变换检测直线.
SIFT,
Distinctive Image Features from Scale-Invariant Keypoints,2004, invariant to image translation, scaling, and rotation, partially invariant to illumination changes and robust to local geometric distortion. 128-dim(512B).
SURF,
Speeded Up Robust Features,2006,受SIFT启发,比SIFT快,健壮. 64-dim(256B).
FAST ,
Machine Learning for High-speed Corner Detection, 2006,wiki. Very fast, not robust to high level noise.
ORB,
ORB: an efficient alternative to SIFT or SURF,2011,基于FAST和BRIEF,比SIFT快两个数量级,可作为SIFT的替代(a fusion of FAST keypoint detector and BRIEF descriptor). 32B binary descriptor.
BRISK,
BRISK: Binary Robust Invariant Scalable Keypoints, 2011 . 64B binary descriptor.
STAR,
Censure: Center surround extremas for realtime feature detection and matching,2008,引用次数不高.scale-invariant center-surround detector (CENSURE) that claims to outperform other detectors and is capable of real-time implementation.
MSER,
Robust Wide Baseline Stereo from Maximally Stable Extremal Regions, 2002, 斑点检测(blob detection).