特征点检测 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,一经查实,立即删除!

相关文章

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

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只能适…

yml的mybatis的sql查看

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

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

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

关于同时可用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}^…

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

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

jenkins的JAVA简单顺序配置git仓库

后台Java的发布配置 1、从源码管理下载项目内容 2、构建触发器 3 、构建下环境 4、构建后处理

SQLyog连接数据库报错plugin caching_sha2_password could not be loaded

打开cmd&#xff1a;mysql -uroot -p 进入mysql依次执行下面语句 ALTER USER rootlocalhost IDENTIFIED BY password PASSWORD EXPIRE NEVER; #修改加密规则 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; #更新一下用户的密码 FLUSH PRIVI…

unity导入素材时材质丢失素材变成粉红色的解决方法

有很多时候&#xff0c;当我们通过unity asset store或者blender等等外源导入素材时&#xff0c;会出现材质缺失的bug&#xff0c;如下图所示 : 一个很可能的原因&#xff0c;是由于unity本身管线在每个版本的更新过程中&#xff0c;材质的渲染编码发生了改变。由于这种原因引…

Jenkins 部署vue到服务器

链接github名称 2、从源码管理下载 3、更新最新前端模块 4、进行构建和打包

numpy数组提取一定规律的数据

numpy数组的索引也是符合start stop step规律的&#xff0c;因此可以通过索引提取出一系列索引有规律的元素&#xff0c;如下例子: import numpy as np i np.linspace(1,100,100, dtypeint)-1 print(i) i_train i[0:100:10] print(i_train)输出结果如下 : 可以看到通过索引…

CRM、用户管理权限

CRM目录结构 from django.shortcuts import HttpResponse,render,redirect from django.conf.urls import url from django.utils.safestring import mark_safe from django.urls import reverse from django.forms import ModelForm from stark.utils.my_page import Paginat…

GAN生成对抗网络基本概念及基于mnist数据集的代码实现

本文主要总结了GAN(Generative Adversarial Networks) 生成对抗网络的基本原理并通过mnist数据集展示GAN网络的应用。 GAN网络是由两个目标相对立的网络构成的&#xff0c;在所有GAN框架中都至少包含了两个部分&#xff0c;生成模型部分和判别模型部分。生成模型的目标是制造出…

autoencoder自编码器原理以及在mnist数据集上的实现

Autoencoder是常见的一种非监督学习的神经网络。它实际由一组相对应的神经网络组成&#xff08;可以是普通的全连接层&#xff0c;或者是卷积层&#xff0c;亦或者是LSTMRNN等等&#xff0c;取决于项目目的&#xff09;&#xff0c;其目的是将输入数据降维成一个低维度的潜在编…

vscode编写插件详细过程

vscode编写插件详细过程 前言 之前编写了一个vscode插件用vscode写博客和发布&#xff0c;然后有园友要求写一篇来介绍如何开发一个vscode扩展插件&#xff0c;或者说介绍开发这个插件的过程。然而文章还没有写&#xff0c;园子里面已经有人发布一个文章&#xff0c;是园友上…