SIFT、SURF等关键点特征提取算法代码

article/2025/9/28 15:45:41

文章目录

  • 1.关键点特征提取算法
  • 2.SIFT代码(python+opencv)
  • 2.SURF代码(python+opencv)
  • 3.SIFT和SURF的比较

1.关键点特征提取算法

特征提取是提取出物体(如图片)的特征,用数学的向量、矩阵等对物体的特征做描述,做刻画。然后描述或刻画物体特征的这些信息就可以用来代表这类物体,之后应用到物体识别、分类等任务中。

所谓“特征”是物体具备的基本属性,我们通过某类物体的特征可以使得其区别于其它种类的物体。更进一步,如果我们获取到物体更细节的特征,就可以使得该物体区别于同类的其它物体。基于对“特征”基本概念的理解,我们结合图像处理,引入图像特征。图像特征被广泛应用于图像分类、人脸识别、目标跟踪等多种领域。

图像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征。
图像特征的分类形式是多样的,如分类成全局特征和局部特征。
颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。
纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。

图像的特征主要可以分为点、线(边缘)、区域(面)等特征,也可以分为局部特征和全局特征。
区域(面)特征提取比较麻烦,耗时,因此主要用点特征和边缘特征。
点特征提取方法包括:SIFT、SURF 、BRIEF、 FREAK 、 ORB 、 FAST 等。
边缘特征方法包括:LoG算子、Robert算子、Sobel算子、Prewitt算子、Canny算子等。

所谓关键点特征提取方法,是找到图像中具有旋转、平移、缩放等不变形特征的像素点,这些点被成为关键点。

根据图像中的具有不变性特征的关键点,就可以对图像做识别,匹配,分类等任务了。

2.SIFT代码(python+opencv)

代码中,有不懂的地方参考opencv官方文档,官方文档是最好的老师。
https://docs.opencv.org/4.5.2/

在这里插入图片描述
1处,选择opencv版本号;2处,检索

import numpy as np
import cv2
from matplotlib import pyplot as plt#读入lena图形
imgname1 = './lena.png'
img1 = cv2.imread(imgname1)
#gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像#使用opencv中封装的sift方法
sift = cv2.xfeatures2d.SIFT_create()keyPoint, des = sift.detectAndCompute(img1,None)  #keyPoint是关键点的信息,des是关键点对应的描述信息#把提取到的关键点,在原图中标出
img3 = cv2.drawKeypoints(img1,keyPoint,img1,color=(255,0,255)) #画出特征点,并显示为红色圆圈#显示
cv2.imshow("SIFT", img3) 
cv2.waitKey(0)

原图
在这里插入图片描述
结果图
在这里插入图片描述

代码中:keyPoint是关键点的信息,des是关键点对应的描述信息

debug中,看到关键点 keyPoint 如下图,从0开始排序
在这里插入图片描述
描述符 descriptor 就是如下所示的向量(每个sift关键点是一个128维的行向量),当然也可以说矩阵(多个关键点就构成矩阵)
下图没有显示全。
在这里插入图片描述
在这里插入图片描述
keyPoint所包含的信息有:
angle:角度,表示关键点的方向,通过Lowe大神的论文可以知道,为了保证方向不变形,SIFT算法通过对关键点周围邻域进行梯度运算,求得该点方向。-1为初值。
class_id:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要靠自己设定
octave:代表是从金字塔哪一层提取的得到的数据。
pt:关键点点的坐标
response:响应程度,代表该点强壮大小,更确切的说,是该点角点的程度。
size:该点直径的大小,特征点领域直径
在这里插入图片描述

2.SURF代码(python+opencv)

import numpy as np
import cv2
from matplotlib import pyplot as pltimgname = './lena.png'
src = cv2.imread(imgname)surf = cv2.xfeatures2d.SURF_create() kp, des = surf.detectAndCompute(src, None)  # des是描述子img = cv2.drawKeypoints(src, kp, src, color=(0, 0, 255))#显示
cv2.imshow("SURF", img) #拼接显示为gray
cv2.waitKey(0)#保存图像
save_path = 'F:\\xiangmu\\a.jpg'
cv2.imwrite(save_path, img)

3.SIFT和SURF的比较

Levels : common , good , best
在这里插入图片描述
在这里插入图片描述


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

相关文章

HOG图像特征提取算法

HOG图像特征提取算法 HOG简介HOG特点HOG计算步骤HOG参数计算HOG提取特征效果HOG代码实现 HOG简介 HOG全称:方向梯度直方图(Histogram of Oriented Gradient),发表于2005年的CVPR,是一种图像特征提取算法,和…

SURF特征提取算法详解

上一节我们已经介绍了SIFT算法,SIFT算法对旋转、尺度缩放、亮度变化等保持不变性,对视角变换、仿射变化、噪声也保持一定程度的稳定性,是一种非常优秀的局部特征描述算法。但是其实时性相对不高。 SURF(Speeded Up Robust Features)算法改进了特征了提取…

图像特征提取算法—HOG

图像特征提取算法—HOG 一 图像基本概念 1.1特征 边缘,角,区域。但不同的目的对应着的不同的特征,边缘特征,颜色特征,梯度方向分布等。 每个物体,我们总可以用一些词语或部件来描述它,比如人…

时域特征提取_EEG信号特征提取算法

点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 时域分析与频域分析 EEG信号特征提取就是以脑电信号作为源信号,确定各种参数并以此为向量组成表征信号特征的特征向量。 特征參数主要包括时域信号(如幅值)和频域信号(如频率)两大类,相应的特征提取方法也…

