CS143-project2 局部特征匹配 Local Feature Matching

2023-11-18

本项目通过harris算法对图像进行兴趣点的检测和提取。然后计算兴趣点周围4*4区域的8个方向特征向量,最后对获取到的特征向量对进行匹配。本算法对旋转,缩放,亮度变化保持一定程度的稳定性。

环境:

操作系统:WIN7

实现平台:MATLAB2014a

 

 本项目主要包括以下4部分:

  1. 特征点检测和提取(harris).
  2. 生成特征算子(sift).
  3. 图像匹配(match).
  4. 实验DEMO

一.特征点检测和提取(harris)

Harris 角点检测算法是由Chris Harris 和MikeStephens 在1988 年提出, 该算法是在Moravec 算法的基础上发展起来的。Moravec 算法是研究图像中一个局部窗口在不同方向进行少量的偏移后, 考察窗口内图像亮度值的平均变化。

需要考虑下面三种情况:
(1)如果窗口内区域图像的亮度值恒定,那么所有不同方向的偏移几乎不发生变化;
(2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化, 但是与边垂直的偏移会发生很大的变化;
(3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。
Harris检测方法考虑的是用一个高斯窗或矩形窗在图像上移动,由模板窗口取得原图像衍生出2 ×2的局部结构M 矩阵.对该模板矩阵求取特征值λ1 和λ2 , 建立度量函数R = detM - k(traceM)2,detM =λ1λ2 ,traceM =λ1+λ2, 
其中,Det(M)是矩阵M 的行列式值,Trace(M)是矩阵M 的迹,k=0.04。根据R是否大于0即可判断该点是否是角点。值得注意的是该方法具有旋转不变性
,但检测的角点有较大的冗余,需要根据实际经验来确定R的阈值。

自相关矩阵的计算和R值计算部分代码如下:

for i = 1:row
 for j = 1:col
  M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; %自相关矩阵
  R(i,j) = det(M) - k*(trace(M))^2; %根据公式计算R值
 end;
end;
Rmax = max(max(R));

实验得出,获取到的特征点与设定的搜索窗口密切相关。窗口越小,获取到的特征点越多,反之越少。当搜索窗口feature_width =16时,获取到的角点如下:

 

二.生成特征算子(sift)

SIFT算法是本项目的重点及难点,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。
Lowe 将SIFT 算法分解为如下四步:
1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

特殊说明

由于之前已经使用了harris对关键点进行了提取,所以对SIFT算法进行简化:直接使用harris获取到的关键点进行第3、4步计算。不再构建尺度空间检测和定位关键点。当然,这对尺度不变性的稳定性会有一些影响。

下面是具体是做法
二.1使用梯度直方图统计每个关键点的主方向

为关键点分配方向,目的是为了保证图像的旋转不变性。 具体实现是围绕关键点,选取一个窗口,窗口内计算各采样点的梯度和幅值,并统计360度(每10度一个直方图)的峰值,作为主方向。

窗口大小与关键点所在的空间尺度有关系,由于本项目没有构建尺度空间,所以窗口大小由多次试验后取效果较好的大小。本项目也设定了一个比例阀值,来表示达到直方图峰值的此比例,就列为关键点的辅方向,以便提高匹配时的鲁棒性。阀值默认是80%,即有一个方向超过峰值的80%的时候,就复制此关键点,并赋予此方向作为主方向参与后续的匹配。

以下是部分实现代码:

W = 8; %floor(3.0* sigmaw); %高斯加权窗口直径,取半径为4 调整
histo = zeros(1, NBINS); %累积之前初始化直方图
for xs = max(xp - W,1): min((N - 1), xp + W)
for ys = max(yp - W,1) : min((M-1), yp + W)
dx = (xs - xp);
dy = (ys - yp);
if dx^2 + dy^2 <= W^2 % 点在高斯加权圆内
wincoef = exp(-(dx^2 + dy^2)/(2*sigmaw^2)); %高斯窗口函数
bin = round( NBINS * angles(ys, xs)/(2*pi) + 0.5); %确定所在方向直方图的柱

histo(bin) = histo(bin) + wincoef * magnitudes(ys, xs); %用高斯加权后的向量幅度做直方图值累加
end

end
end
theta_max = max(histo); %找到直方图峰值
theta_indx = find(histo == theta_max); %关键点方向索引,大于80%峰值的角度

for i = 1: size(theta_indx, 2)
theta = 2*pi * theta_indx(i) / NBINS;
key_points = cat(1,key_points,[xp,yp,theta]); %幅值峰值大于80%的关键点,提高匹配的鲁棒性 
end

当阀值为1时(即只取最大峰值的方向),得到的中间结果是:

 

二.2构建4*4*8的128维特征向量

通过以上步骤,对于每一个关键点,拥有两个信息:位置、方向。接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
具体实现是将关键点附近的领域划分为d ×d (Lowe 建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8 个方向。每个方向45度。每个区域大小选取与分配方向时一样,通过多次试验,取效果较好的尺寸。本项目是取的16。

计算时必须将坐标轴旋转为关键点的方向,以确保旋转不变性,如图:

旋转后领域内采样点的新坐标为:

 

其中为关键点的方向。

然后将领域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8 个方向上,计算其权值。遍历所有采样点,得到4*4*8维的一个特征算子。为使得其对亮度变化不敏感,对其进行归一化处理。设定个分量的阀值为0.2,若大于此阀值,再进行归一化。综上,即可得到描述关键点是描述子。

代码详见get_features.m

 

三.图像匹配(match).

一般采用各种距离函数作为特征的相似性度量,如欧氏距离、马氏距离等。通过相似性度量得到图像间的潜在匹配。本项目采用欧氏距离来计算两特征向量的相似度。取图像1中的某个关键点J,并找出其与图像2中欧式距离最近的关键点I和次近的关键点。如果最近的距离除以次近距离小于比例阈值k(经验值在0.4~0.6内效果较好),则接受这一对匹配点J和I,否则J没有匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。 
以下是调用evaluate_correspondence对Notre Dame图像对的试验结果

序号 k 正确匹配数量 错误匹配数量
1 0.4 4 0
2 0.5 15 0
3 0.6 39 2
4 0.7 79 12
5 0.8 137 51

可观察到,当k值越大,得到的匹配数量对越多,但是稳定性也更差。最顶端的图像对,就是当k=0.6时的结果

 

四.实验DEMO.

1.尺度不变性测试(美的集团总部大楼):选取两幅角度不同,尺寸不同的美的总部大楼图像,匹配阀值k取0.4,进行测试,匹配效果较好

 

2.亮度、旋转不变性测试(书本):用手机拍了两幅背景、亮度不同,且旋转了大概180度的书本图片,匹配阀值k取0.5,进行测试,匹配效果较好

 

 

提示与说明

1.对SIFT算法进行简化:直接使用harris获取到的关键点进行计算。不构建尺度空间检测和定位关键点

2.高斯模糊参数通过试验取效果最好的值

3.对于其他图像对,由于没有评价代码,我自己写了个test函数,用来连接两两特征匹配对,以观察其匹配效果

4.计算图像梯度方向时公式是使用反正切arctan函数,但是在实现中此函数的值域是(-pi/2,pi/2),无法满足构建36个bin的要求,导致在测试旋转不变性时效果很差。

所以改使用atan2函数

5.get_features函数增加输出参数key_points,以方便在图像中显示观察

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CS143-project2 局部特征匹配 Local Feature Matching 的相关文章

  • Jaspersoft 环境搭建和入门简单实例

    JasperReport简介 JasperReport是一个强大 灵活的报表生成工具 能够展示丰富的页面内容 并将之转换成PDF HTML 或者XML格式 该库完全由Java写成 可以用于在各种Java应用程序 包括J2EE Web应用程序
  • BFS(广度优先算法)——判断无向简单图中任意两点是否连通

    include
  • dojo SplitContainer

    SplitContainer author amushen email amushen yahoo com cn qq 38371354 相关的文件 dojo widget LayoutContainer dojo widget HtmlW
  • Pytorch2.0中compiled_model=torch.compile(model) 的正确添加位置

    今天pytorch官网更新了pytorch2 0稳定版 迫不及待的我直接更新了 确实像官方所说 只需加入model torch compile model 一行代码即可加速 加入的位置如下 cpu训练 model UNet deep sup
  • 混杂设备与字符设备的区别----misc_register、 register_chrdev 的区别总结

    杂项设备 misc device 杂项设备也是在嵌入式系统中用得比较多的一种设备驱动 在 Linux 内核的include linux目录下有Miscdevice h文件 要把自己定义的misc device从设备定义在这里 其实是因为这些
  • openstack开发实践(一):devstack搭建all-in-one的openstack开发环境

    Devstack简介 devstack是面向开发者的一个openstack部署工具 用户可以指定不同的版本分支进行安装 devstack借助于Shell脚本实现openstack自动化部署 devstack源码中的stack sh即为安装脚
  • Python基于控制台的学生管理系统

    encoding utf 8 定义一个函数 显示可以使用的功能列表给用户 def showInfo print 30 print 学生管理系统 v1 0 print 1 添加学生的信息 print 2 删除学生的信息 print 3 修改学
  • MIPI信号的分析--结合示波器实际测试波形

    如果排查的思路对你有帮助 请记住 消雨匆匆 码字和排查很累 仅此而已 硬件不是抄电路 拿烙铁 懂点软件 细致分析 找问题和破案搜集线索是一样的 PS 硬件知识也可以性感 部分内容来自于此博客的大神总结 http www elecfans c
  • Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

    场景 Java GeoTools 开源的Java GIS工具包 快速入门 实现读取shp文件并显示 Java GeoTools 开源的Java GIS工具包 快速入门 实现读取shp文件并显示 霸道流氓气质的博客 CSDN博客 在上面实现J
  • 数字人+ChatGPT强强联手能擦出什么火花?

    随着元宇宙概念的快速发展 以数字人 ChatGPT为形式的创作方式正在颠覆传统视频创作方式 并在市场上呈现快速增长的态势 根据新榜的报道 目前已经有多位大V使用虚拟数字人来协助完成短视频制作 并且值得一提的是 这些视频并没有因为采用数字人而
  • 定时器编码器AB相电机测速( 补充)

    TIM编码器AB相电机测速 定时器编码器AB相电机测速 1 四倍频 2 算法应用 3 stm32硬件连接 3 stm32环境配置端口配置 3 C语言实现编码器个数读取 3 C语言实现编码器个数转换为速度 定时器编码器AB相电机测速 1 四倍
  • vue3配置eslint 出现问题

    vue3配置eslint 出现问题 标题必须使用导入来加载 ES 模块 ESlint Error Must use import to load ES Module 加上这一行即可
  • Jmeter之ForEach控制器

    场景运用 ForEach控制器一般和用户自定义变量或者正则表达式提取器一起使用 其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量 该控制器下的采样器或者控制器都会被执行一次或多次 每次读取不同的变量值 需求2 有一组
  • 学习java随堂练习-20220609

    学习Java的第八天 第1题 第2题 第3题 第4题 第5题 今天是学习Java的第八天 5道练习题 第1题 题目 1 循环输入近6年某高校的录取分数 求出平均分和最低分 运行结果 代码如下 循环输入近6年某高校的录取分数 求出平均分和最低
  • PHP操作Excel

    头 header Content Type application vnd ms excel header Content Disposition attachment filename sample xls header Pragma n
  • 时序预测

    时序预测 MATLAB实现DNN全连接神经网络时间序列预测 目录 时序预测 MATLAB实现DNN全连接神经网络时间序列预测 基本介绍 模型研究 程序设计 学习总结 参考资料 基本介绍 DNN的结构不固定 一般神经网络包括输入层 隐藏层和输
  • 传指针和传引用的区别以及指针和引用的区别

    一 引用 引用的定义 引用是给另外一个变量其别名 所以引用不会分配内存空间 引用是引入了对象的一个同义词 例如 Point pt1 10 10 Point pt2 pt1 上述的代码 定义了pt2为pt1的引用 通过这样的定义 pt2和pt
  • 让生产活动更高效,物料管理场景的RPA应用

    作为制造业 供应链领域常见环节 物料管理 Material Management 通常是对企业生产经营活动所需各种物料的采购 验收 供应 保管 发放 使用等一系列计划与控制活动的总称 物料管理科学与否 将会影响到组织各职能部门间的协调 生产
  • 文件的上传与下载

    一 文件上传 文件上传程序步骤 1 如何在web页面中添加上传输入项
  • python数据驱动测试设计_Python+unittest+DDT实现的数据驱动测试

    前言 数据驱动测试 避免编写重复代码 数据与测试脚本分离 通过使用数据驱动测试 来验证多组数据测试场景 通常来说 多用于单元测试和接口测试 ddt介绍 Data Driven Tests DDT 即数据驱动测试 可以实现不同数据运行同一个测

随机推荐

  • Gcov 详解 + 内核函数覆盖率测试方法详述及产生错误解决办法

    1 gcov是什么 Gcov is GCC Coverage 是一个测试代码覆盖率的工具 是一个命令行方式的控制台程序 伴随GCC发布 配合GCC共同实现对C C 文件的语句覆盖和分支覆盖测试 与程序概要分析工具 profiling too
  • 小白也能学会的爬虫教学(超详细,每一步都配图,不怕你学不会,图文并茂,看完直呼‘爽’)

    详细且简单的爬虫简单教学 小白看了之后直呼 爬虫就这 安装pycharm 一 新建一个工程 二 安装scrapy 三 创建Scrapy工程 四 如何使用scrapy 1 新建一个begin py文件 2 编辑begin py中的内容 3 修
  • hbase MapReduce程序样例入门

    hbase MapReduce程序样例入门 1 先看一个标准的hbase作为数据读取源和输出源的样例 Configuration conf HBaseConfiguration create Job job new Job conf job
  • 定时器:Quartz框架

    文章目录 简介 简单Demo cron 规则 参考 简介 Quartz是 OpenSymphony 开源组织在 Job scheduling 领域的开源项目 是由 java 开发的一个开源的任务日程管理系统 Quartz 是一个功能丰富的开
  • 如何下载安装VS2017下载 vs2017社区版

    如何下载安装VS2017下载 vs2017社区版 https blog csdn net zyhse article details 105362609 1 下载vs2017的引导程序 官方并没有为vs2017提供离线安装包 所以我们选择在
  • 操作系统课程设计

    关于完整代码 更详细内容 实验一环境配置 请访问github仓库地址 GitHub zzering OS course design 操作系统课设 系统调用 磁盘调度算法 文件调用 进程管理 分页置换算法 进程通信 实验一 为Linux系统
  • python二元操作符是什么_python笔记—06 讲:Pyhon 之常用操作符

    本期内容详解 1 算术运算符 加 减 乘 除 幂运算 地板除 1 和 的区别 在 Python 中的除运算符与其它程序语言的不太一样 表示真正的除号 例如 1 3 0 3333333333333333 而 4 2 的值为 2 0 说明两个数
  • Flask处理前台POST过来的JSON

    POST JSON数据的JS代码 ajax url http 127 0 0 1 5000 calc type post dataType json headers Content Type application json charset
  • 数据结构——线性表(C++)

    线性表 一 线性表的定义 二 线性表的抽象数据类型 三 线性表的顺序存储 1 顺序存储定义 2 顺序存储的实现方式 四 线性表的链式存储 五 其他线性表 参考 一 线性表的定义 线性表 零个或多个数据元素的有限序列 线性表是最常用且是最简单
  • 开启防火墙脚本

    sc config MpsSvc start AUTO net start MpsSvc
  • VMware ESX与VMware ESXi区别

    VMware ESX 与 VMware ESXi 区别 现在来讲vSphere就是ESXI 只是两种叫法而已 我们来看看VMware服务器虚拟化产品的历程 Vmware 服务器虚拟化第一个产品叫ESX 该产品只有60天测试 没有官方认可的免
  • DAY18:Xss 靶场通关手册

    DAY18 Xss 靶场通关手册 常见的xss注入 lt img src x onerror alert 1 gt
  • nvidia深度学习加速库apex简单介绍

    介绍地址 https docs nvidia com deeplearning sdk mixed precision training index html 本人英文水平有限 有误请指正 使用理由 使用精度低于32位浮点的数值格式有许多好
  • 设计模式(二十二) 策略模式

    有时候对象需要按照某种策略改变行为 我们可以利用策略模式 将策略或算法提取出来 作为单独的类实现 使用策略模式 可以让具体算法和应用对象分离 方便的根据不同条件替换策略 下面举一个例子 我们有一个计算器 它会按照快和慢两种策略来计算结果 所
  • 解决Linux普通用户使用Wireshark的权限不足的问题

    dumpcap需要root权限才能使用 如果是普通用户 Wireshark就没有权限使用dumpcap进行截取封包 解决方法 将dumpcap更改为Wireshark用户组 sudo chgrp wireshark usr bin dump
  • vue3_父子组件传参

    最近在看b站 小满zs 的vue3教程 巩固一下 1 父 gt 子组件 父组件自定义一个属性 用v bind 绑定在子组件上
  • couldn't find native method

    有两个原因 1 java这边native方法没有 native void renderFrameStart 2 c这边没有实现native方法 12 29 15 52 27 901 32735 32735 com ffmpegtest E
  • vue模板语法(上)

    目录 一 插值 什么是插值 建立一个html来编写插值 输出结果 二 指令 什么是指令 建立一个html来编写指令 输出结果 编辑 动态参数 输出结果 三 过滤器 什么是过滤器 建立一个html来编写过滤器 输出结果 4 计算属性 监听属性
  • STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

    STM32F103C8T6驱动舵机SG90 配置定时器TIM2 TIM3 TIM4的多种重映射模式下的不同IO口 1 使用到的工具介绍 2 整个简单介绍 3 程序的介绍 1 使用到的工具介绍 keil5 烧写软件FlyMcu exe 硬件为
  • CS143-project2 局部特征匹配 Local Feature Matching

    本项目通过harris算法对图像进行兴趣点的检测和提取 然后计算兴趣点周围4 4区域的8个方向特征向量 最后对获取到的特征向量对进行匹配 本算法对旋转 缩放 亮度变化保持一定程度的稳定性 环境 操作系统 WIN7 实现平台 MATLAB20