基于特征点匹配的图像相似度算法之SIFT特征

导读

在之前的文章图像处理中常用的相似度评估指标中,我们介绍了通过MSEPSNRSSIM以及UQI等指标来计算图像之间的相似度。但是,在使用这些算法计算图像相似的时候两张图像的size必须一致,而且这些算法对于图像的旋转缩放平移仿射变换以及光照强度等都是不鲁棒的。

这篇文章我们来介绍几个更加鲁棒的图像相似度计算的算法,SIFTSURF以及ORB三种算法,它们都是基于特征点的提取来计算图像之间的相似度。

注意:因为需要用到SHIFTSURF以及ORB算法,所以需要安装 opencv-python==3.4.2.16opencv-contrib-python==3.4.2.16,如果是高本版opencv由于license的问题可能会无法使用到这些算法

环境

  • Python:3.7
  • opencv:3.4.2.16
  • opencv-contrib:3.4.2.16

SIFT

SIFT (Scale-Invariant Feature Transform):尺度不变特征变换,是用于图像处理中的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征的描述子。在图像的特征匹配和特征提取中,经常使用到。

特点

  • 不变性:SIFT特征是提取图像的局部特征,它对于旋转尺度缩放亮度变换保持不变性,对于噪声视角变换仿射变换也能保持一定的不变性
  • 差异性:提取的特征信息量丰富,适合在海量数据中快速找到目标
  • 实时性:优化版的SIFT算法提取特征的速度可以达到实时
  • 扩展性:提取的特征向量可以和其他的特征向量进行融合

提取特征的步骤

  1. 尺度空间的极值检测:通过高斯微分函数来寻找图像在尺度变换和旋转不变的关键点
  2. 关键点定位:在每个候选关键点上,通过拟合精细的模型来确定尺度和位置,最终的选择依据它们的稳定程度
  3. 方向的确定:基于图像局部的梯度方向,分配给每个关键点一个或多个方向
  4. 关键点描述:在关键点的领域内,选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部变形和光照的变化

代码实现

下面我们用python来提取图像的SIFT特征

  • 导包

  • 提取图像的SIFT关键点

图像上面的绘制出来的圆圈就是使用SIFT算法提取的特征点

  • 图像的关键点匹配

上面是两张图片,左图是原图,右图是在原图的基础上增加了高斯噪声,直线连接了两张图像的相似的关键点

  • 通过匹配的关键点个数来计算相似度
    通过计算两张图之间SIFT关键点的匹配个数占总匹配数量的比例来计算相似度,这个算法计算出来的上面的两张图片的相似度只有28%,比较低

  • 提取图片SIFT特征的向量计算相似度
    将图片中的每个SIFT特征点转换称为一个128维的特征向量,通过控制提取特征的个数来控制特征向量的长度,理论上来说组合特征向量用到的特征越多计算出来的图片相似度越高。

总结

这篇文章我们主要介绍了如何使用opencv来提取图片的SIFT特征,以及如何来使用SIFT特征点来进行图像匹配和图像的相似度计算

参考

  1. https://medium.com/@shehan.a.perera/a-comparison-of-sift-surf-and-orb-333d64bcaaea
  2. https://docs.opencv.org/4.5.5/df/dd2/tutorial_py_surf_intro.html
  3. https://github.com/ShehanPerera/Research
  4. https://stackoverflow.com/questions/64525121/sift-surf-set-opencv-enable-nonfree-cmake-solution-opencv-3-opencv-4
  5. https://docs.opencv.org/4.x/dc/dc3/tutorial_py_matcher.html
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章