本文着重介绍了用于图像特征点检测的算法,FAST算法,以及使用matlab的实现。

FAST算法是一种拐点检测算法,其主要应用于提取图像中的特征点,在动态成像的一系列图像中追踪定位对象。众所周知,我们生活的世界是动态化的,3D的,如何关联动态化过程中的平移,畸变,旋转对象,对每一帧的图像与上一帧之间的空间关系进行分析,很大程度上需求我们在每一帧中找到对应的关键点。FAST方法,拐点检测方法,简单来说就是用于提取图像中的关键点的算法,为进一步的图像处理,包括相机标定,SLAM打下了基础。

1. FAST算法解析

FAST拐点检测算法使用了一个包含了16个像素点的圆来判断目标点P是不是一个真正意义上的拐点。这16个像素点标序号为1至16。对于每一个候选像素点P,其强度为IpI_pIp​ (灰度图中即为该像素点的灰度值)。如果该圆中N个连续像素都比候选像素点P的强度亮很多,或都比候选像素点P的强度暗很多,那么P就被分类为一个拐点。 这个也比较好理解,即找出局部范围内最亮或最暗的点,作为局部图像的关键点。P为拐点所包含的情况如下:

  • 条件1 : 一系列NNN个连续的像素点SSS,∀s∈S,Ix>Ip+t{\forall} s\in S, I_x > Ip + t∀s∈S,Ix​>Ip+t
  • 条件2 : 一系列NNN个连续的像素点SSS, ∀s∈S,Ix<Ip−t{\forall} s\in S, I_x < Ip - t∀s∈S,Ix​<Ip−t

满足两个条件其中的任意一个,则可以认为像素点P为该局部区域的一个拐点。上述条件中,NNN 为连续的像素点个数,IxI_xIx​为像素点xxx的强度,ttt为设置的阈值。显然,调整NNN以及阈值ttt,可以影响被分类为拐点的像素点P的个数。NNN值越大,被分类为拐点的像素点个数就会减少,同样ttt值越大,被分类为拐点的像素点个数也会减少。
tips : 所谓的NNN个连续的像素点,指的是例如N=5N = 5N=5 , [1,2,3,4,5],[2,3,4,5,6]...[1,2,3,4,5], [2,3,4,5,6]...[1,2,3,4,5],[2,3,4,5,6]...这样的像素点称为NNN个连续的像素点。


接下来我们就看看使用matlab如何实现这个拐点检测算法FAST。

2. MATLAB实现

下面就放出matlab代码,用于检测图像I中基于阈值t的拐点的函数。返回一个包含了这些拐点像素点坐标的矩阵。注释中详细解释了代码的原理。

function CS = FAST(I,t)
%     I : 灰度图片
%     t : 用户选择的阈值% 定义一个矩阵,描述了16个像素点关于待测像素点P的坐标关系。
% 需要注意的是,这些坐标的定义(i,j)为先行后列。
List_voisinage = [  -3 0;-3 1;-2 2;-1 3;0 3;1 3;2 2;3 1;3 0;3 -1;2 -2;1 -3;0 -3;-1 -3;-2 -2;-3,-1];
[height, width] = size(I);
% 初始化CS矩阵为空矩阵
CS = [];
const = 3;
% 定义N个连续的像素点,这里取值12,可以根据需求更改
N = 12;
% 由于我们要在整个图像上进行遍历,因此在没有Padding补充的情况下,需要考虑边缘的像素点
for i = const+1 : height - constfor j = const+1 : width - constIp = I(i,j);% 与算法描述相同,根据阈值规定上限下限upper = Ip + t;lower = Ip - t;% 将P周围的16个像素点的坐标及他们的灰度值,分别保存在coordonne_list 和% values_list 中                      coordonne_list = zeros(16,2);values_list = zeros(16,1,"uint8");for k = 1:16coordonne_list(k,:) = List_voisinage(k,:) + [i, j];values_list(k,:) = I(coordonne_list(k,1),coordonne_list(k,2));end% X1向量,用于判断条件1是否满足X1 = zeros(16,1); for k = 1:16% 遍历,给X1向量赋值 0 或 1 的逻辑值X1(k) = values_list(k,1) > upper; end cond1voisins = X1;cond1verifiee = 0;compteur = 0;% 当条件1满足或数组已经循环平移过整个数组长度16时,结束循环while ~cond1verifiee && (compteur<16)nbVoisinCond1 = sum(cond1voisins(1:N));% 判断是否N个bool值都是1,即X1前N项和为Ncond1verifiee = (nbVoisinCond1 == N);% cirshift函数用于循环平移数组cond1voisins = circshift(X1,1)';compteur = compteur + 1;end% 满足条件1的时候,将目标点P的坐标添加进矩阵CSif cond1verifieeCS = [CS;[i,j]];      else% 如果条件1不满足,则继续判断条件2,与条件一大同小异X2 = zeros(16,1);for k = 1:16X2(k) = values_list(k,1) < lower;endcond2voisins = X2;cond2verifiee = 0;compteur = 0;while ~cond2verifiee && (compteur<16)nbVoisinCond2 = sum(cond2voisins(1:N));cond2verifiee = (nbVoisinCond2 == N);cond2voisins = circshift(X1,1)';compteur = compteur + 1;end% 同样如果满足了条件2,点P也分类为拐点,将其坐标添加入矩阵CSif cond2verifieeCS = [CS;[i,j]];end    end end    endend