特征提取算法

特征提取 1、背景2、边界预处理Moore boundary tracing algorithmChain CodesFreeman Chain Codesslope chain codes (SCCs) minimum-perimeter polygon (MPP)signaturesskeletons 3、Region Feature Descriptors3.1 区域描述子和特征向量3.2 Topological Descriptors3.3 Textu…

深度学习之特征提取算法

目录 前言 二、LBP(Local Binary Patterns,局部二值模式) 三、HOG算法(Histogram of Oriented Gradient, 方向梯度直方图) 四、SIFT算子(Scale-invariant feature transform ,尺度不变特征变换) 五、H…

idea如何使用git关联远程仓库

1.git的配置 一般本地安装了git,idea会自动检索, 2.创建git本地仓库 一般以你要上传的项目为根目录 3.将文件提交至本地仓库 4.提交至远程仓库 点击VCS选择git点击push提交,第一次连接会让你输入远程仓库的地址。 我们先将github上的地…

git 将本地项目关联到远程仓库

原文链接:https://www.jianshu.com/p/2a8b4e627991 参考链接: https://blog.csdn.net/baidu_35085676/article/details/53456884 1.首先在项目目录下初始化本地仓库 git init 2.添加所有文件( . 表示所有) git add . 3.提交所有文件到本地仓库 git comm…

git创建本地仓库远程仓库,并关联。全过程

1.在网页中自己的github账号下,创建仓库project 2.在本机创建文件夹project。 进入文件夹project. (1) git init (2) git add README.md (3) git commit -m "first commit" (4) git branch -M master (5) git remote add origin https://github.co…

Git本地仓库与远程仓库关联

一、前提条件 1、本地一个仓库:本地仓库已经经过git init 初始化 2、远程一个仓库:已经存在了一个远程的仓库 3、GitHub已经添加了SSH Keys 二、建立远程与本地仓库的关联 本地仓库与远程仓库关联有两种方法,一种是通过IDE(比…

使用git命令,本地仓库关联到远程仓库

本地仓库关联到远程: 创建成功会得到一个url地址和git全局设置的两行命令,下面从本地链接远程时会用到。 git config --global user.name "你的用户名" git config --global user.email "你的邮箱" 2、选择本地文件夹,在…

git关联两个远程仓库,一个仓库(github)拉取代码,另一个仓库(gitlab)推送代码

有这种情况,小伙伴们在github上下载的开源项目(该开源项目还在继续开发维护),然后自己下载下来进行二次开发,然后又要把项目推送自己的gitlab私服上,这个时候不得不本地代码关联两个远程仓库。接下来我将一…

IDEA本地项目关联远程Git远程仓库

IDEA本地项目关联远程Git远程仓库 下面介绍几种方法: 一、代码 clone 到本地 这种方法是直接 clone 代码,这样不需要在手动关联仓库。 1、本地创建空白文件夹 2、右键 Git Bash Here 打开控制台 3、直接 clone 远程仓库的代码 git clone 远程地址&…

如何简单的在IDEA中关联git远程仓库

在IDEA中关联远程仓库有许多的方法,那么在这呢我教大家一种简单的方法。 那么在开始之前呢,需要大家在你自己的电脑上安装git,并且在Gitee上创建自己的仓库。 同时IDEA中需要下载Gitee的插件 那么我在这也创建好了一个测试仓库 点击黄色的…

关于GIT怎么将本地仓库和远程仓库进行关联

1 首先在本地创建一个和远程仓库一样的文件夹(直接在git的命令界面中就能创建,git命令界面貌似大部分的linux的命令都能用) 2 由于是一个空文件要让git认识需要初始化,初始化命令:git init ,会在在nihao中会出现一个.git的文件 3 初始化完成后…

本地项目关联远程 git 仓库

用了几年 git 来管理代码,除了常用的提交代码的一些指令,其他的每次用到都需要查一次资料,这样很麻烦。最近有一个新项目需要关联远程仓库,我自己也整理了一下。 安装 Git:官网 下面介绍几种方法: 一、代…

Git关联远程仓库和分支

背景 在我们开发过程中经常会将本地代码放到代码仓中。 解决方法有两种,这两种方法都有一个前提就是需要在gitLab中新建一个代码仓。 第一种方法就是先将这个新的远程代码仓拉取到本地,再将本地的代码移植到本地仓中,最后push到远程仓库中…

使用Git将本地仓库与远程仓库关联的三种方式

前提条件: Git已经配置完,能实现Push,Pull、Clone等操作 GitHub/Gitee已经添加了SSH Keys 没有配置好的参考这篇文章:是的是的 一、通过Clone远程仓库的方式 前提条件:创建好云端仓库即可 通过git clone指令clone到…

利用Git连接远程仓库(详细步骤)

利用Git连接远程仓库步骤及常见问题 1.先创建一个文件夹,名字为远程仓库的名称 2.在该文件目录下打开Git Bash 3.输入git init,进行初始化(初次连接时) 4.连接远程仓库(初次连接是下一次进入该文件夹就不用了) 输入…

Git- 连接远程仓库

如何使用Git 连接远程仓库呢?远程仓库->一般指的是代码托管平台。那就先来瞅瞅三个较熟悉的版本(代码)托管服务平台。 版本(代码)托管服务平台: 码云(gitee.com):是开源中国社区团队推出的基于Git的快速的、免费的、稳定的在线代码托管平…