OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

这篇具有很好参考价值的文章主要介绍了OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图片特征向量是一种用于描述图片内容的数学表示,它可以反映图片的颜色、纹理、形状等信息。图片特征向量可以用于做很多事情,比如图片检索、分类、识别等。

本文将介绍图片特征向量的提取以及相似度的计算,并使用C#来实现它们。

OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

文章开始前,我们先来简单了解一下 OpenCV 和 OpenCvSharp4,这两个库是本文的核心。

什么是OpenCV

OpenCV(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉和机器学习软件库,它支持多种编程语言,包含了数百种图像处理和计算机视觉算法。

什么是OpenCvSharp4

OpenCvSharp4 是一个基于 OpenCV 开发的跨平台图像处理库,它支持 .NET Framework 4.8+和 .NET Core 2.0+。它提供了丰富而易用的 API,可以实现各种图像处理功能。OpenCvSharp4 只包含核心的托管库,所以还需要另外安装对应操作系统的原生绑定包(OpenCvSharp4.runtime.*)。

图片特征向量提取

提取图片特征向量的方法有很多,本文将采用 SIFT 和 SURF 两种常用的算法。

SIFT算法

SIFT(Scale Invariant Feature Transform)算法是一种尺度不变的特征提取方法,它能够在不同的尺度空间中检测出稳定的关键点,并生成具有唯一性和不变性的描述符。SIFT 算法的主要优点是:

  • 尺度不变性:SIFT 算法使用了高斯金字塔来构建不同尺度的图像,并在每个尺度上进行极值点检测,从而实现了对尺度变化的不敏感。
  • 旋转不变性:SIFT 算法使用了梯度方向直方图来生成描述符,并根据关键点的主方向进行旋转归一化,从而实现了对旋转变化的不敏感。
  • 鉴别性强:SIFT 算法能够生成具有高维度和高信息量的描述符,使得每个关键点都具有唯一性和区分性,提高了匹配的可靠性。

使用 OpenCvSharp4 实现 SIFT 算法很简单,只需要调用SIFT.Create方法创建一个SIFT对象,然后调用DetectAndCompute方法从图片中提取特征点和描述符。下面是代码示例:

// 加载图片
Mat image1 = Cv2.ImRead("image1.jpg", ImreadModes.Grayscale);
Mat image2 = Cv2.ImRead("image2.jpg", ImreadModes.Grayscale);
​
// 创建SIFT对象
SIFT sift = SIFT.Create();
​
// 提取特征点和描述符
Mat descriptors1 = new Mat();
Mat descriptors2 = new Mat();
sift.DetectAndCompute(image1, null, out _, descriptors1);
sift.DetectAndCompute(image2, null, out _, descriptors2);

SURF算法

SURF(Speeded Up Robust Features)算法是一种快速而稳健的特征提取方法,它基于Harris角点检测和尺度不变特征变换(SIFT)算法改进而来。SURF 算法的主要优点是:

  • 速度快:SURF 算法使用了积分图和哈尔小波来加速特征点检测和描述符生成,比SIFT算法快几倍。
  • 稳健性高:SURF 算法对于旋转、缩放、亮度变化等干扰具有较好的鲁棒性,能够在不同的场景中保持稳定的性能。
  • 精度高:SURF 算法能够提取出高质量的特征点和描述符,提高了匹配的准确率。

使用 OpenCvSharp4 实现 SURF 算法也非常简单,只需要调用SURF.Create方法创建一个SURF对象,然后调用DetectAndCompute方法从图片中提取特征点和描述符。下面是代码示例:

// 加载图片
Mat image1 = Cv2.ImRead("image1.jpg", ImreadModes.Grayscale);
Mat image2 = Cv2.ImRead("image2.jpg", ImreadModes.Grayscale);
​
// 创建SURF对象
SURF surf = SURF.Create(500); // 500是阈值参数,表示特征点的最小响应值
​
// 提取特征点和描述符
Mat descriptors1 = new Mat();
Mat descriptors2 = new Mat();
surf.DetectAndCompute(image1, null, out _, descriptors1);
surf.DetectAndCompute(image2, null, out _, descriptors2);

图片相似度计算

提取了图片的特征向量后,我们就可以计算图片的相似度了。图片相似度的计算方法有很多,本文将介绍两种常用的方法:BFMatcher 和 FlannBasedMatcher,它们都是基于特征点匹配的方法,但是有一些区别。

BFMatcher

BFMatcher 是一种暴力匹配方法,它的原理是对于第一张图片中的每个特征点,都遍历第二张图片中的所有特征点,找出最接近的一个或多个特征点作为匹配结果。BFMatcher 的优点是简单直观,缺点是效率低,时间复杂度为 O(n^2),其中n是特征点的数量。

使用 OpenCvSharp4 实现 BFMatcher 也非常简单,只需要调用BFMatcher类的构造函数创建一个BFMatcher对象,然后调用Match方法进行匹配。下面是代码示例:

// 创建BFMatcher对象
BFMatcher bfMatcher = new BFMatcher(NormTypes.L2, false); // NormTypes.L2表示使用欧式距离作为相似度度量,false表示不交叉匹配
​
// 进行匹配
DMatch[] bfMatches = bfMatcher.Match(descriptors1, descriptors2); // bfMatches是一个数组,每个元素是一个DMatch对象,表示一对匹配结果

FlannBasedMatcher

FlannBasedMatcher 是一种近似最近邻匹配方法,它的原理是使用一种快速的索引结构来加速特征点的查找,从而降低时间复杂度。FlannBasedMatcher 的优点是效率高,缺点是精度略低,可能会出现一些错误的匹配。

使用 OpenCvSharp4 实现 FlannBasedMatcher 也非常简单,只需要调用FlannBasedMatcher类的构造函数创建一个FlannBasedMatcher对象,然后调用Match方法进行匹配。下面是代码示例:

// 创建FlannBasedMatcher对象
FlannBasedMatcher flannMatcher = new FlannBasedMatcher();
​
// 进行匹配
DMatch[] flannMatches = flannMatcher.Match(descriptors1, descriptors2); // flannMatches是一个数组,每个元素是一个DMatch对象,表示一对匹配结果

相似度得分

相似度得分的计算方法有很多,这里使用一种简单的方法:首先计算出每个匹配对的距离。然后对所有的距离求平均值,得到一个相似度得分,得分越小表示越相似。

我们对 BFMatcher 和 FlannBasedMatcher 的匹配结果都做了这个计算。

// 计算并显示BFMatcher和FlannBasedMatcher的相似度得分,得分越低越相似
Console.WriteLine("The score using BFMatcher is {0}", bfMatches.Average(m => m.Distance));
Console.WriteLine("The score using FlannBasedMatcher is {0}", flannMatches.Average(m => m.Distance));

这样,图片特征向量提取和相似度计算就实现了。完整代码可在公众号查看。

结果对比

接下来我们运行程序,从四种情况去查看结果。

1、两张完全不同的图片对比

这种情况下,我们可以预期得到很高的相似度得分,表示两张图片几乎没有相似之处。如图所示:

OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

SURF算法
The score using BFMatcher is 0.77414566
The score using FlannBasedMatcher is 0.77414566
SIFT算法
The score using BFMatcher is 366.84616
The score using FlannBasedMatcher is 372.25107

2、两张完全相同的图片对比

这种情况下,我们可以预期得到很低的相似度得分,表示两张图片完全一致。如图所示:

OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

SURF算法
The score using BFMatcher is 0
The score using FlannBasedMatcher is 0
SIFT算法
The score using BFMatcher is 0
The score using FlannBasedMatcher is 0

3、某一张图片和它的部分截图进行对比

这种情况下,我们可以预期得到中等的相似度得分,表示两张图片有部分重合。如图所示:

OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

SURF算法
The score using BFMatcher is 0.22462595
The score using FlannBasedMatcher is 0.23025486
SIFT算法
The score using BFMatcher is 105.93032
The score using FlannBasedMatcher is 108.3307

4、两张相似的图片进行对比

这种情况下,我们可以预期得到较低的相似度得分,表示两张图片有很多共同的特征。例如,我们可以使用两张不同角度拍摄的同一物体的图片进行对比。如图所示:

OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

 

SURF算法
The score using BFMatcher is 0.37855583
The score using FlannBasedMatcher is 0.38878053
SIFT算法
The score using BFMatcher is 239.1525
The score using FlannBasedMatcher is 248.43388

从上面的结果可以看出,SURF 和 SIFT 算法都可以提取图片特征向量,同时,BFMatcher 和 FlannBasedMatcher 也有区别。因此,在选算法时,需要根据具体的应用场景和需求进行权衡。

如果你对此感兴趣,还可以进一步探究,将图片特征向量存储到向量数据库中,实现更多的功能需求。比如,你可以使用 Redis 或  Elasticsearch,它们都支持对向量数据进行增、删、改、查等操作。

以下是相关推荐阅读:

1、ChatGPT Embeddings与Redis强强结合实现文本相似度分析与搜索

2、利用Redis实现向量相似度搜索:解决文本、图像和音频之间的相似度匹配问题

3、C#+Redis Search:如何用Redis实现高性能全文搜索

写作不易,转载请注明博文地址,否则禁转!!!文章来源地址https://www.toymoban.com/news/detail-711347.html

👇感谢阅读,点赞+分享+收藏+关注👇
OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算
文章出自猿惑豁微信公众号

到了这里,关于OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#结合OpenCVSharp4使用直方图算法比较图片相似度

    直方图有 灰度直方图 、 颜色直方图 ,如果是灰度图像,那么就用 灰度直方图 ,这里使用 颜色直方图 来计算两个图片的相似度。 这里只记录如何使用,至于算法原理,问就是不会。 直方图算法效率高,但精度不够,适合快速比较,例如 以图搜图 通过NuGet包管理器进行下载。

    2024年02月09日
    浏览(47)
  • 【大数据】文本特征提取与文本相似度分析

    写在博客前的话: 本文主要阐述如何对一段简短的文本做 特征提取 的处理以及如何对文本进行 分析 。 本文主要脉络以一个故事 s t o r y story s t ory 为主线,以该主线逐步延申,涉及到: 文本特征提取 、 词汇频率统计 (TF) , 反文档频率 (IDF) 以及 余弦相似度 计算的概念,

    2023年04月27日
    浏览(42)
  • 使用opencv实现图片相似度检测

    1.为什么学这个,我对图像处理非常感兴趣,我联想到海尔的指纹识别门锁是如何进行检测的,我在想不应该呀,单片机性能这么差,应该是使用了训练后的数据去检测图片的,如果我要实现草莓检测,知道它是不是草莓,我觉得单纯使用图片处理是不够的,我考虑过使用指纹模块来接触

    2024年02月05日
    浏览(38)
  • 学习笔记:Opencv实现图像特征提取算法SIFT

    2023.8.19 为了在暑假内实现深度学习的进阶学习,特意学习一下传统算法,分享学习心得,记录学习日常 SIFT的百科: SIFT = Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-c

    2024年02月12日
    浏览(48)
  • 矩阵理论| 基础:特征值与特征向量、代数重数/几何重数、相似对角化和Jordan标准型

    矩阵 A mathbf A A 的特征值与特征向量满足 A x = λ x mathbf Amathbf x=lambdamathbf x Ax = λ x ,即 ( A − λ I ) x = 0 (mathbf A-lambdamathbf I)mathbf x=0 ( A − λ I ) x = 0 ,且 x ≠ 0 mathbf xneq0 x  = 0 特征值 : d e t ( A − λ I ) = 0 det(mathbf A-lambdamathbf I)=0 d e t ( A − λ I ) = 0 的根,其中 p ( λ

    2024年02月05日
    浏览(55)
  • OpenCV中的人脸关键点检测和人脸特征提取如何实现?

    在OpenCV中,人脸关键点检测和人脸特征提取是常见的计算机视觉任务。OpenCV提供了一些用于实现这些任务的函数和算法。下面将介绍如何在OpenCV中实现人脸关键点检测和人脸特征提取。 1. 人脸关键点检测 人脸关键点检测是指识别和定位人脸上的关键点,如眼睛、鼻子、嘴巴

    2024年02月03日
    浏览(63)
  • OpenCv案例(九): 基于OpenCvSharp图像分割提取目标区域和定位

    以下原图中,物体连靠在一起,目的是将其分割开,再提取轮廓和定位 原图:   最终效果: 麻烦的地方是,分割开右下角部分,两个连在一起的目标物体,下图所示:  基本方法:BoxFilter滤波、二值化、轮廓提取,凸包检测,图像的矩 代码如下: 灰度图像后图像二值化:

    2024年02月11日
    浏览(39)
  • LightGlue-OpenCV 实现实时相机图片特征点匹配

    LightGlue 是一种新的基于深度神经网络,用来匹配图像中的局部特征的深度匹配器。是 SuperGlue 的加强版本。相比于 SuperGlue,LightGlue 在内存和计算方面更高效,同时结果更准确,也更容易训练。 其 原项目地址 如下: https://github.com/cvg/LightGlue 近期由于实习项目需要,需要在相

    2024年01月18日
    浏览(55)
  • OpenCV Python – 使用SIFT实现两张图片的特征匹配

     我们使用尺度不变特征变换(  SIFT  )特征描述符和暴力匹配算法实现两张图像的特征匹配。其中,  SIFT  用于找到图像中的关键点和描述符,而  暴力匹配算法  用于在两张图像中匹配描述符。 要使用  SIFT  特征检查器和  暴力  匹配算法实现两张图像的特征匹配,可

    2024年02月03日
    浏览(52)
  • OpenCV Python – 使用SIFT算法实现两张图片的特征匹配

    1.要实现在大图中找到任意旋转、缩放等情况下的小图位置,可以使用特征匹配算法,如 SIFT (尺度不变特征变换) 或 SURF (加速稳健特征)。这些算法可以在不同尺度和旋转情况下寻找匹配的特征点 2.我们使用了 SIFT 算法检测和匹配特征点,然后使用 RANSAC 算法计算透视变换矩阵

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包