3. 使用FAST function进行拐点检测的实验

I1 = imread("1.JPG");
I1_gray = rgb2gray(I1);
cs1 = FAST(I1_gray,30);
figure()
imagesc(I1)
hold on
plot(cs1(:,2),cs1(:,1),"*")

检测目标点结果如下 :



在这个实例中,设置了N值为12,阈值t为30。通过调整这两个变量可以改变提取出的关键点的个数。

\newline
\newline
\newline
参考文献 :

  • Rosten, Edward; Reid Porter; Tom Drummond (2010). “FASTER and better: A machine learning approach to corner detection”. IEEE Transactions on Pattern Analysis and Machine Intelligence. 32 (1): 105–119. arXiv:0810.2434. doi:10.1109/TPAMI.2008.275. PMID 19926902.

特征点检测 FAST算法及代码详解相关推荐

  1. 目标检测Tensorflow:Yolo v3代码详解 (2)

    目标检测Tensorflow:Yolo v3代码详解 (2) 三.解析Dataset()数据预处理部分 四. 模型训练 yolo_train.py 五. 模型冻结 model_freeze.py 六. ...

  2. 目标检测 | RCNN算法系列汇总+详解(包括Fast, Faster)

    一.RCNN 1. 介绍 2. 步骤流程 3. 部分详解 4. 缺点 二.Fast RCNN 1. 介绍: 2. 步骤流程 3. 部分详解 4. 比较 三.Faster RCNN 1. 介绍 2. 步 ...

  3. SLAM-Visual Navigation学习之SIFT算法与代码详解

    ** SIFT算法 ** 文章目录 SIFT算法 一.特征点,关键点,角点? 二.前置知识 1.尺度 2.卷积 3.高斯函数 4.高斯卷积(模糊) 三.SIFT算法的引入 Harris算法缺陷: 1. ...

  4. PointPillars点云检测在OpenPCDet推理代码详解

    在之前的文章中已经详细解析了PointPillars的论文和训练代码的实现和详解,可以参考之前的博客:PointPillars论文解析和OpenPCDet代码解析_NNNNNathan的博客-CSDN ...

  5. 目标检测 /yolo算法原理的详解

    前言 谈到计算机视觉时,我们都会联想到图像分类,图像分类是计算机视觉最基本的任务之一,在图像分类的基础上,我们还有更复杂的任务,比如目标检测,物体定位,图像分割等,本文主要讲目标检测,目标检测是分类与 ...

  6. 《机器学习实战》第二章学习笔记:K-近邻算法(代码详解)

    <机器学习实战>数据资料以及总代码可以去GitHub中下载: GitHub代码地址:https://github.com/yangshangqi/Machine-Learning-in-A ...

  7. 鲸鱼算法matlab代码详解(一)

    主函数 clear all  clc SearchAgents_no=30; %此处为搜索代理的数量,也就是种群的数量 Function_name='F1'; %此处为调用目标函数的信息编号 Max_ ...

  8. MeanTeacher文章解读+算法流程+核心代码详解

    MeanTeacher 本博客仅做算法流程疏导,具体细节请参见原文 原文 原文链接点这里 Github 代码 Github代码点这里 解读 论文解读点这里 算法流程 代码详解 train_transf ...

  9. c语言实现sha1算法注解,【密码学】SHA1算法实现及详解

    1 SHA1算法简介 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digit ...

最新文章

  1. Spring嵌套事务控制
  2. 虚拟机下CentOS7开启SSH连接
  3. SemVLP 单流和双流Transformer哪个好?阿里:我全都要!提出带可插拔模块的Transformer结构...
  4. Enterprise Library 4.1 Caching Block 图文笔记
  5. android 倒计时handle,android -handler 实现倒计时
  6. 30hibernate_fetch_1_select
  7. CADisplaylink初解
  8. Python让繁琐工作自动化——chapter7 模式匹配与正则表达式
  9. 2022研究生电子设计竞赛总结(东北赛区一等奖、国家二等奖)
  10. FusionChartsFree及其教程
  11. 怎么样向云服务器上传文件_怎样把文件上传到云服务器
  12. 比方便面还方便~利用Python开发一个桌面小程序
  13. php上传文件至腾讯COS
  14. 风琴html插件,jQuery垂直手风琴插件
  15. CMD命令 python模块安装
  16. 小程序实现长按图片弹出保存图片、发送给朋友、识别图中码菜单。
  17. 程序员该如何管理后宫:朕只爱一个皇后!(单例模式)
  18. Flowable(二):数据库详情
  19. 【ELK报错】Alias [.kibana] has more than one indices associated with it [[.kibana_1, .kibana_2]]
  20. 解决IIS管理器的网站可访问但ftp无法访问的问题

热门文章

  1. 数据库系统数据库管理系统_数据库管理系统介绍
  2. Java LocalDate类| minusYears()方法与示例
  3. 实训09.11:java重点内容介绍
  4. c语言double root,C语言修仙
  5. call和ret(f)指令
  6. git设置master权限_git怎么控制成员的权限?
  7. 用户关系表 存储_列式存储系列(一)CStore
  8. C/C++继承与派生
  9. Effective C++学习第三天
  10. HDU4812-D Tree-树分治