内容来自OpenCV-Python Tutorials 自己翻译整理

目标:

了解BRIEF算法的基本原理

原理:

在SIFT算法使用128维的描述符,因为使用float类型描述,所以需要512字节的内存。
在SURF算法中,以64维描述符来计算,至少需要256字节的内存。
在创建一个含有数千个特征的向量会消耗大量的内存,这种情况在资源的有限的设备上不实用,尤其是嵌入式设备。 此外,计算时间也非常漫长。

但是在实际的匹配过程中,不是所有的维数都需要。我们可以使用一些方法来对维数进行压缩,例如PCA(主成分分析)算法,和LDA(线性判别式分析)算法等等。甚至使用LSH(局部敏感哈希)算法,把SIFT的描述符从浮点数类型转化成二进制字符串,然后对这些字符串使用汉明距离来进行匹配。由于韩明距离的计算方法只需要使用亦或位运算和位计数,在带有SSE指令的现代的CPU上计算速度很快。
不过,在此我们需要先找到描述符,然后才能使用哈希,进而计算汉明距离。不过这样没解决内存过大的问题。

BRIEF算法由此产生,该算法提供了一个很简介的手段在不寻找描述符的情况下,去寻找二进制字符串。

大致过程如下

首先找到特征点,在特征点附近划定一个正方形区域,使用高斯平滑去掉噪声。接下来,使用一种算法,在正方形区域当中选定一对点(x,y) ( x , y ) ,例如x点的像素值是p,y点是q,如果p小于q,那么结果产生结果1,否则产生结果0,如下下来寻找n对点,就会得到n维的二进制字符串。

维度可以是128,256,512,默认值256。

在得到二进制字符串后,就可以使用汉明距离来匹配这些描述符了。

这里注意,BRIEF算法不提供特征点检测功能,所以需要使用其他的特征检测器来找到特征点,例如SIFT算法或者SURF算法等等。本文腿甲你使用CenSurE检测算法来寻找特征点,最重要的是CenSurE检测算法配合BRIEF算法效果要比使用SURF算法效果更好。

SURF算法在没有选择的图像当中,匹配效果非常好。而且速度快,使用资源低,在有选择的图像当中,效果很差。

关于BRIEF的原版论文和CenSurE检测器的论文

OpenCV中的BRIEF算法

在OpenCV中CenSurE检测器叫做STAR

import numpy as np
import cv2 
from matplotlib import pyplot as plt

img = cv2.imread('1.jpg',0)

# 初始化STAR检测器
star = cv2.xfeatures2d.StarDetector_create()
# 初始化BRIEF特征提取器
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
# 使用STAR寻找特征点
kp = star.detect(img,None)
# 计算特征描述符
kp, des = brief.compute(img, kp)

img = cv2.drawKeypoints(img,kp,img,color=(255,0,0))

cv2.imshow('p',img)

cv2.waitKey(0)
print( brief.descriptorSize() )
print( des.shape )

VIF怎么计算 pytorch python计算vif_特征点检测

STAR检测器文档
https://docs.opencv.org/master/dd/d39/classcv_1_1xfeatures2d_1_1StarDetector.html
BRIEF的文档
https://docs.opencv.org/master/d1/d93/classcv_1_1xfeatures2d_1_1BriefDescriptorExtractor.html