OpenCV-Python(34):FAST算法

目标

  • 理解 FAST 算法的基础
  • 使用OpenCV 中的FAST 算法相关函数进行角点检测

介绍

        FAST算法(Features from Accelerated Segment Test)是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法,具有高效、准确的特点,常用于计算机视觉领域中的特征点提取、图像匹配等任务。

背景 

        我们前面学习了几个特征检测器,它们大多数效果都很好。但是从实时处理的角度来看,这些算法都不够快。一个最好例子就是SLAM(同步定位与地图构建)、移动机器人,它们的计算资源非常有限。为了解决这个问题,Edward_Rosten 和Tom_Drummond 在2006 年提出了FAST 算法。我们下面将会对此算法进行一个简单的介绍。你可以参考原始文献获得更多细节,本节中的所有图像都是来源于原始文章。

算法步骤

        FAST算法的基本思想是通过对像素灰度值的快速比较来判断是否为角点。该算法的主要步骤如下:

  1. 选择一个像素点作为中心点。
  2. 选取中心点周围的16个像素点,分别计算它们与中心点的灰度差值。
  3. 判断中心点是否为角点。如果中心点与连续N个相邻像素点的灰度差值超过一个阈值T,或者与连续M个相邻像素点的灰度差值超过另一个阈值K,则认为中心点是角点。

FAST算法特征提取详细说明

1.在图像中选取一个像素点p,来判断它是不是关键点。Ip 等于像素点p的灰度值。

2.选择适当的阈值t。

3.如下图所示在像素点p 的周围选择16 个像素点进行测试。

4.如果在这16 个像素点中存在n 个连续像素点的灰度值高于于Ip + t,或者低于Ip −t,那么像素点p 就被认为是一个角点。如上图中的虚线所示,n 选取的值为12。

5. 为了获得更快的效果,还采用了额外的加速办法。首先对候选点的周围每个90 度的点:1,9,5,13 j进行测试,(先测1 和19, 如果它们符合阈值要求再测试 5 和13)。如果p 是角点,那么这四个点中至少有3 个要符合阈值要求。如果不是的话肯定不是角点,就放弃。对通过这步测试的点再继续􄦊进行测试,看是否有12 的点符合阈值要求。这个检测器的效率很高,但是它有如下几条缺点:

        • 当n<12 时它不会丢弃很多候选点(获得的候选点比较多)。
        • 像素的选取不是最优的,因为它的效果取决与要解决的问题点和角点的分布情况。
        • 告诉测试的结果被抛弃
        • 检测到的很多特征点都是连在一起的。

        通过不断研究改进,前3 个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决。

 机器学习的角点检测器

1. 选择一组训练练图片(最好是跟最后应用相关的图片)。
2. 使用FAST 算法找出每幅图像的特征点。
3. 对每一个特征点,将其周围的16 个像素存储构成一个向量。对所有图像都这样做构建一个特征向量 P。

 4. 每一个特征点的16 像素点都属于下列三类中的一种。

5. 根据这些像素点的分类,特征向量 P 也被分为3 个子集:Pd、Ps、Pb
6. 定义一个新的布尔变 Kp,如果p 是角点就设置为Ture,如果不是就设置为False。 

7. 使用ID3 算法(决策树分类器)Use the ID3 algorithm (decisiontree classifier) to query each subset using the variable Kp for theknowledge about the true class. It selects the x which yields the most information about whether the candidate pixel is a corner,measured by the entropy of Kp.
8. This is recursively applied to all the subsets until its entropy is zero.
9. 将构建好的决策树用于其他图像的快速的检测。

非极大值抑制

        使用极大值抑制的方法可以解决检测到的特征点相连的问题。

  1. 对所有检测到到特征点构建一个打分函数V。V 就是像素点p 与周围16个像素点差值的绝对值之和。
  2. 计算临近两个特征点的打分函数V。
  3. 忽略V 值最低的特征点

总结

  1. FAST算法的优点是速度快(比其它角点检测算法都快),适用于实时的图像处理任务。但它也有一些限制,例如对于图像噪声较多或纹理不明显的情况下,检测结果可能不准确(噪声很高时不稳定)。
  2. 在使用FAST算法时,需要根据具体应用场景调整阈值N、阈值T和阈值K的取值,才能获得较好的检测效果。
  3. 除了FAST算法,还有其他一些常用的角点检测算法,如Harris角点检测、Shi-Tomasi角点检测等,可以根据实际需求选择合适的算法或者根据具体任务结合不同算法使用。

OpenCV的FAST算法实现 

        和其它特征点检测一样我们可以在OpenCV 中直接使用FAST 特征检测器。如果你愿意的话,你可以设置阈值,是否进行最大值抑制,使用的邻域大小等。邻域可以设置为下列3 中之一:cv2.FAST_FEATURE_DETECTOR_TYPE_5_8, cv2.FAST_FEATURE_DETECTOR_TYPE_7_12和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16。下面是使用FAST 算法进行特征点检测的简单代码。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)# Initiate FAST object with default values
