基于特征的图像匹配c语言,一种基于SIFT和SUSAN特征的图像匹配方法

2024-03-25 01:59

本文主要是介绍基于特征的图像匹配c语言,一种基于SIFT和SUSAN特征的图像匹配方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘   要: 针对SIFT方法在角点检测上的不足,提出了一种基于SIFT和SUSAN混合特征匹配的自动匹配算法。算法应用SIFT 和SUSAN 两种具有互补特性的局部不变特征,利用SIFT方法检测空间极值特征点,利用SUSAN方法检测角点,结合两种特征点位置,利用SIFT方法生成匹配特征向量,最后根据最近邻特征点距离与次近邻特征点距离之比确定初始匹配点对,实现图像的配准。实验表明该算法有效,能够提高图像的自动匹配准确性。

关键词: 图像匹配; SIFT特征; SUSAN角点

图像匹配是图像处理的一个基本问题,在计算机视觉、图像配准、信息检索等领域得到了广泛的应用,是很多基于图像内容应用的基础。随着计算机技术的发展和数字图像应用的日益广泛,图像匹配技术在诸多领域内发挥越来越重要的作用。长期以来, 国内外很多学者都致力于解决图像匹配的技术问题。

简单来说,图像匹配就是找出两幅图像中相同或相似景物,目前图像匹配的方法一般分为基于区域匹配和基于特征匹配两类。

近年来,在计算机视觉领域,基于局部不变量描述符的方法在目标识别和图像匹配方面取得了显著发展。SIFT特征描述符克服了传统图像匹配在图像尺度、视差变化的局限性。参考文献[1]对10种最具代表性的特征匹配描述算子进行了实验和性能比较,结果表明, SIFT特征描述符在对光照变化、图像旋转、比例缩放、几何变形、模糊和图像压缩等6种情况下性能最好。

本文在SIFT方法的基础上加入SUSAN角点检测的思想,提出一种新的更加稳健的图像匹配方法。

1 SIFT特征检测

2004年, LOWE D提出了一种新的点特征匹配算法——SIFT(Scale Invariant Feature Transform)算法,较好地解决了场景部分遮挡、旋转缩放、视点变化引起的图像变形等问题,并且有效应用于目标识别、图像复原、图像拼接等领域。

SIFT算法首先在尺度空间进行特征点检测,并确定关键点的位置和所处的尺度,然后使用关键点邻域梯度的主方向作为该点的方向特征,以实现算子对尺度和方向的无关性。

1.1 尺度空间理论

尺度空间理论是一种对图像从多尺度考察图像特征的理论方法,能够发掘出很多从单一尺度无法发现的图像特征。

SIFT方法选用了高斯函数,利用其标准差σ作为尺度参数与图像进行卷积运算以产生多尺度的图像。一幅二维图像的尺度空间定义为:

515540fd5878798df33da55a762da373.gif

1.5 特征描述子

首先以特征点为中心取8×8的邻域作为采样窗口,窗口内每个方格代表特征点尺度空间的一个像素,箭头方向代表该像素的梯度相对于特征点方向的相对方向,箭头长度代表梯度的模,大圆圈代表加权的范围。然后利用直方图统计的方法,在每 4×4 的小块上计算 8 个方向的梯度方向直方图,即可形成 4 个种子点,如图1所示。

每个种子点可以产生8个方向信息,共4×8=32个方向信息,按顺序就可以组成32维的特征向量。本文采用16×16的采样窗口,一共产生16个种子点,产生16×8=128维的特征向量,更多的种子点可以增加匹配的稳定性。

2 SUSAN角点检测

1997年 SMITH S M和 BRADY J M提出了一种最小核值相似区SUSAN(Smallest Univalue Segment Assimilating Nucleus)算法,它直接对图像灰度值进行操作,方法简单,算法效率高,定位准确,对多个区域的角点也能精确检测,对局部噪声不敏感,抗噪能力强。

2.1 SUSAN方法简介

SUSAN方法其实是利用圆形模板遍历整个图像,如果模板内其他像素值与模板中心像素值相差小于一定阈值,就认为该点与中心点具有近似的灰度值,模板内满足这样条件的像素组成的区域称为核值相似区USAN(Univalue Segment Assimilating Nucleus)。利用这个区域可以将像素点的性质分成几类考虑,而属于直角角点的大概就是具有1/4模板大小的USAN区的像素点,如图2所示。

10c51b3dca0bdccf6aa012c272b1537f.gif

2.2  USAN区域

USAN区域利用中心点与周围像素的差值和预先设定的阈值进行比较得出,其相似比较函数表示为:

4bd23cc0d31d3df1011a1aaa1dbf9d28.gif

2.3 角点检测

SUSAN方法通过设定角点阈值,利用角点响应函数判断角点位置,计算公式如下:

01c63be861cf0f1034ba503e0320afbf.gif

