【交通标志识别】基于SIFT特征实现交通标志识别matlab源码含GUI-程序员宅基地

技术标签: 算法  python  机器学习  计算机视觉  深度学习  

一、简介

SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。\ 1 SIFT算法特点:\ (1)具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。\ (2)区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配\ (3)多量性,就算只有单个物体,也能产生大量特征向量\ (4)高速性,能够快速的进行特征向量匹配\ (5)可扩展性,能够与其它形式的特征向量进行联合

2 SIFT算法实质\ 在不同的尺度空间上查找关键点,并计算出关键点的方向。\ 在这里插入图片描述\ 3 SIFT算法实现特征匹配主要有以下三个流程:\ (1)提取关键点:关键点是一些十分突出的不会因光照、尺度、旋转等因素而消失的点,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。此步骤是搜索所有尺度空间上的图像位置。通过高斯微分函数来识别潜在的具有尺度和旋转不变的兴趣点。\ (2)定位关键点并确定特征方向:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。然后基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。\ (3)通过各关键点的特征向量,进行两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。

4 尺度空间\ (1)概念\ 尺度空间即试图在图像领域中模拟人眼观察物体的概念与方法。例如:观察一颗树,关键在于我们想要观察是树叶子还是整棵树:如果是一整棵树(相当于大尺度情况下观察),那么就应该去除图像的细节部分。如果是树叶(小尺度情况下观察),那么就该观察局部细节特征。\ SIFT算法在构建尺度空间时候采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。\ 利用高斯核函数进行滤波的主要原因有两个:\ a 高斯核函数是唯一的尺度不变核函数。\ b DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。同时,David. Lowe作者在论文中提出将原始图像进行2倍上采样后滤波能够保留更多的信息便于后续特征提取与匹配。其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。\ (2)表示\ L(x, y, σ) ,定义为原始图像 I(x, y)与一个可变尺度的2维高斯函数G(x, y, σ) 卷积运算。\ 在这里插入图片描述\ 5 高斯金字塔的构建\ (1)概念\ 尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两步:\ a 对图像做高斯平滑;\ b 对图像做降采样。\ 在这里插入图片描述\ 图像的金字塔模型是指将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如上图所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,Octave表示一幅图像可产生的图像组数,Interval表示一组图像包括的图像层数。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。\ (2)表示\ 高斯图像金字塔共o组、s层,则有\ 在这里插入图片描述\ 6 DOG空间极值检测\ (1)DOG函数\ 在这里插入图片描述\ (2)DoG高斯差分金字塔\ a 对应DOG算子,需构建DOG金字塔。\ 可以通过高斯差分图像看出图像上的像素值变化情况。(如果没有变化,也就没有特征。特征必须是变化尽可能多的点。)DOG图像描绘的是目标的轮廓。\ 在这里插入图片描述\ b DOG局部极值检测\ 特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如下图,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。\ 在这里插入图片描述\ b 去除边缘效应\ 在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与2×2Hessian矩阵H的特征值成正比。\ 在这里插入图片描述\ 在这里插入图片描述\ 7 关键点方向分配\ (1)通过尺度不变性求极值点,需要利用图像的局部特征为给每一个关键点分配一个基准方向,使描述子对图像旋转具有不变性。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:\ 在这里插入图片描述\ (2)本算法采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点确定关键点方向。在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向。梯度直方图将0\~360度的方向范围分为36个柱,其中每柱10度。如下图所示,直方图的峰值方向代表了关键点的主方向,方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。\ 在这里插入图片描述\ 8 关键点描述\ 对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。\ 在这里插入图片描述\ Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。

9 关键点匹配\ (1)分别对模板图(参考图,reference image)和实时图(观测图,\ observation image)建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。\ (3)匹配可采取穷举法完成,但所花费的时间太多。所以一般采用kd树的数据结构来完成搜索。搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点。\ Kd树如下如所示,是个平衡二叉树\ 在这里插入图片描述\ 10 总结\ SIFT特征具有稳定性和不变性,在图像处理和计算机视觉领域有着很重要的作用,其本身也是非常复杂的,由于接触SIFT不是很久,对其中的相关知识了解还很不足,经多方查阅参考,写得此文,内容还不够详尽,望多多见谅。以下是SIFT算法的粗略总结。\ (1)DoG尺度空间的极值检测。\ (2)删除不稳定的极值点。\ (3)确定特征点的主方向\ (4)生成特征点的描述子进行关键点匹配。