fast = cv2.FastFeatureDetector()# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv2.drawKeypoints(img, kp, color=(255,0,0))# Print all default params
print ("Threshold: ", fast.getInt('threshold'))
print ("nonmaxSuppression: ", fast.getBool('nonmaxSuppression'))
print ("neighborhood: ", fast.getInt('type'))
print ("Total Keypoints with nonmaxSuppression: ", len(kp))cv2.imwrite('fast_true.png',img2)
# Disable nonmaxSuppressionfast.setBool('nonmaxSuppression',0)
kp = fast.detect(img,None)
print ("Total Keypoints without nonmaxSuppression: ", len(kp))img3 = cv2.drawKeypoints(img, kp, color=(255,0,0))
cv2.imwrite('fast_false.png',img3)

        结果如下。第一幅图是使用了非最大值抑制的结果,第二幅没有使用非最大值抑制。 

提醒说明 

OpenCV的版本不同,常见特征器的方法可能会有不同,以下也可以参考。

在OpenCV-python中,可以使用cv2.FastFeatureDetector()函数来创建FAST角点检测器。该函数的用法如下:

fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True, type=cv2.FAST_FEATURE_DETECTOR_TYPE_9_16, max_npoints=5000)

其中,参数的含义如下:

  • threshold:阈值,用于判断像素点是否为角点。默认值为10。
  • nonmaxSuppression:是否进行非最大值抑制,即在相邻的角点中只选择响应最大的角点。默认值为True。
  • type:角点检测算法的类型。默认值为cv2.FAST_FEATURE_DETECTOR_TYPE_9_16,表示使用16个像素点进行快速比较。
  • max_npoints:最大检测到的角点数量。默认值为5000。

在创建FAST角点检测器后,可以使用fast.detect()函数来检测图像中的角点。

FAST角点检测器的type参数定义了角点检测算法的类型。在OpenCV-python中,提供了以下几种类型:

  • cv2.FAST_FEATURE_DETECTOR_TYPE_5_8:使用8个像素点进行快速比较。
  • cv2.FAST_FEATURE_DETECTOR_TYPE_7_12:使用12个像素点进行快速比较。
  • cv2.FAST_FEATURE_DETECTOR_TYPE_9_16:使用16个像素点进行快速比较。

使用示例:

