OpenCV 第六章 图像检索以及基于图像描述符的搜索

6.1 特征检测算法
OpenCV中最常使用的特征检测和提取算法有:
1.
Harris: 该算法用于检测角点
2.
SIFT: 该算法用于检测斑点(blob)
3.
SURF:该算法用于检测斑点
4.
FAST:该算法用于检测角点
5.
BRIEF:该算法用于检测斑点
6.
ORB:该算法代表带方向的FAST算法与具有旋转不变性的BRIEF算法

通过以下方式进行特征匹配:
*
暴力匹配法
*
基于FLANN的匹配法

6.1.1 特征定义
特征:区域具有独特性或者易于识别性。因此,角点及高密度区域是很好的 特征,而大量重复的模式或低密度区域则不是很好的特征

使用cornerHarris( )函数检测图像的角点( 角点也是处在一个无论框框往哪边移动 框框内像素值都会变化很大)
cornerHarris参数:

src - 数据类型为 float32 的输入图像。

blockSize - 标记的大小。

ksize - Sobel 求导中使用的窗口大小

k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].

dst = cv2.cornerHarris(src=gray, blockSize=2, ksize=23, k=0.04)

6.1.2 使用DoG和SIFT进行特征提取与描述
角点会受到图像大小的影响,如果减小(或增大)图像的大小,可能会丢失图像的某些部分,甚至可能增加焦点的质量。
这样的特征损失需要一种与图像比例无关的角点检测方法来解决-----尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)。 SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。
SIFT并不检测关键点(关键点可以由Different of Gaussians检测),但SIFT会通过一个特征向量来描述关键点周围区域的情况。

创建SIFT对象,SIFT会使用DoG检测关键点,并且对每个关键点周围的区域计算特征向量

sift = cv2.xfeatures2d.SIFT_create()

# sift = cv2.xfeatures2d.SURF_create(float(4000))

# 将图片进行SURF计算,并找出角点keypoints,keypoints是检测关键点

# descriptor是描述符,这是图像一种表示方式,可以比较两个图像的关键点描述符,可作为特征匹配的一种方法。

keypoints, descriptor = sift.detectAndCompute(gray, None)

关键点的属性:
pt: 点的x y坐标
size: 表示特征的直径
angle: 特征方向
response: 关键点的强度
octave: 特征所在金字塔层级
算法进行迭代的时候, 作为参数的图像尺寸和相邻像素会发生变化
octave属性表示检测到关键点所在的层级
ID: 检测到关键点的ID

6.1.3 使用快速Hessian算法和SURF来提取和检测特征
cv2.xfeatures2d.SURF_create()
6.1.4 基于ORB的特征检测和特征匹配
ORB基于FAST关键点检测技术和基于BRIFEF描述符的技术相结合
FAST算子的基本原理是:若某像素点与其周围领域内足够多的连续的像素点存在某一属性差异,并且该差异大于指定阈值,则可以断定该像素点与其邻域像素有可被识别的不同之处,可以作为一个特征点(角点);对于灰度图像,FAST算子考察的属性是像素与其邻域的灰度差异。
BRIEF(Binary Robust Independent Elementary Features)并不是特征检测算法,它只是一个描述符。
检测结果是一组关键点,计算结果是描述符。这意味着OpenCV的SIFT类和SURF类既是检测器也是描述符(尽管算法本身并不是这样的!OpenCV的SIFT是DoG和SIFT的组合,SURF是快速Hessian和SURF的组合)。
暴力(Brute-Force)匹配方法是一种描述符匹配方法,该方法会比较两个描述符,并产生匹配结果的列表。称为暴力匹配的原因是该算法基本上不涉及优化,第一个描述符的所有特征都用来和第二个描述符的特征进行比较。每次比较都会给出一个距离值,而最好的比较结果会被认为是一个匹配。
6.1.5 ORB特征匹配
orb = cv2.ORB_create() # 创建ORB检测器,用于检测计算关键点和描述符
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 获得暴力匹配检测器
matches = bf.match(desc1, desc2) # 进行匹配
6.1.6 K-最近邻匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 获得暴力匹配检测器
matches = bf.knnMatch(desc1, desc2, k=1) #KNN匹配
6.1.7 FLANN匹配

kdtree建立索引方式的常量参数

FLANN_INDEX_KDTREE = 0

indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)

searchParams = dict(checks=50) # checks指定索引树要被遍历的次数

# 获取flann匹配器3

6.1.8 FLANN的单应性匹配
单应性指的是图像在投影发生了 畸变后仍然能够有较高的检测和匹配准确率

大规模图像检索的代码,matlab与c++混合编程。总结了目前图像检索领域目前主要存在的方法。通过阅读该代码,可以对于经典的“词袋”模型(bow模型)有个具体的了解,但是该代码没有提供前序的特征提取,是直接从对提取好的特征向量聚类开始的,包括了k-means,分层k-means(HKM)聚类,倒排文件的建立和索引等,该代码还提供了局部敏感哈希(LSH)方法。最后,这份代码是下面这篇论文的作者提供的, Indexing in Large Scale Image Collections: Scaling Properties and Benchmark-This C++/Matlab package implements several algorithms used for large scale image search. The algorithms are implemented in C++, with an eye on large scale databases. It can handle millions of images and hundreds of millions of local features. It has MEX interfaces for Matlab, but can also be used (with possible future modifications) from Python and directly from C++. It can also be used for approximate nearest neighbor search, especially using the Kd-Trees or LSH implementations. The algorithms can be divided into two broad categories, depending on the approach taken for image search: 1. Bag of Words: ---------------- The images are represented by histograms of visual words. It includes algorithms for computing dictionaries: * K-Means. * Approximate K-Means (AKM). * Hierarchical K-Means (HKM). It also includes algorithms for fast search: * Inverted File Index. * Inverted File Index with Extra Information (for example for implementing Hamming Embedding).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值