其中g为角点阈值,它影响检测到的角点形状,g越小,检测到的角点越尖锐,一般设定为1/2模板区域大小。

SUSAN角点检测的最后一个阶段,就是寻找初始角点响应的局部最大值,在局部范围内,如果中心像素的初始响应是此区域内的最大值,则判断其属于角点。

3 基于SIFT和SUSAN特征检测

SIFT方法能够从尺度空间寻找出具有结构化特性的特征点,但是可能在视觉上没有特殊意义,而实际图像中很多具有视觉意义的特征位置,如角点利用SIFT方法检测会出现位置偏移或者漏检的情况,如图3所示。]

284563d30a44c9a4ad708bee43604fb4.gif

从图3可以看出,最右角出现漏检,其他角的特征点均发生一定程度的位置偏移,这是由于高斯平滑的过程中极值点会随着像素扩散引起的。但是图像上的角点往往是进行图像匹配比较理想的特征,SIFT方法并没有很好地将角点利用起来,遗漏了某些重要的角点信息。

本文在SIFT的基础上引入SUSAN角点检测就是为了增强其对图像特性信息的利用率,从而应用于图像匹配上得到更多有意义的正确匹配点,因为SUSAN能够有效检测出图像中的角点,如图4所示。

a6babf588ac718a273774d382c6a251e.gif

由图4可以看出,SUSAN方法能够准确定位并检测到4个角点。SUSAN角点检测的优点在于可以简单快捷地检测出图像的明显形状特征,但是针对纹理图像或者低对比度图像,效果并不明显。

通过以上分析, 本文在SIFT方法的基础上引入SUSAN角点检测思想,基本能够将图像中的结构化信息特征和形状信息的特征检测出来。算法的流程图如图5所示。

c7aca89e36a1edc924480978d0211477.gif

4 特征匹配

已经找出图像上的特征向量,接下来的任务就是特征匹配,即对特征向量作相似性度量判断其相似程度。本文采用两个向量的欧氏距离作为相似性的判断度量,欧氏距离定义如下:

6b87d788118a04e90a2d0459ea24fa72.gif

取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离小于某个比例阈值,则接受这一对匹配点。如果降低这个比例阈值,匹配点数目会减少,但更加稳定。最后再设定一个匹配点数目阈值,如果匹配点数目大于阈值,就认为两幅图像是相似的。

5 实验结论

在Core 2, 2.2 GHz CPU, 2.0 GB RAM的PC机上运行Solaris 10操作系统,采用C 语言编程实现了本文提出的算法,通过实验图片验证本文方法的有效性(限于篇幅,下文仅给出一组实验结果),并将本文算法与SIFT算法进行了实验分析和比较。实验中,最近邻特征点距离与次近邻特征点距离之比取0.7。

图6利用SIFT方法,左图和右图分别生成了356个和369个特征点,最终产生12对匹配对,其中两个错误匹配对;图7利用SUSAN方法,左图和右图分别生成了315个和358个特征点,最终产生25对匹配点,其中两个错误匹配对;图8结合两种方法,左图和右图分别生成了671个和727个特征点,最终产生33对匹配对,其中一个错误匹配对。

f9a7cd7f7d9003e4b4c9f7843b6ae666.gif

3a767230770d801af7368d5d1af72561.gif

SUSAN方法在更少的特征点中可以找出更多匹配点对,而且错误匹配率没有增加,由此可见,角点信息在特征匹配上非常有效。本文方法利用两种特征,得到更多的特征匹配对,并且降低了错误匹配率。

参考文献

[1] M IKOLAJCZYK K, SCHM ID C. A performance evaluation of local descriptors[J]. IEEE Transactions on Pattern  Analysis & Machine Intelligence, 2005,27(10):1615-1630.

[2] BROWN M, LOWE D. Invariant features from interest point groups[C].In Proceedings of the 13th British Machine Vision Conference. Cardiff: [s. n.], 2002:253-262.

[3] LOWE D. Object recognition from local scale-invariant features[C].In Proceedings of the International Conference on Computer. Corfu ,Greece:[s.n.],1999:1150-1157.

[4] SMITH S M, BRADY J M. SUSAN——a new approach to low level image processing[J]. Computer Vision,1997,23(10):45-78.

这篇关于基于特征的图像匹配c语言,一种基于SIFT和SUSAN特征的图像匹配方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30446393/article/details/117240624
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/843504

相关文章

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

sql语句字段截取方法

《sql语句字段截取方法》在MySQL中,使用SUBSTRING函数可以实现字段截取,下面给大家分享sql语句字段截取方法,感兴趣的朋友一起看看吧... 目录sql语句字段截取sql 截取表中指定字段sql语句字段截取1、在mysql中,使用SUBSTRING函数可以实现字段截取。例如,要截取一个字符串字

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态: