计算机视觉——sift特征匹配+opencv(包含sift的低于3.4.3的opencv安装方法)

article/2025/9/30 11:44:51

文章目录

    • 实验环境
    • 环境配置(低于3.4.3的opencv安装方法)
    • 虚拟环境的搭建(非必要)
    • 局部图像描述子
    • Harris 角点检测基本原理
    • SIFT特征提取
    • 代码实现
    • 运行实例
      • 匹配图像展示
      • 匹配结果和分析

实验环境

系统:Ubuntu16.04
语言:python3.7

环境配置(低于3.4.3的opencv安装方法)

本次实验的重头戏之一在于高版本的opencv处于版权保护原因取消了sift函数的使用;在查阅到的资料里,3.4.3以上的版本就无法使用了
而采用命令行安装时,可以直接是用以下语句进行安装(建立在你已经换过清华源的基础上,大部分人换的应该都是清华源

pip install opencv-python==3.4.2

但笔者在运行这一步时发现,清华源果然又不能用了,当然这时截止这篇博客撰写时的情况

那么相对的,可以先将上面的语句改成

pip install opencv-python==3.4.2 -i http://pypi.mirrors.ustc.edu.cn/simple/

也就是使用中科大的源,但是截止这篇博客编辑时,此源同样失效

经过多次尝试后,偶然发现阿里的源是可以使用的

pip install opencv-python==3.4.2 -i http://mirrors.aliyun.com/pypi/simple/

如果上述三种常用的国内源都失效的话,可以去git上找找whl手动安装,也是没有问题的。

虚拟环境的搭建(非必要)

linux的命令行操作这里就不详细介绍了,网上同样有大量的教程;这里先建立一个虚拟环境,具体的命令下图所示
在这里插入图片描述
其中建立环境的语句如下

conda create -n cvtest2 python=3.7

这里的cvtest是环境名,可以自行更改,后面的python版本也可以自行更改;值得一提的是,在创建虚拟环境的这一条语句其实后面还可以添加这个环境自己需要包含的包,但习惯上一般不这么做。

那么什么是虚拟环境呢? 简单来说,虚拟环境相当与在电脑中独立的开辟一个容器,在这个容器内所安装的依赖包与外界互不干扰;当我们同时在进行一些依赖包有交叉的不同项目时(如同时处理和进行两个项目,但tensorflow的版本分别为1.1和2.0),为彼此各自建立虚拟环境可以使得彼此都可以独立准确的运行

事实上,这个实验的环境依赖十分简单,只有一个opencv,不一定需要建虚拟环境,这里这么做只是为了习惯。

局部图像描述子

本次实验的内容是建立在局部图像描述子上的,这个其实是数字图像处理这门课程中有提到的概念。

那么什么是局部图像描述子呢?也就是一种对于图片而言,以一个像素点周围的像素点的分布特征来获取该点的局部特征算法

显而易见的,这些特征需要以下性质

  • 位移不变性
  • 旋转不变性
  • 尺度不变性
  • 光照不变性
  • 以及更多

因此我们学习 Harris 角点检测算法,用于提取图像的特征点;学习 SIFT(尺度不变特征转换),用于解决图像缩放、旋转、曝光、噪声等因素对特征匹配的影响。

Harris 角点检测基本原理

Harris 角点检测算法(也称 Harris & Stephens 角点检测器)是一个极为简单的角点检测算法。该算法的主要思想是:如果像素周围存在多于一个方向的边——即窗口沿任意方向的移动都导致图像灰度的明显变化,我们认为该点为兴趣点。该点就是角点。

简单来说,角点就是那些局部窗口沿各方向移动,均产生明显变化的点或者图像局部曲率突变的点

换句话说,如果是平坦区域:任意方向移动,无灰度变化;如果是边缘区域:沿边缘方向移动,无灰度变化;如果是角点:艳任意方向移动,明显灰度变化。

将图像域中点x上的对称半正定矩阵MI=MI(x)定义为:
在这里插入图片描述

其中∇I为包含导数Ix和Iy的图像梯度。由于该定义,MI的秩为1,特征值为λ1=|∇I|和λ2=0。现在对于图像的每个像素,可以计算出该矩阵。
选择权重矩阵W(通常为高斯滤波器Gσ),我们可以得到卷积:
在这里插入图片描述
该卷积的目的是得到M在周围像素上的局部平均。计算出的矩阵MI有称为Harris矩阵。W的宽度决定了在像素x周围的感兴趣区域。像这样在区域附近对矩阵M取平均的原因是,特征值会依赖于局部图像特性而变化。如果图像梯度在该区域变化,那么M的第二个特征值将不再为0.如果图像的梯度没有变换,M的特征值也不会变化。
取决于该区域∇I的值,Harris矩阵MI的特征值有三种情况:

  1. 如果λ1和λ2都是很大的正数,则该x点为角点;
  2. 如果λ1很大,λ2≈0,则该区域内存在一个边,该区域内的平均MI的特征值不会变化太大;
  3. 如果λ1≈λ2≈0,则该区域为空。

在不需要实际计算特征值的情况下,为了把重要的情况和其他情况分开,Harris和Stephens在文献中引入了指示函数:
在这里插入图片描述

为了去除加权常数κ,我们通常使用商数:
在这里插入图片描述

SIFT特征提取

Harris 角点检测算法的结果存在一些不正确的匹配。是因为图像像素块的互相关矩阵具有较弱的描述性。这些描述符还有一个问题,

David Lowe提出的SIFT(Scale-Invariant Feature Transform,尺度不变特征变化)是过去十年中最成功的图像局部描述子之一。SIFT特征包括兴趣点检测器和描述子。SIFT描述子具有非常强的稳定性,这也是SIFT特征能够成功和流行的主要原因。SIFT特征对于尺度、旋转和亮度都具有不变性,因此,它可以用于三维视角和噪声的可靠匹配。

SIFT算法实现步骤简述:
  实质上可以归为在不同尺度空间上查找特征点(关键点)的问题。
  SIFT算法实现特征匹配主要有三个流程:

  1. 提取关键点
  2. 对关键点附加详细信息(局部特征),既描述符;
  3. 通过特征点(附带上特征向量的关键点)的两两比较找出互相匹配的若干对特征点,建立景物之间的对应关系。

哪些点是SIFT要查找的关键点(特征点)?
  SIFT所查找到的关键点(特征点)是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
  根据归纳,SIFT特征点希望选择出具有下述不变性的点:

  • 尺度
  • 位移
  • 方向
  • 光照

代码实现

有了上面的基础概念之后,接下来就可以着手代码的编写。
在这里插入图片描述
需要补充的是,由于原图片是手机拍摄,所以像素值过大,代码中存在resize操作,这一步可以去除。

但这里需要注意,事实上压缩图片的尺寸一定程度上会导致原图片的像素分布受影响,这也会使得sift特征匹配的精确度大幅受损

运行实例

在这里插入图片描述
上面展示的就是代码在实际运行中的情况,可以看到4000*3000左右的图片即时经过了0.7的缩放,任然需要花费4s左右的计算时间。

匹配图像展示

事实上本次实验的要求是拍摄校内景物,但由于笔者忘了这茬,所以随手拍的

在这里插入图片描述
在这里插入图片描述

匹配结果和分析

在这里插入图片描述
可以看到匹配的结果是相当不错的,但这是因为两张图的拍摄角度相差不大

事实上,在笔者的多次实验中,当旋转和尺度发生较大的变化时,匹配的效果就已经很差了;一定程度上这也反应出了sift特征提取的一些局限。


http://chatgpt.dhexx.cn/article/l63OPNUM.shtml

相关文章

使用 Javascript 和 OpenCV.js 进行人脸检测

大家好,我们将研究如何使用常规 Javascript、HTML Canvas 和 OpenCV.js 库从图像中检测人脸。 让我们先看一些例子,然后我们将继续编写代码并解释 如果您需要查看完整的代码库刚刚获得我的 github 存储库 GitHub - reactcodes/face-detection-javascript…

图像处理:局部描述子SIFT算法

目录 0、关于SIFT的介绍 1、兴趣点 2、描述子 SIFT算法实现 1.实例化sift 2.利用sift.detectAndCompute()检测关键点并计算 3.将关键点检测结果绘制在图像上 Opencv实现 总结 0、关于SIFT的介绍 SIFT,即尺度不变特征变换,一种局部特征描述子&…

SIFT3D点云关键点提取详细介绍

1.引言 SIFT3D的理论基础完全是从图像特征SIFT2D中迁移类比过来的,类似的还有Harris3D和Harris6D的理论也是来源于Harris2D的,这些点云特征在PCL库中都有具体的实现。Harris3D和Harris6D目前已经有很好的博客和视频讲解了但是SIFT3D却没有一个比较好的介…

java sift 图片相似度,简单快速的图像相似性比较方法

我最近也面临同样的问题,为了解决这个问题(简单快速的算法比较两个图像),我贡献了 img_hash module 要打开“控制”,您可以从 this link . img_哈希模块提供六种图像哈希算法,非常容易使用。 代码示例 起源Lena 模糊莉娜 调整Lena的大小 移动Lena #include #include #include…

图像特征提取(二)——SIFT算法详解

转载自:http://blog.csdn.net/zddblog/article/details/7521424尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT)Just For Fun zdd zddmailgmail.com or (zddhubgmail.com) 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟…

Matlab实现sift特征检测+图像拼接

Matlab实现sift特征检测图像拼接共有12个m文件,其中main为主程序,点击运行即可。 一、部分代码示例 close all; clear; clc;im1imread(test3.png); im2imread(test4.png);gray1img2gray(im1); gray2img2gray(im2);[des1,loc1]sift(gray1); [des2,loc2]…

sfm算法之三角化(三角测量)

sfm算法流程一般是特征点提取、特征点匹配、计算本质矩阵/基础矩阵,最后三角化。但是利用机械臂去观察周围,前后帧姿态变化参数是具有的,所以不需要通过基础矩阵获取。 即利用机械臂的信息直接进行深度估计。已知:手眼标定、相机外…

简述人脸识别技术

简介 人脸识别技术是一种生物识别技术,可以用来确认用户身份。人脸识别技术相比于传统的身份识别技术有很大的优势,主要体现在方便性上。传统的身份认证方式诸如:密码、PIN码、射频卡片、口令、指纹等,需要用户记住复杂密码或者携…

Python机器视觉--OpenCV进阶(核心)-边缘检测之SIFT关键点检测

SIFT关键点检测 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 …

图像特征与描述子(直方图, 聚类, 边缘检测, 兴趣点/关键点, Harris角点, 斑点(Blob), SIFI, 纹理特征)...

1.直方图 用于计算图片特征,表达, 使得数据具有总结性, 颜色直方图对数据空间进行量化,好比10个bin 2. 聚类 类内对象的相关性高 类间对象的相关性差 常用算法:kmeans, EM算法, meanshift&#…

SIFI尺度不变特征变换算法

SIFT 尺度不变特征变换算法 David Lowe关于Sfit算法,2004年发表在Int. Journal of Computer Vision的经典论文中,对尺度空间(scal space)是这样定义的 : It has been shown by Koenderink (1984) and Lindeberg (1994) that un…

Opencv图像识别从零到精通(34)---SIFI

一、理论知识 Scale Invariant Feature Transform,尺度不变特征变换匹配算法,对于算法的理论介绍,可以参考这篇文章http://blog.csdn.net/qq_20823641/article/details/51692415,里面很详细,可以更好的学习。这里就不多…

32-SIFI特征点提取(EmguCV学习)

文章目录 RecordCode效果 Record 1、特征点检测与匹配常用的算法:FAST(FastFeatureDetector)、STAR(StarFeatureDetector)、SIFT、SURF、ORB、MSER、GFTT(GoodFeaturesToTrackDetector)、HARRI…

SIFI特征点提取

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd zddmailgmail.com 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。 1、SIFT综述 尺度不变特征转换(Scale-invariant feature tr…

图像SIFI笔记

Image/userl representation > down screen tasks 端到端的 文本领域 字典 visual word本质是 local feature handcraft feature 希望这个具有足够的泛华性 generalize 为了有交集 泛化性 clustering 聚类 Quantization 量化 每张图像 有特征点 local feature sift(128d维…

特征点匹配(SIFI)

1.SIFI https://blog.csdn.net/weixin_38404120/article/details/73740612(参考了这个作者的内容) 结合书上加博客的内容进行理解; 求取SIFI特征的步骤: 首先要对图像归一化,然后将图像扩大为原来的两倍&#xff0…

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变实验代码,并比较SIFI和ORB提取特征点的速度

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变 一、SIFI算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 二、ORB算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 三、比较SIFT和ORB的尺度旋转,…

向量范数简述

向量范数:表征在向量空间中向量的大小 一般表示:,其中X是n维向量,一般如果省略下面的p且无特别说明的话,指的就是2范数,也叫欧几里得范数。对向量来说,就是指向量的模。 常用的向量范数: 0范…

欧几里得范数/欧几里得距离(L2范数)

首先m维空间的概念: Rm的距离结构: 2维平面空间: m维空间: 范形空间距离 n维矢量空间中的元素X的Lp范数: 其中X是一连串的向量 最常用的是L2范数: 本质是一个距离概念 参考:《数学分析》

概念理解_L2范数(欧几里得范数)

L2范数 L2范数、欧几里得范数一些概念。 首先,明确一点,常用到的几个概念,含义相同。 欧几里得范数(Euclidean norm) 欧式长度 L2 范数 L2距离 Euclidean norm Euclidean length L2 norm L2 distance norm 对于一…