二、源代码

``` function varargout = interface(varargin) % INTERFACE M-file for interface.fig % INTERFACE, by itself, creates a new INTERFACE or raises the existing % singleton. % % H = INTERFACE returns the handle to a new INTERFACE or the handle to % the existing singleton. % % INTERFACE('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in INTERFACE.M with the given input arguments. % % INTERFACE('Property','Value',...) creates a new INTERFACE or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before interfaceOpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to interfaceOpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help interface

% Last Modified by GUIDE v2.5 01-Jun-2007 09:23:14

% Begin initialization code - DO NOT EDIT guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @interfaceOpeningFcn, ... 'guiOutputFcn', @interfaceOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin & isstr(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end

if nargout [varargout{1:nargout}] = guimainfcn(guiState, varargin{:}); else guimainfcn(guiState, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before interface is made visible. function interface_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to interface (see VARARGIN)

% Choose default command line output for interface handles.output = hObject;

% Update handles structure guidata(hObject, handles);

% UIWAIT makes interface wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = interface_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename,path]=uigetfile('.jpg;.bmp','*.bmp','打开文件');

allfilename=strcat(path,filename); ima=imread(allfilename);

axes(handles.axes1); imshow(ima);title('输入的图像') [imshowage,flag]=Require(ima); I=imread('r1.bmp'); figure imshow(I); I=imread('r1.bmp'); imshow(I); X=cent(Max(i),1);Y=cent(Max(i),2);%白色为1; MX(i)=round(X);MY(i)=round(Y); bx=boud(Max(i),1);by=boud(Max(i),2);blen=boud(Max(i),4);bwid=boud(Max(i),3); bx1=round(bx);by1=round(by);Mblen(i)=round(blen);Mbwid(i)=round(bwid); if (blen>=bwid) MR=bwid; else MR=blen; end

if (MX(i)+round(MR/4)<=lie&&MY(i)+round(MR/6)<=hang&&TC(MY(i)+round(MR/6),MX(i)+round(MR/4))==1)
    t2=1;  
end

if (MX(i)-round(MR/4)>0&&MY(i)-round(MR/6)>0&&TC(MY(i)-round(MR/6),MX(i)-round(MR/4))==1)   
    t4=1;
end

if (MY(i)+round(MR/6)<=hang&&MX(i)-round(MR/4)>0&&TC(MY(i)+round(MR/6),MX(i)-round(MR/4))==1) t7=1; end if (MY(i)-round(MR/6)>0&&MX(i)+round(MR/4)<=lie&&TC(MY(i)-round(MR/6),MX(i)+round(MR/4))==1) t8=1; end figure imshow(J); imwrite(J,'r11.bmp','bmp'); ```

三、运行结果

在这里插入图片描述\ 在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_60703264/article/details/120136049

智能推荐

DBus学习笔记_dbus学习课件-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏30次。http://dotnet.cnblogs.com/page/76759/?page=1 作者:Jerry_Chen 来源:www.meegoq.com 时间:2010-10-12 阅读:513 次 原文链接 [收藏] 整页浏览 摘要:DBus作为一个轻量级的IPC被越来越多的平台接受,在MeeGo中DBus也是主要的进程间通信_dbus学习课件

TfLite: TfLite for mcu代码框架_tf-lite框架引用-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏9次。首先要能编译、能打印log编译的方法有两种,1) bazel 2) make可以在本地编译调试使用bazel testbazel test //tensorflow/lite/experimental/micro/examples/gesture_recognition:gesture_recognition_test到路径下bazel-bin/tensorflow/lite/ex..._tf-lite框架引用

重拾python_科班生重拾python-程序员宅基地

文章浏览阅读248次,点赞2次,收藏2次。Python特性跨平台的程序设计语言解释性语言,不编译交互式语言,可直接执行代码面向对象语言面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。面向过程:优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,_科班生重拾python

