OpenCV入门(二十八)快速学会OpenCV 27 图像匹配

这篇具有很好参考价值的文章主要介绍了OpenCV入门(二十八)快速学会OpenCV 27 图像匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:Xiou

1.使用基于FAST特征和BRIEF描述符的ORB

如果说SIFT还很年轻,SURF更年轻,那么ORB就还处于婴儿期。ORB首次发布于2011年,作为SIFT和SURF的一个快速代替品。该算法发表在论文“ORB:an efficient alternative to SIFT or SURF”上,可以在

http://www.willowgarage.com/sites/default/files/orb_final.pdf

处找到PDF格式的论文。ORB融合了FAST关键点检测器和BRIEF关键点描述符,所以有必要先了解一下FAST和BRIEF。接下来,我们将讨论蛮力匹配(用于特征匹配的算法)并举一个特征匹配的例子。

1.1 FAST

加速分割测试的特征(Feature from Accelerated Segment Test,FAST)算法是通过分析16个像素的圆形邻域来实现的。
FAST算法把邻域内每个像素标记为比特定阈值更亮或更暗,该阈值是相对于圆心定义的。
如果邻域包含若干标记为更亮或更暗的一系列连续像素,那么这个邻域就被视为角点。FAST还使用了一种高速测试,有时可以通过只检查2个或者4个像素(而不是16个像素)来确定邻域不是角点。

FAST是一个智能算法,但是它并不是没有缺点,为了弥补这些缺点,从事图像分析的开发人员可以实现一种机器学习算法,以便为算法提供一组(与给定应用程序相关的)图像,从而优化阈值等参数。不管开发人员是直接指定参数,还是为机器学习方法提供一个训练集,FAST都是对输入很敏感的一种算法,也许比SIFT更敏感。

1.2 BRIEF

另外,二值鲁棒独立基本特征(Binary Robust Independent Elementary Feature,BRIEF)并非特征检测算法,而是一个描述符。我们来更深入地研究一下描述符的概念,然后再来研究BRIEF。

在前面用SIFT和SURF分析图像时,整个过程的核心是调用detectAndCompute函数。此函数执行两个不同的步骤——检测和计算,它们返回2个不同的结果(耦合到一个元组中)。

检测结果是一组关键点,计算结果是这些关键点的一组描述符。这意味着OpenCV的cv2.SIFT和cv2.SURF类都实现了检测和描述算法。请记住,原始的SIFT和SURF不是特征检测算法。OpenCV的cv2.SIFT实现了DoG特征检测和SIFT描述,而OpenCV的cv2.SURF实现了快速Hessian特征检测和SURF描述。

关键点描述符是图像的一种表示,充当特征匹配的通道,因为你可以比较两幅图像的关键点描述符并发现它们的共性。BRIEF是目前最快的描述符之一。

BRIEF背后的理论相当复杂,但是可以这样说,BRIEF采用一系列优化,使其成为特征匹配的一个非常好的选择。

1.3 蛮力匹配

蛮力匹配器是一个描述符匹配器,它比较两组关键点描述符并生成匹配列表。之所以称为蛮力匹配,是因为在该算法中几乎不涉及优化。对于第一个集合中的每个关键点描述符,匹配器将之与第二个集合中的每个关键点描述符进行比较。每次比较产生一个距离值,并基于最小距离选择最佳匹配。

概括地说,在计算中,“蛮力”一词是指将所有可能组合(例如,破解已知长度密码的所有可能的字符组合)的穷举按优先级排序的方法。

相反,优先考虑速度的算法可能会跳过一些可能性,并试图走一条捷径来找到看似最合理的解决方案。OpenCV提供了一个cv2.BFMatcher类,支持几种蛮力特征匹配的方法。

2.代码实例

ORB的目标是优化和加速操作,包括非常重要的以旋转感知的方式利用BRIEF的步骤,这样匹配就得以改善,即使在训练图像与查询图像有非常不同的旋转状态的情况下也是如此。不过,在这个阶段,你可能已经了解了足够的理论,希望深入研究一些特征匹配,我们来看一些代码。下面的脚本试图将标识中的特征与包含该标识的照片中的特征进行匹配:

import cv2
from matplotlib import pyplot as plt

# Load the images.
img0 = cv2.imread('../images/nasa_logo.png',
                  cv2.IMREAD_GRAYSCALE)
img1 = cv2.imread('../images/kennedy_space_center.jpg',
                  cv2.IMREAD_GRAYSCALE)

# Perform ORB feature detection and description.
orb = cv2.ORB_create()
kp0, des0 = orb.detectAndCompute(img0, None)
kp1, des1 = orb.detectAndCompute(img1, None)

# Perform brute-force matching.
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des0, des1)

# Sort the matches by distance.
matches = sorted(matches, key=lambda x:x.distance)

# Draw the best 25 matches.
img_matches = cv2.drawMatches(
    img0, kp0, img1, kp1, matches[:25], img1,
    flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)

# Show the matches.
plt.imshow(img_matches)
plt.show()

查询图像:
OpenCV入门(二十八)快速学会OpenCV 27 图像匹配

输出结果:

OpenCV入门(二十八)快速学会OpenCV 27 图像匹配