import cv2# 读取图像
image = cv2.imread("image.jpg")# 创建FAST角点检测器
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True, type=cv2.FAST_FEATURE_DETECTOR_TYPE_9_16, max_npoints=5000)# 检测角点
keypoints = fast.detect(image, None)# 绘制角点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0), flags=0)# 显示结果
cv2.imshow("FAST", image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例中,创建FAST角点检测器时,通过参数设置了阈值为10,进行非最大值抑制,使用16个像素点进行快速比较,并设置最大检测到的角点数量为5000。

 

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

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

相关文章

基于信号完整性的PCB设计原则

最小化单根信号线质量的一些PCB设计建议 1. 使用受控阻抗线&#xff1b; 2. 理想情况下&#xff0c;所有信号都应该使用完整的电源或地平面作为其返回路径&#xff0c;关键信号则使用地平面作为返回路径&#xff1b; 3. 信号的返回参考面发生变化时&#xff0c;在尽可能接近…

压力测试+接口测试(工具jmeter)

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…

几内亚ECTN是什么?怎么办理?建议收藏!

几内亚ECTN是什么&#xff1f;怎么办理&#xff1f;建议收藏&#xff01; 一、去往几内亚的货物&#xff0c;从六月一日开始强制实施ECTN制度&#xff0c;取消原来并行的ENS制度。如若货物到港前没申请ECTN&#xff0c;几内亚海关将会强行扣货。 ECTN是英文&#xff1a;ELECTR…

Angular系列教程之自定义指令

文章目录 前言指令的基本概念在模板中使用指令总结 前言 在Angular中&#xff0c;指令是一种非常强大的工具&#xff0c;用于扩展HTML元素的功能和行为。它们允许我们创建可重用的组件&#xff0c;并在应用程序中的多个地方使用它们。本文将介绍Angular指令的基础知识&#xf…

散列函数,哈希表hash table

附上一句话&#xff1a;我知道大家可能曾经了解过这个散列表了&#xff0c;我发现&#xff0c;如果多看几个相关的视频&#xff0c;从不同的表述方式和不同的理解角度来理解这个问题&#xff0c;我会明白的更透彻&#xff0c;也有更多新的收获&#xff0c;尤其是对这个算法的应…

ElasticSearch降本增效常见的方法 | 京东云技术团队

Elasticsearch在db_ranking 的排名不断上升&#xff0c;其在存储领域已经蔚然成风且占有非常重要的地位。 随着Elasticsearch越来越受欢迎&#xff0c;企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢&#xff1f;今天我们就特地来聊聊ES降本增效的常见方法&#x…

Android 仿快手视频列表,RecyclerView与Banner联动效果

这是看到群里讨论过快手APP的一个观看他人视频列表的一个联动效果&#xff0c;但是并不是完全按照这个软件的效果来做的&#xff0c;只是参考&#xff0c;并不是完全仿照这个软件来做的&#xff0c;没时间去优化排版问题了&#xff0c;请见谅&#xff0c;如图&#xff1a; 实现…

ADA-YOLO:YOLOv8+注意力+Adaptive Head,mAP提升3%

生物医学图像分析中的目标检测和定位至关重要&#xff0c;尤其是在血液学领域&#xff0c;检测和识别血细胞对于诊断和治疗决策至关重要。虽然基于注意力的方法在各个领域中目标检测方面取得了显著的进展&#xff0c;但由于医学影像数据集的独特挑战&#xff0c;其在医学目标检…

cad的模型怎么打散导入3d---模大狮模型网

将CAD中的模型打散并导入3D建模软件&#xff0c;需要以下步骤&#xff1a; 将CAD中的模型进行分组或分层&#xff1a;在CAD中&#xff0c;将模型按照不同的组或层进行分组或分层。这样可以方便地控制每个部分的显示和隐藏&#xff0c;在导入3D建模软件后&#xff0c;也可以更方…

(超详细)2-YOLOV5改进-添加SimAM注意力机制

1、在yolov5/models下面新建一个SimAM.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch import torch.nn as nnclass SimAM(torch.nn.Module):def __init__(self, e_lambda1e-4):super(SimAM, self).__init__()self.activaton nn.Sigmoid()self…

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量&#xff08;单例中会使用&#xff09;3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

使用@Slf4j后引入log,idea标红

引入Slf4j注解 idea标红Cannot resolve symbol ‘log’ 引入Lombok插件 如果在Marketplace查不到时&#xff0c;不妨关闭菜单再打开试下

概率论与数理统计————古典概型、几何概型和条件概率

一、古典概型 特点 &#xff08;1&#xff09;有限性&#xff1a;试验S的样本空间的有限集合 &#xff08;2&#xff09; 等可能性&#xff1a;每个样本点发生的概率是相等的 公式&#xff1a;P&#xff08;A&#xff09; A为随机事件的样本点数&#xff1b;S是样本…

5.3 Verilog 带参数例化

5.3 Verilog 带参数例化 分类 Verilog 教程 关键词&#xff1a; defparam&#xff0c;参数&#xff0c;例化&#xff0c;ram 当一个模块被另一个模块引用例化时&#xff0c;高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块…

STC8H8K蓝牙智能巡线小车——1. 环境搭建(基于RTX51操作系统)

1. 基本介绍 开发环境准备&#xff1a;Keil uVision5 烧录软件&#xff1a;STC-ISP&#xff08;V6.92A&#xff09; 芯片&#xff1a; STC8H8K64U-45I-LQFP64 芯片引脚&#xff1a; 2.创建项目 打开Keil&#xff0c;点击【Project】&#xff0c;选择【new uVersion proje…

网页设计(八)HTML5基础与CSS3应用

一、当当网企业用户注册页面设计 当当网企业用户注册页面 改版后当当网企业用户注册页面 <!-- prj_8_1.html --> <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>当当网企业用户注册页面设计</title><s…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包&#xff0c;旨在彻底改变构建和共享语言模型&#xff08;LM&#xff09;应用程序的方式。Chainlit可以创建用户界面&#xff08;UI&#xff09;&#xff0c;类似于由OpenAI开发的ChatGPT用户界面&#xff0c;Chainlit可以开发类似…

Kafka消费流程

Kafka消费流程 消息是如何被消费者消费掉的。其中最核心的有以下内容。 1、多线程安全问题 2、群组协调 3、分区再均衡 1.多线程安全问题 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 对于线程安全&…

CSS3渐变属性详解

渐变属性 线性渐变 概念&#xff1a;线性渐变&#xff0c;指的是在一条直线上进行的渐变。在线性渐变过程中&#xff0c;起始颜色会沿着一条直线按顺序过渡到结束颜色 语法&#xff1a; background:linear-gradient(渐变角度&#xff0c;开始颜色&#xff0c;结束颜色);渐变…

Vue 如何把computed里的逻辑提取出来

借用一下百度的ai 项目使用&#xff1a; vue 文件引入 <sidebar-itemv-for"route in routes":key"route.menuCode":item"route":base-path"route.path"click"onColor"/>import { handleroutes } from "./handle…