简介

BRISK算法是2011年ICCV上《BRISK:Binary Robust Invariant Scalable Keypoints》文章中,提出来的一种特征提取算法,也是一种二进制的特征描述算子。

它具有较好的旋转不变性、尺度不变性,较好的鲁棒性等。在图像配准应用中,速度比较:SIFT

BRISK算法

特征点检测

BRISK算法主要利用FAST9-16进行特征点检测(为什么是主要?因为用到一次FAST5-8),可参见博客:FAST特征点检测算法。要解决尺度不变性,就必须在尺度空间进行特征点检测,于是BRISK算法中构造了图像金字塔进行多尺度表达。

建立尺度空间

构造n个octave层(用ci表示)和n个intra-octave层(用di表示),文章中n=4,i={0,1,...,n-1}。假设有图像img,octave层的产生:c0层就是img原图像,c1层是c0层的2倍下采样,c2层是c1层的2倍下采样,以此类推。intra-octave层的产生:d0层是img的1.5倍下采样,d1层是d0层的2倍下采样(即img的2*1.5倍下采样),d2层是d1层的2倍下采样,以此类推。

则ci、di层与原图像的尺度关系用t表示为:

ci、di层与原图像大小关系为:

由于n=4,所以一共可以得到8张图,octave层之间尺度(缩放因子)是2倍关系,intra-octave层之间尺度(缩放因子)也是2倍关系。

特征点检测

对这8张图进行FAST9-16角点检测,得到具有角点信息的8张图,对原图像img进行一次FAST5-8角点检测(当做d(-1)层,虚拟层),总共会得到9幅有角点信息的图像。

非极大值抑制

对这9幅图像,进行空间上的非极大值抑制(同SIFT算法的非极大值抑制):特征点在位置空间(8邻域点)和尺度空间(上下层2x9个点),共26个邻域点的FAST的得分值要最大,否则不能当做特征点;此时得到的极值点还比较粗糙,需要进一步精确定位。

亚像素插值

进过上面步骤,得到了图像特征点的位置和尺度,在极值点所在层及其上下层所对应的位置,对FAST得分值(共3个)进行二维二次函数插值(x、y方向),得到真正意义上的得分极值点及其精确的坐标位置(作为特征点位置);再对尺度方向进行一维插值,得到极值点所对应的尺度(作为特征点尺度)。

特征点描述

高斯滤波

现在,我们得到了特征点的位置和尺度(t)后,要对特征点赋予其描述符。均匀采样模式:以特征点为中心,构建不同半径的同心圆,在每个圆上获取一定数目的等间隔采样点(所有采样点包括特征点,一共N个),由于这种邻域采样模式会引起混叠效应,所以需要对同心圆上的采样点进行高斯滤波。

采样模式如下图,蓝圈表示;以采样点为中心,

为方差进行高斯滤波,滤波半径大小与高斯方差的大小成正比,红圈表示。最终用到的N个采样点是经过高斯平滑后的采样点。下图是t=1时的。(文章中:N=60)

局部梯度计算

由于有N个采样点,则采样点两两组合成一对,共有N(N-1)/2钟组合方式,所有组合方式的集合称作采样点对,用集合

表示,其中像素分别是

,δ表示尺度。用

表示特征点局部梯度集合,则有:

定义短距离点对子集、长距离点对子集(L个):

其中,

,t是特征点所在的尺度。

现在要利用上面得到的信息,来计算特征点的主方向(注意:此处只用到了长距离子集),如下:

特征描述符

要解决旋转不变性,则需要对特征点周围的采样区域进行旋转到主方向,旋转后得到新的采样区域,采样模式同上。BRISK描述子是二进制的特征,由采样点集合可得到N(N-1)/2对采样点对,就可以得到N(N-1)/2个距离的集合(包含长、短距离子集),考虑其中短距离子集中的512个短距离点对,进行二进制编码,判断方式如下:

其中,

带有上标,表示经过旋转a角度后的,新的采样点。由此可得到,512Bit的二进制编码,也就是64个字节(BRISK64)。

匹配方法

汉明距离进行比较,与其他二进制描述子的匹配方式一样。

实验

opencv代码

#include

#include

#include

#include

#include

#include

using namespace cv;

using namespace std;

int main()

{

//Load Image

Mat c_src1 = imread( "1.png");

Mat c_src2 = imread("2.png");

Mat src1 = imread( "1.png", CV_LOAD_IMAGE_GRAYSCALE);

Mat src2 = imread( "2.png", CV_LOAD_IMAGE_GRAYSCALE);

if( !src1.data || !src2.data )

{

cout<< "Error reading images " << std::endl;

return -1;

}

//feature detect

BRISK detector;

vector kp1, kp2;

double start = GetTickCount();

detector.detect( src1, kp1 );

detector.detect( src2, kp2 );

//cv::BRISK extractor;

Mat des1,des2;//descriptor

detector.compute(src1, kp1, des1);

detector.compute(src2, kp2, des2);

Mat res1,res2;

int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;

drawKeypoints(c_src1, kp1, res1, Scalar::all(-1), drawmode);//画出特征点

drawKeypoints(c_src2, kp2, res2, Scalar::all(-1), drawmode);

cout<

cout<

BFMatcher matcher(NORM_HAMMING);

vector matches;

matcher.match(des1, des2, matches);

double end = GetTickCount();

cout<

Mat img_match;

drawMatches(src1, kp1, src2, kp2, matches, img_match);

cout<

imshow("matches",img_match);

cvWaitKey(0);

cvDestroyAllWindows();

return 0;

}