与使用SIFT和SURF的方式类似,我们检测并计算这两幅图像的关键点和描述符。从这里开始,概念非常简单:遍历描述符并确定是否匹配,然后计算匹配的质量(距离),并对匹配进行排序,这样就可以在一定程度上显示前n个匹配,它们实际上匹配了两幅图像上的特征。cv2.BFMatcher可以实现这一任务。

3.match vs knnMatch

match 格式:

match = bf.match(des1, des2)

返回值:

querlyIdx: 测试图像的特征点的 index
trainIdx: 测试图像的特征点的 index
distance: 匹配特征点的欧式距离, 数值越小越接近

knnMatch 格式:

match = bf.knnMatch(des1, des2, k)

返回值:

m: 最近的匹配特征点
n: 第二近的匹配点, 如果 m 和 n 的距离足够大, 那么这就是一个正确的匹配

knnMatch返回列表的列表,每个内部列表至少包含一个匹配项,且不超过k个匹配项,各匹配项从最佳(最短距离)到最差依次排序。

代码实例:

import cv2
from matplotlib import pyplot as plt

# Load the images.
img0 = cv2.imread('../images/nasa_logo.png',
                  cv2.IMREAD_GRAYSCALE)
img1 = cv2.imread('../images/kennedy_space_center.jpg',
                  cv2.IMREAD_GRAYSCALE)

# Perform ORB feature detection and description.
orb = cv2.ORB_create()
kp0, des0 = orb.detectAndCompute(img0, None)
kp1, des1 = orb.detectAndCompute(img1, None)

# Perform brute-force KNN matching.
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False)
pairs_of_matches = bf.knnMatch(des0, des1, k=2)

# Sort the pairs of matches by distance.
pairs_of_matches = sorted(pairs_of_matches, key=lambda x:x[0].distance)

# Draw the 25 best pairs of matches.
img_pairs_of_matches = cv2.drawMatchesKnn(
    img0, kp0, img1, kp1, pairs_of_matches[:25], img1,
    flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)

# Show the pairs of matches.
plt.imshow(img_pairs_of_matches)
plt.show()

# Apply the ratio test.
matches = [x[0] for x in pairs_of_matches
           if len(x) > 1 and x[0].distance < 0.8 * x[1].distance]

# Draw the best 25 matches.
img_matches = cv2.drawMatches(
    img0, kp0, img1, kp1, matches[:25], img1,
    flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)

# Show the matches.
plt.imshow(img_matches)
plt.show()

输出结果:

OpenCV入门(二十八)快速学会OpenCV 27 图像匹配文章来源地址https://www.toymoban.com/news/detail-408586.html

到了这里,关于OpenCV入门(二十八)快速学会OpenCV 27 图像匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • opencv_c++学习(二十八)

    如上图所示,根据图像的情况反推相机的运动情况。 如实现上述功能则需要拍摄当前物体的图像,然后拍摄一段时间之后物体的图像,然后联合两张图像则可以获取两个时刻的相机位姿关系。 位姿估计函数: objectPoints:前一时刻世界坐标系中的3D点的三维坐标。 imagePoints: 3

    2024年02月07日
    浏览(44)
  • OpenCV(二十八):连通域分割

    目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割        连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以用于物体

    2024年02月09日
    浏览(47)
  • OpenCV自学笔记十八:模板匹配

    模板匹配是一种在图像中寻找指定模式的方法。OpenCV库提供了用于模板匹配的函数,可以帮助我们在图像中定位和识别特定的模式。下面是模板匹配的基础原理和一个示例: 模板匹配通过在待匹配图像上滑动一个固定大小的模板图像,并计算模板与图像之间的相似度来寻找匹

    2024年02月07日
    浏览(38)
  • opencv#27模板匹配

         例如给定一张图片,如上图大矩阵所示,然后给定一张模板图像,如上图小矩阵。      我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域,通过比较灰色区域中的内容与模板中

    2024年01月23日
    浏览(45)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(397)
  • OpenCV快速入门:图像形态学操作

    图像形态学是一门强大而有趣的技术,它通过对图像进行形态学操作,使图像更适合后续处理步骤。在本文中,我们将深入探讨OpenCV中的图像形态学操作,快速入门这一关键领域。 图像形态学作为数字图像处理的一个分支,致力于通过形态学操作实现对图像特征的提取、噪音

    2024年02月05日
    浏览(98)
  • Python遥感图像处理应用篇(二十八):Python绘制遥感图像分类结果混淆矩阵和计算分类精度

    Indians Pines高光谱数据,使用SVM分类方法(选取10%样本量)计算得到的结果。 参考数据: 分类数据:

    2024年02月13日
    浏览(57)
  • OpenCV(十八):图像直方图

    目录 1.直方图统计 2.直方图均衡化 3.直方图匹配 1.直方图统计        直方图统计是一种用于分析图像或数据的统计方法,它通过统计每个数值或像素值的频率分布来了解数据的分布情况。 在OpenCV中,可以使用函数 cv::calcHist() 来计算图像的直方图。 calcHist() 函数的原型如下

    2024年02月10日
    浏览(64)
  • 从零开始学习 Java:简单易懂的入门指南之异常(二十八)

    异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中,异常本身

    2024年02月08日
    浏览(75)
  • WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)

    WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列十一——依赖属性(一) WPF入门教程系列十五——WPF中的数据绑定(一)       7.上面Buttom的

    2024年02月09日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包