特征提取与匹配_SIFT

特征提取与匹配_SIFT

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

尺度空间理论在这里插入图片描述

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

SIFT特征点提取

在SIFT特征点选取中所用到的DoG:
在这里插入图片描述

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

这样得出来的极值的性质如何?在这里插入图片描述

SIFT特征点描述

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

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

在这里插入图片描述

测试代码

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:绘制点的模式,有下图所示四种模式
    在这里插入图片描述

4.测试结果

在这里插入图片描述
上图即利用SURF算法检测到的图像特征点,各圆圆心即为检测到的特征点,各圆中的直线即分别标记了各个特征点的主方向。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种功能强大的编程语言,在计算机视觉领域广泛应用。OpenCV是一个开源的计算机视觉库,提供了许多处理图像和视频的函数和方法。SIFT是一种常用的特征提取算法,可以在图像中检测出关键点,并生成特征向量。在这里,我们将介绍如何使用Python结合OpenCV实现SIFT特征提取匹配。 使用Python实现SIFT特征提取的基本步骤如下: 1. 导入OpenCV库并读取图像 ``` import cv2 img = cv2.imread('image.jpg') ``` 2. 创建SIFT对象并检测关键点 ``` sift = cv2.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(img, None) ``` 通过使用SIFT对象的detectAndCompute()函数,我们可以对图像进行关键点检测和特征描述符提取,并将结果保存在两个变量kp和des中。 3. 可视化关键点并保存图像 ``` img_kp = cv2.drawKeypoints(img, kp, None) cv2.imshow('Keypoints', img_kp) cv2.imwrite('output.jpg', img_kp) cv2.waitKey() ``` 在这个步骤中,我们使用drawKeypoints()函数将检测到的关键点绘制在图像上,并可以通过imshow()函数显示图像。然后,我们可以使用imwrite()函数将图像保存到本地。 实现SIFT特征匹配的基本步骤如下: 1. 读取并检测两张图像的关键点和描述符 ``` import cv2 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) ``` 2. 创建并运行暴力匹配器 ``` bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) ``` 3. 使用比值测试来筛选出良好的匹配 ``` good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append([m]) ``` 4. 可视化匹配点并保存图像 ``` img_matched = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good_matches, None, flags=2) cv2.imshow('Matching result', img_matched) cv2.imwrite('output.jpg', img_matched) cv2.waitKey() ``` 在步骤2中,我们使用了暴力匹配器BFMatcher()来对特征描述符进行匹配。knnMatch()函数返回的是最近邻和次近邻的描述符距离,我们可以用比值测试筛选出距离最近的描述符,并将其作为好的匹配。最后,我们使用drawMatchesKnn()可以将匹配点绘制在图像上,并通过imshow()函数显示图像。最后,我们可以通过imwrite()函数保存图像。 综上所述,使用Python结合OpenCV实现SIFT特征提取匹配非常简单。利用OpenCV中的函数和方法,我们可以轻松地处理图像和视频,实现各种计算机视觉应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值