欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

图像处理之特征描述与匹配

发布时间:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 图像处理之特征描述与匹配 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

本节中主要介绍以下两点:

  • BRIEF算法介绍
  • ORB介绍

一、BRIEF(二进制的鲁棒独立基本特征)的原理介绍

**BRIEF提供了一种直接查找二进制字符串而无需查找描述符的快捷方式。**它需要平滑的图像补丁,并以独特的方式(在纸上展示)选择一组nd(x,y)n_d(x,y)nd(xy)位置对。然后,在这些位置对上进行一些像素强度比较。例如,令第一位置对为pppqqq。如果I(p)<I(q)I(p)<I(q)I(p)<I(q),则结果为1,否则为0。将其应用于所有ndn_dnd个位置对以获得ndn_dnd维位串。

ndn_dnd可以是128、256或512。OpenCV支持所有这些,但默认情况下将是256(OpenCV以字节为单位表示,因此值将为16、32和64)。因此,一旦获得此信息,就可以使用汉明距离来匹配这些描述符。

重要的一点是,BRIEF是特征描述符,它不提供任何查找特征的方法。因此,您将不得不使用任何其他特征检测器,例如SIFT,SURF等。本文建议使用CenSurE,它是一种快速检测器,并且BIM对于CenSurE点的工作原理甚至比对SURF点的工作要好一些。

简而言之,BRIEF是一种更快的方法特征描述符计算和匹配。除了平面内旋转较大的情况,它将提供很高的识别率。
OpenCV中的BRIEF

下面的代码显示了借助CenSurE检测器对Brief描述符的计算。(在OpenCV中,CenSurE检测器称为STAR检测器)注意,您需要使用opencv contrib)才能使用它。

import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('simple.jpg',0) # 初始化FAST检测器 star = cv.xfeatures2d.StarDetector_create() # 初始化BRIEF提取器 brief = cv.xfeatures2d.BriefDescriptorExtractor_create() # 找到STAR的关键点 kp = star.detect(img,None) # 计算BRIEF的描述符 kp, des = brief.compute(img, kp) print( brief.descriptorSize() ) print( des.shape )

函数brief.getDescriptorSize()给出以字节为单位的ndn_dnd大小。默认情况下为32。下一个是匹配项。
二、ORB(面向快速和旋转的BRIEF)
ORB基本上是FAST关键点检测器和Brief描述符的融合,并进行了许多修改以增强性能。首先,它使用FAST查找关键点,然后应用Harris角测度在其中找到前N个点。它还使用金字塔生成多尺度特征。但是一个问题是,FAST无法计算方向。那么旋转不变性呢?作者提出以下修改。

它计算角点位于中心的贴片的强度加权质心。从此角点到质心的矢量方向确定了方向。为了改善旋转不变性,使用x和y计算矩,它们应该在半径rrr的圆形区域中,其中rrr是斑块的大小。

现在,对于描述符,ORB使用Brief描述符。但是我们已经看到,BRIEF的旋转性能很差。因此,ORB所做的就是根据关键点的方向“引导” BRIEF。对于位置(xi,yi)(x_i,y_i)(xi,yi)上n个二进制测试的任何特征集,定义一个2×n2×n2×n矩阵S,其中包含这些像素的坐标。然后使用面片的方向θθθ,找到其旋转矩阵并旋转SSS以获得转向(旋转)版本SθS_θSθ

ORB将角度离散化为2π30\frac{2π}{30}302π(12度)的增量,并构造了预先计算的Brief模式的查找表。只要关键点方向θθθ在各个视图中一致,就将使用正确的点集SθS_θSθ来计算其描述符。

BRIEF具有一个重要的特性,即每个位特征具有较大的方差,且均值接近0.5。但是,一旦沿关键点方向定向,它就会失去此属性,变得更加分散。高方差使功能更具区分性,因为它对输入的响应不同。另一个理想的特性是使测试不相关,因为从那时起每个测试都会对结果有所贡献。为了解决所有这些问题,ORB在所有可能的二进制测试中进行贪婪搜索,以找到方差高且均值接近0.5且不相关的测试。结果称为rBRIEF。

对于描述符匹配,使用了对传统LSH进行改进的多探针LSH。该论文说,ORB比SURF快得多,而SIFT和ORB描述符比SURF更好。在全景拼接等低功耗设备中,ORB是一个不错的选择。
OpenCV中的ORB

与往常一样,我们必须使用函数cv.ORB()或使用feature2d通用接口来创建ORB对象。它具有许多可选参数。最有用的是nFeatures,它表示要保留的最大特征数(默认为500),scoreType表示是对特征进行排名的Harris分数还是FAST分数(默认为Harris分数)等。另一个参数WTA_K决定点数产生定向的BRIEF描述符的每个元素。默认情况下为两个,即一次选择两个点。在这种情况下,为了匹配,将使用NORM_HAMMING距离。如果WTA_K为3或4,则需要3或4个点来生成Brief描述符,则匹配距离由NORM_HAMMING2定义。 下面是显示ORB用法的简单代码。

import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('simple.jpg',0) # 初始化ORB检测器 orb = cv.ORB_create() # 用ORB寻找关键点 kp = orb.detect(img,None) # 用ORB计算描述符 kp, des = orb.compute(img, kp) # 仅绘制关键点的位置,而不绘制大小和方向 img2 = cv.drawKeypoints(img, kp, None, color=(0,255,0), flags=0) plt.imshow(img2), plt.show()

查看结果:

总结

以上是生活随笔为你收集整理的图像处理之特征描述与匹配的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。