实验结果

视频地址

brisk matlab,opencv学习笔记三十七:BRISK特征点检测与匹配相关推荐

  1. 【OpenCV学习】(十)特征点检测与匹配

    [OpenCV学习](十)特征点检测与匹配 背景 提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度学习的领域中,特征代表着图像的信息,对于分类.检测任务都是至关重要的: 特征点应用的一些场 ...

  2. OpenCV学习笔记(十七):图像修补:inpaint()

    OpenCV学习笔记(十七):图像修补:inpaint() inpaint()函数 使用区域邻域在图像中还原选定区域. void inpaint( InputArray src, // 表示要修复的图 ...

  3. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  4. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()

    OpenCV学习笔记(十七):查找并绘制轮廓:findContours() 1.findContours() 函数 该函数使用Suzuki85算法从二值图像中检索轮廓.轮廓线是一种用于形状分析.目标检 ...

  5. OPENCV学习笔记 - SIFT 尺度不变特征变换 Python

    OPENCV学习笔记 - SIFT 尺度不变特征变换 Python 为什么我们需要SIFT尺度不变特征变换? 第一,建立高斯差分金字塔 第二,极值点的精确定位 第三,确定关键点的主方向 第四,构建关键 ...

  6. 9月6日关键点检测学习笔记——人脸和手部特征点检测

    文章目录 前言 一.干扰因素 1.主动因素 2.固有因素 二.特征点检测 1.PFLD 2.LLCV 三.人脸比对 1.人脸 1:1 2.人脸 1:n 3.人脸 1:N 4.人脸 M:N 四.高清分辨 ...

  7. 深度学习笔记(33) 特征点检测

    深度学习笔记(33) 特征点检测 1. 特征点 2. 设定特征点 3. 关键特征点 1. 特征点 利用神经网络进行对象定位,即通过输出四个参数值bx.by.bh和bw给出图片中对象的边界框 概括地说, ...

  8. Opencv学习笔记(三) -- 图像压缩与保存

    1.图像压缩 1.1常用图像格式 bmp Windows位图格式.该格式为不压缩格式,缺点是图像文件较大. jpg JPEG是为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用的.应用最 ...

  9. opencv学习笔记三十六:AKAZE特征点检测与匹配

    KAZE是日语音译过来的 , KAZE与SIFT.SURF最大的区别在于构造尺度空间,KAZE是利用非线性方式构造,得到的关键点也就更准确(尺度不变性 ): Hessian矩阵特征点检测 ,方向指定, ...

最新文章

  1. 图像处理学习三(频域图像增强)
  2. MPLS *** 高级教程(张洋讲解演示版)
  3. Java HttpClient 4.3.1 访问ASP.NET WebService
  4. Oracle优化05-执行计划
  5. Lind.DDD敏捷领域驱动框架~介绍
  6. java及python调用RabbitMQ
  7. 怎么使用mysql打表_MySQL的表使用
  8. C语言基础知识(二)-------C++变量及赋值
  9. 速度提升2倍,超强悍CPU级骨干网络PP-LCNet出世!
  10. php 织梦模板 防盗,织梦DedeCMS模板怎么防盗
  11. ffmpeg打开音频设备
  12. 拓端tecdat|Python使用神经网络进行简单文本分类
  13. 【水果识别】基于matlab GUI RGB+HSV水果成熟度分级系统【含Matlab源码 825期】
  14. SQL语言中的连接表
  15. Spread 16.0 for WinForms Crack
  16. 荒野大镖客2无法连接远程计算机,荒野大镖客2pc版常见问题解决办法_常见问题解决方法汇总...
  17. windows安装choco
  18. 遇到错误: 任务未能使用 SdkToolsPath“”或注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.7.2
  19. oracle 恢复表关联,ORACLE 12C使用RMAN进行表恢复
  20. ASP微信支付之扫码支付

热门文章

  1. vim graphical cheat sheet
  2. Java对接大华摄像头SDK
  3. composer syntax error, unexpected ‘|‘
  4. 画矩形(信息学奥赛一本通-T1097)
  5. CF333E Summer Earnings
  6. 判断给定的链表是否有环
  7. html innerhtml 绑定事件无效,innerHTML 中添加onclick步骤 不管用
  8. 《邱岳的产品实战》学习笔记:第8周
  9. 谷歌浏览器如何设置代理
  10. mac adb 卡死 命令无反应 一直等待的解决办法