特征点检测 FAST算法及代码详解

本文着重介绍了用于图像特征点检测的算法,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 + tsS,Ix>Ip+t
  • 条件2 : 一系列NNN个连续的像素点SSS, ∀s∈S,Ix<Ip−t{\forall} s\in S, I_x < Ip - tsS,Ix<Ipt

满足两个条件其中的任意一个,则可以认为像素点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向量赋值 01 的逻辑值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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Email发送,通知业务完成

Email 发送 #!/usr/bin/python # -*- coding: UTF-8 -*- import base64 import smtplib from email.mime.text import MIMEText from email.header import Header from email.utils import formataddrdef crypt(source, key):from itertools import cycleresulttempcycle(key)f…

基于SpringCloud的分布式事务框架(LCN)

框架特点 支持各种基于spring的db框架 兼容springcloud、dubbo 使用简单&#xff0c;代码完全开源 基于切面的强一致性事务框架 高可用&#xff0c;模块可以依赖dubbo或springcloud的集群方式做集群化&#xff0c;TxManager也可以做集群化 使用示例 分布式事务发起方&#xf…

一文看懂计算机神经网络与梯度下降

1. 计算机神经网络与神经元 要理解神经网络中的梯度下降算法&#xff0c;首先我们必须清楚神经元的定义。如下图所示&#xff0c;每一个神经元可以由关系式yf(∑i1nwixib)y f(\sum_{i1}^nw_ix_i b)yf(∑i1n​wi​xi​b)来描述&#xff0c;其中X[x1,x2,...,xn]X [x_1,x_2,..…

vs2015web项目无法加载64位c++的dll,提示试图加载不正确的格式

vs2015无法加载64位c的dll&#xff0c;提示试图加载不正确的格式&#xff01; 开始用winform引用64位的c的dll&#xff0c;在项目的属性设置生成里面选择any cpu或者x64都可以成功! 但在web项目和接口里面运行就提示试图加载不正确的格式&#xff0c;想办法找了一天也没处理掉&…

使用Rancher搭建K8S测试环境

环境准备&#xff08;4台主机&#xff0c;Ubuntu16.04Docker1.12.6 SSH&#xff09;&#xff1a; rancher1 192.168.3.160 只做管理节点 node1 192.168.3.161 K8S的节点1 node2 192.168.3.162 K8S的节点2 node3 192.168.3.163 K8S的节点3 此时如…

Anaconda安装tensorflow报错问题解决方法

最近脱离了googlecolab想使用本地的anaconda进行机器学习课题的演练&#xff0c;在安装tensorflow时报错 : UnsatisfiableError: The following specifications were found。下面给出解决方法。 发现实际原因是由于anaconda的python环境&#xff0c;当前版本的tensorflow只能适…

5.07—018—周二

今日所学内容 一、模块 二、递归删除的思路 三、案例&#xff1a;跨文件夹移动文件 四、案例 递归遍历打印目标路径中所有的txt文件 五、项目开放周期 一、模块 1、与时间相关的模块 1&#xff09;time &#xff1a;时间 时间戳(timestamp)&#xff1a;time.time()  延迟线程…

机器学习模型中step与epoch,batch_size之间的关系

本文主要谈谈自己对step&#xff0c;epoch&#xff0c;batch_size这几个常见参数的理解。 最近在调试模型的时候&#xff0c;发现在使用keras.optimizer.adam时&#xff0c;模型在添加了新的一层2D卷积层后难以收敛&#xff0c;在不调整初始权重矩阵的情况下&#xff0c;想通过…

yml的mybatis的sql查看

yml的mybatis的sql查看 控制台输出结果:

Debian 安装 yum

sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install yum转载于:https://www.cnblogs.com/baiqian/p/10840169.html

unity如何让canvas总是显示在所有层的最上方?

由于unity中的图层都是从上至下渲染的&#xff0c;那么在渲染的过程中&#xff0c;只需要将canvas所在的UI层的渲染优先级order排在其他层之后&#xff0c;就可以保证UI画面总是最后加载出来的了。 在canvas的inspector中修改order in layer 或者 sorting layer都可以实现这一…

FZU - 2037 -Maximum Value Problem(规律题)

Let’s start with a very classical problem. Given an array a[1…n] of positive numbers, if the value of each element in the array is distinct, how to find the maximum element in this array? You may write down the following pseudo code to solve this proble…

解决Feign接口调用有时候不好用的分析思路

很多架构师为了鉴权&#xff0c;会把controller带过来的header信息一股脑的利用feign的拦截器带入RequestTemplate&#xff0c;然后方便feign接口鉴权。这时候可能会带入其他的header信息&#xff0c;比如content-type&#xff0c;而有的feign接口是对特定对header信息有要求的…

关于同时可用git命令clone和TortoiseGit拉取代码不需要密码

工作需要在windows7下使用git分布式版本控制系统&#xff0c;需要同时可以在git命令行模式或TortoiseGit拉取代码而不需要每次输入密码。 这时候需要同时安装git和TortoiseGit。 git使用命令ssh-keygen -C “邮箱地址” -t rsa产生的密钥在TortoiseGit中不能用。TortoiseGit 使…

交叉验证 cross validation 与 K-fold Cross Validation K折叠验证

交叉验证&#xff0c;cross validation是机器学习中非常常见的验证模型鲁棒性的方法。其最主要原理是将数据集的一部分分离出来作为验证集&#xff0c;剩余的用于模型的训练&#xff0c;称为训练集。模型通过训练集来最优化其内部参数权重&#xff0c;再在验证集上检验其表现。…

这个太有意思了,程序员可以消遣娱乐

/***        ┏┓ ┏┓ *       ┏┛┻━━━━━━━┛┻┓ *       ┃       ┃*       ┃   ━   ┃ *       █████━█████ ┃*       ┃       ┃ *       ┃   ┻   ┃* …

第十一周总结

这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3203 我在这个课程的目标是 理解与使用递归函数。 参考文献 基础题 2-1 宏定义“#define DIV(a, b) a/b”&#xff0c;经DIV(x …

softmax函数与交叉熵损失函数

本文主要介绍了当前机器学习模型中广泛应用的交叉熵损失函数与softmax激励函数。 这个损失函数主要应用于多分类问题&#xff0c;用于衡量预测值与实际值之间的相似程度。 交叉熵损失函数定义如下: LCE(y^,y∗)−∑i1Nclassesyi∗log(yi^)L_{CE}(\hat{y}, y^*) - \sum_{i1}^…

vue配置git的子模块

在vue的模块需要调用许多公共组件&#xff0c;在公共组件之后会需要不断的更新以及分组做&#xff0c;这时候可以利用git的方式更新组件所在位置 [submodule "src/component/common"] path src/component/common urlgit111.111.111.111:projectname/web-common-…

unity如何让物体与特定物体之间不发生碰撞

unity中我们普遍使用的是碰撞器来实现各个物体的碰撞体积&#xff0c;例如Box collider, Sphere Collider。 在实现游戏的过程中&#xff0c;如果不想要物体与特定物体产生碰撞&#xff0c;或反之&#xff0c;只想让碰撞发生在特定物体之间时&#xff0c;我们就需要配置layer …