特征提取与匹配_SIFT

特征提取与匹配_SIFT

SIFT:尺度不变特征转换(SIFT, Scale Invariant Feature Transform)是一种特征描述方法。具有
尺度鲁棒性
旋转鲁棒性
光照鲁棒性
SIFT本身包括了特征点筛选及特征点描述的步骤。

尺度空间理论特征提取与匹配_SIFT_第1张图片

SIFT的特征点筛选目的:寻找在不同尺度空间下的极值点,保证这些特征点在放大或者缩小的条件下均存在。(这一特点与Harris检测特征点比较的话发现,Harris对尺度变换的鲁棒性较差)
SIFT的特征点筛选方法:DoG近似LoG。
LoG(Laplacian of Gaussian) :使用不同sigma获得不同的尺度空间图像,然后通过Laplacian算子获得极值。这一运算过程可以用DoG(Difference-of-Gaussian)近似。拉普拉斯其实就是二阶导数,产生的零交叉点就是我们所要获取的极值。
关于LoG与DoG的更多知识可以转到:图像分割-LOG检测器和DOG检测器
DoG步骤:
特征提取与匹配_SIFT_第2张图片
得到的结果与LoG结果非常相似,在DoG结果图中,我们用亮度表达差分值的大小。在纹理比较丰富、边缘区域具有比较大的值。
理解:高斯卷积核其实是一种加权的平均。在灰度变化不剧烈的地区,一个像素值的大小和周围像素值得大小基本相等,所以不管加权的参数是哪样,得到的加权结果其实是相似的,所以做差分之后这种区域的差分值会很小。灰度变化剧烈的地区则反之,差分值会很大。

SIFT特征点提取

在SIFT特征点选取中所用到的DoG:
特征提取与匹配_SIFT_第3张图片

这时候就出现了一个问题:随着sigma的增加,它需要更大的高斯窗口进行平滑模糊处理。(sigma越大高斯函数越扁平)会使无法处理的区域增加,同时计算量增加。在空间滤波中我们学习到,3* 3模板进行卷积时对图像最外一层像素是无法处理的,5*5是周围两层像素。
解决方法:图像金字塔
特征提取与匹配_SIFT_第4张图片
当k增加到2时,我们将图像缩小为1/2尺寸,这叫降采样。再使用sigma0的模板处理。我们发现,图像缩小了二分之一,而sigma却没有改变。重复该操作,进行降采样。同一个Octave的图像具有相同的尺寸。
在图像金字塔处理之后,我们将就是检测DoG极值了。
特征提取与匹配_SIFT_第5张图片
高斯加噪——>差分(三个一组)——>取点比较与周围26个像素点的值,符合则为极值点

这样得出来的极值的性质如何?特征提取与匹配_SIFT_第6张图片

SIFT特征点描述

使用梯度值对特征点进行表述,计算像素的梯度值和梯度方向。相对像素的亮度值,梯度对光照具有更好的鲁棒性。
当图像处于一个刚体状态时(没有剧烈形变),某像素与它周围像素的关系应该是近乎恒定的。对一个区域进行描述的话得到的描述子将更加稳定。
我们先假设一个候选点:
特征提取与匹配_SIFT_第7张图片
然后计算它周围一定区域的梯度值,比如8*8区域。在这里插入图片描述
1、将得到的角度值进行36等分。(36柱,一柱10°)
2、在特征点对应的尺度空间计算梯度值。
3、利用高斯核对梯度进行计算权重。
也就是说该像素周围像素的权重由两个值决定:一个是本身梯度大小、第二个是离考察像素点的距离(高斯核函数中有x,y的变量)。
特征提取与匹配_SIFT_第8张图片
建立一个36维的直方图,每次累加的值就是它的权重
特征提取与匹配_SIFT_第9张图片
其实到了这一步已经可以很好地描述了。
但是注意,此刻的角度计算得到的是一个绝对角度,是与水平方向成的角度。当图像旋转后显然这种描述方法就有问题了。
解决方法:获取一个具有代表性的方向作为主方向。通常选择梯度值最大的那个角度分量作为主方向,获得更具有旋转鲁棒性的描述方法。
特征提取与匹配_SIFT_第10张图片
特征提取与匹配_SIFT_第11张图片
选择完主方向后,将周围图像以主方向计算相对角度。这样就算图像进行旋转,主方向也会进行旋转,相对角度保持相对恒定状态。
代码实现可以参考第二个链接。
要是想要调用Opencv库函数,则要参考毛星云的《Opencv3编程入门的》417页,
我在我的Opencv安装包中没有找到这个nonfree文件夹,以后再解决这个问题。网上大部分调库代码也需要一些自己添加库。
在这里插入图片描述

SIFT算法详解
基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
《数字图像处理PPT.李竹版》

特征提取与匹配_SIFT_第12张图片

测试代码

1.测试环境

(1)pycharm下python3.7.6 (2)opencv-python 3.4.2.16
(3)opencv-contrib-python 3.4.2.16

2.测试代码

import cv2 as cv
img = cv.imread("C:/Users/dell/Desktop/lena512color.png")

surf = cv.xfeatures2d.SURF_create(7000)

kp, des = surf.detectAndCompute(img,None)

img2 = cv.drawKeypoints(img,kp,None,(255,0,0),4)
cv.imshow('surf', img2)

cv.waitKey(0)
cv.destroyAllWindows()

3.核心函数

(1)

cv2.xfeatures2d.SURF_create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright)

生成关键点的函数

  • hessianThreshold:默认100,关键点检测的阈值,越高监测的点越少
  • nOctaves:默认4,金字塔组数
  • nOctaveLayers:默认3,每组金子塔的层数
  • extended:默认False,扩展描述符标志,True表示使用扩展的128个元素描述符,False表示使用64个元素描述符。
  • upright:默认False,垂直向上或旋转的特征标志,True表示不计算特征的方向,False-计算方向。

(2)

cv2.drawKeypoint(image, keypoints, outImage, color, flags)

在图像中标记关键点的函数

  • image:输入图像
  • keypoints:获取的特征点
  • outImage:输出图像
  • color:颜色,默认为随机颜色
  • flags:绘制点的模式,有下图所示四种模式
    特征提取与匹配_SIFT_第13张图片

4.测试结果

特征提取与匹配_SIFT_第14张图片
上图即利用SURF算法检测到的图像特征点,各圆圆心即为检测到的特征点,各圆中的直线即分别标记了各个特征点的主方向。

你可能感兴趣的:(计算机视觉,学习报告,人工智能,python)