TikTok海外直播网络专线费用解析:跨境电商的网络新选择_tiktok跨境网络-程序员宅基地

文章浏览阅读225次,点赞5次,收藏3次。TikTok海外直播网络专线即SD-WAN国际专线(就是土豆和马铃薯的区别),以其独特的优势,正逐渐成为跨境电商企业的首选网络解决方案。在未来,随着技术的不断进步和市场的不断发展,SD-WAN国际专线有望为更多企业带来更高效、更便捷的网络体验。SD-WAN,即软件定义广域网,是一种创新的网络技术,它通过软件定义的方式,简化了网络部署,提高了网络的性能和可用性。对于跨境电商企业来说,SD-WAN国际专线不仅意味着更快速、更稳定的数据传输,还意味着更低的网络成本和更高的灵活性。_tiktok跨境网络

完整的从github上拉Laravel项目流程_怎么复制git下的laravel-程序员宅基地

文章浏览阅读3.4k次。先来看一看了: https://mobile.yangkeduo.com/mall_page.html?mall_id=129221094.Github鼎鼎大名相信大家都知道。那么今天我们一起来学习一下如何使用Git Clone命令来将已有的Laravel项目迁移(复制)到新的开发环境。首先在原始项目文件夹(假设我们的分支是master),我们把所有的更改commit后push到远端(..._怎么复制git下的laravel

【笔试】python刷题笔记(基础)!_python while true try-程序员宅基地

文章浏览阅读10w+次,点赞14次,收藏97次。1.while True: try: do something except: breakwhile True 必须和break结合,无异常时执行try,异常时执行except,break退出循环。2.raw_input()与input()python2存在raw_input()和input()两个函数raw_input()..._python while true try

随便推点

Tor源码 -- channel receive RELAY* cell_tor resolve cell-程序员宅基地

文章浏览阅读184次。这里阐述channel收到RELAY* cell后的处理过程。主机身份是user或者是OR(有时候写relay也是指OR)command_process_relay_cell():channel收到RELAY cell,调取command_process_relay_cell()函数处理。step 1: 调用circuitlist.c的circuit_get_by_circid_channel()函数,获取RELAY cell的circuit,并确认cell direction(IN or OUT)。_tor resolve cell

optee的generic_boot_init_primary 分析_generic_boot_get_handlers-程序员宅基地

文章浏览阅读1.3k次。generic_boot_init_primary是optee os初始化的主要函数#if defined(CFG_WITH_ARM_TRUSTED_FW)struct thread_vector_table *generic_boot_init_primary(unsigned long pageable_part, unsigned long u __unused, _generic_boot_get_handlers

一步一步学linux操作系统: 11 进程数据结构_task_struct字段_内核栈_task_struct 内核栈-程序员宅基地

文章浏览阅读1k次。进程数据结构,task_struct字段,内核栈_task_struct 内核栈

mysql btree脚本_MySQL索引简述--BTree索引-程序员宅基地

文章浏览阅读124次。MySQL数据库有如下几种常见的索引类型:BTree索引哈希索引全文索引索引的本质MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(..._mysql使用b-tree作为索引方式,这种树的查找算法复杂度为对数级别

常见Web十大漏洞,常见Web漏洞_十大常见web漏洞-程序员宅基地

文章浏览阅读4.5k次,点赞10次,收藏42次。参考:https://blog.csdn.net/weixin_43376075/article/details/105189017https://blog.csdn.net/qq_43168364/article/details/105595532https://www.cnblogs.com/-qing-/p/10819069.html代码执行函数:1- eval()#传入的参数必须为PHP代码,既需要以分号结尾。比如从指定URL地址获取网页文本内容,加载指 定地址的图片,下载等等。_十大常见web漏洞

mat opencv 矩形roi_如何用opencv实现感兴趣区域ROI的选取-程序员宅基地

文章浏览阅读527次。OpenCV中感兴趣区域的选取与检测感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置;2)ROI在图像中的位置未知。1)第一种情形 很简单,根据ROI的坐标直接从原图抠出,不过前提是要知道其坐标,直接上例子吧。int getROI(Mat image, Rect rect){Mat img=image.clone();Mat roi;..._mat roi = img(rect);

推荐文章

热门文章

相关标签