【图像处理】交通标志检测(Matlab代码实现)

这篇具有很好参考价值的文章主要介绍了【图像处理】交通标志检测(Matlab代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现

💥1 概述

人工智能技术的快速发展使得无人驾驶技术在现实中得以实现,而对车身外界实时情况的感知则是无人驾驶核心环节之一。无人驾驶车辆获取外界信息的手段之一就是利用视觉传感器感知实时交通情况,如交通信号、交通标识、行人和车辆等。对交通标志的识别作为无人驾驶中一项重要任务,在实际检测过程中却极其复杂,如遇到交通标志被遮挡,雨天视线模糊等情况,所以对交通标志的识别在速度和精度上都是一项挑战。对交通标志的识别可以利用基于深度学习的卷积神经网络来实现,它通过在大量的图片数据中训练并学习到指定目标的特,实现对交通标志的检测和定位。同时考虑到模型要在无人驾驶移动端的使用,限速标志的基本特征(外边框为红色且为圆形)。本文利用颜色空间的方法,先提取出红色区域,在通过图像的开闭运算,膨胀腐蚀操作进行预处理,最后在利用不同区域是目标的可能性进行逐一筛选。这里要指出目标的可能性这一说法,是指该区域类圆的概率以及该区域的面积的加权和。最后,针对一些红的目标可能重叠的情况,进行最后的加工。 紧接着提取标志中的数字,通过对给定的图像进行统计,可以发现如果是限速标志,其直方图通常是双峰,一个峰为目标区域,另一个则为背景。这样就可以分别处理数字了。

📚2 运行结果

交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 交通信号标志识别matlab,图像处理,matlab,图像处理,计算机视觉

 部分代码:

clear all;
close all;

for name = 1 : 20% for name = 2 : 2
% name = 10;//16
% for name = 16 : 16
figure(name)

filename = ['test' num2str(name)  '.jpg'];
% filename = [num2str(name)  '.bmp'];
img_rgb = imread(filename);
% rgb 转 hsv 空间
img_hsv = rgb2hsv(img_rgb);

%****************** 提取红色 ******************%
[height,width,c]= size(img_hsv);
for i=1:height
    for j=1:width
        h=img_hsv(i,j,1);
        s=img_hsv(i,j,2);
        v=img_hsv(i,j,3);
        %通过将h通道颜色值特定范围内饱和度设为0,保留范围外颜色值
        if ( h > 156/180 || h < 10/180 ) && s > 43/255  && v > 46/255
%         if ( h > 156/180 || h < 10/180 ) && s > 60/255  && v > 60/255
            img_hsv(i,j,1) = 0;
            img_hsv(i,j,2) = 0;
            img_hsv(i,j,3) = 1;
        else 
            img_hsv(i,j,1) = 0;
            img_hsv(i,j,2) = 0;
            img_hsv(i,j,3) = 0;
        end
    end
end
img_red = hsv2rgb(img_hsv);

%****************** 二值化 ******************%
level=graythresh(img_red);
% img_bw = img_red;
img_bw = im2bw(img_red,level);

% % subplot(221),imshow(img_rgb);
% % subplot(222),imshow(img_red)
% % subplot(223),imshow(img_bw);

%****************** 膨胀后填充 ******************%
se_dilate_fill = strel('disk',3);
img_dilate = imdilate(img_bw,se_dilate_fill);
img_dilate_closed = bwfill(img_dilate,'holes');

%****************** 腐蚀重建后在填充 ******************%
se_erode_restruct = strel('disk',5);
img_bw_eroded = imerode(img_dilate_closed,se_erode_restruct);
img_eroded_restruct = imreconstruct(img_bw_eroded,img_dilate_closed);
img_eroded_restruct_fill = bwfill(img_eroded_restruct,'holes');

%****************** 开运算 ******************%
se_open = strel('disk',10);
img_eroded_restruct_fill_open = imopen(img_eroded_restruct_fill,se_open);

% % subplot(221),imshow(img_rgb);
% % subplot(222),imshow(img_red)
% % subplot(223),imshow(img_eroded_restruct_fill_open);

% %****************** 根据面积信息再腐蚀 ******************%
region = regionprops(bwlabel(img_eroded_restruct_fill_open),'Area','Perimeter','Centroid','Boundingbox');

%%% 自适应构造结构元素

%%% 取前三个最像圆的区域求平均面积
CIRCLESIMLIAR = 0.6;
WEIGHTMINCOMPUTERATE = 0.2;
RADIUSRATE = 2/3;

Circle_simliarity_result = zeros(1,size(region,1));
maxarea = 0;

for i = 1 : size(region,1)
    
    circle_simliarity = 4*pi*region(i).Area/(region(i).Perimeter^2);    
    Circle_simliarity_result(1,i) = circle_simliarity;
    
    if region(i).Area > maxarea
        maxarea = region(i).Area;
    end
    
end

[Circle_simliarity,Circle_simliarity_index] = sort(-Circle_simliarity_result);


area = 0;i  = 0;
for i = 1 : size(region,1)
%     if i > maxcount || -Circle_simliarity(i) < CIRCLESIMLIAR
%     if -Circle_simliarity(i) < CIRCLESIMLIAR || region( Circle_simliarity_index(i)  ).Area/maxarea < WEIGHTMINCOMPUTERATE
    if -Circle_simliarity(i) < CIRCLESIMLIAR && region( Circle_simliarity_index(i)  ).Area/maxarea > WEIGHTMINCOMPUTERATE
        break;
    end
    area = area + region( Circle_simliarity_index(i)  ).Area;
end

radius = floor(sqrt( area/i/pi  ) * RADIUSRATE );   
se_better_erode = strel('disk',radius);
img_better_eroded = imerode(img_eroded_restruct_fill_open,se_better_erode);
img_better_eroded_restruct = imreconstruct(img_better_eroded,img_eroded_restruct_fill_open);


% subplot(221),imshow(img_rgb);
% subplot(222),imshow(img_eroded_restruct_fill_open)
% subplot(223),imshow(img_better_eroded_restruct);

% % %****************** 提取目标区域 ******************%
CIRCLEWEIGHT = 0.7;
CIRCLESIMILARITYTHRESHOLD = 0.9;
AREAWEIGHTTHRESHOLD = 0.2;
WEIGHTTHRESHOLD = 0.7;

[region,result] = detectTarget(img_better_eroded_restruct,CIRCLEWEIGHT,CIRCLESIMILARITYTHRESHOLD,AREAWEIGHTTHRESHOLD);
[target_num,Target_index] = drawTarget(img_rgb,region,result,WEIGHTTHRESHOLD);

% subplot(221),imshow(img_rgb);
% subplot(222),imshow(img_eroded_restruct_fill_open)
% subplot(223),imshow(img_better_eroded_restruct);

% % % 标定数字
for i = 1 : target_num
    tmpimg = img_rgb;

    rectanglesize = region(Target_index(i)).BoundingBox;
        
    [height,width,c]= size(img_hsv);
    for m = 1 : height
        for n = 1 : width
            if ( ~( n > rectanglesize(1) && n < rectanglesize(1)+rectanglesize(3) && m > rectanglesize(2) && m < rectanglesize(2) + rectanglesize(4)) ...
                || img_better_eroded_restruct(m,n) == 0  || img_bw(m,n) ) 
               tmpimg(m,n,:) = [255 255 255];               
            end
        end
    end
    tmpimg = tmpimg(rectanglesize(2) : rectanglesize(2) + rectanglesize(4) ,rectanglesize(1):rectanglesize(1)+rectanglesize(3) );  

    len = rectanglesize(3)+rectanglesize(4);
    
    %%% 双峰阈值分割
    h = imhist(tmpimg);
    % 求极大值 粗略的算了一下 
    [cnt,x] = findpeaks(h,'minpeakdistance',40,'minpeakheight',20);
    
    if cnt > 2
        n = length(x);
        yu = x(1)+x(n)-2;
        img_num_bw = ~im2bw(tmpimg,yu/510);
    else
%         level = graythresh(tmpimg);
%         img_num_bw = ~im2bw(tmpimg,level);
        
%         subplot(221),imhist(tmpimg);
%         subplot(222),imshow(img_num_bw)
%         subplot(223),imshow(sep_2)
        continue
    end
        
    
    se_sep = strel('rectangle',[1,min(15,floor(len/20))] );
    sep_1 = imerode(img_num_bw,se_sep);
    sep_2 = imreconstruct(sep_1,img_num_bw);
    
    sep_region = regionprops(bwlabel(sep_2),'Area','Perimeter','Centroid','Boundingbox');
    
    for k = 1 : size(sep_region)
        subplot(224)
        rectangle('Position',sep_region(k).BoundingBox + [rectanglesize(1) rectanglesize(2) 0 0],'Curvature',[0,0],'LineWidth',2 ,'LineStyle','-','EdgeColor','r');
        hold on
        subplot(221),imhist(tmpimg);
        subplot(222),imshow(img_num_bw)
        subplot(223),imshow(sep_2)
    
    end
% %     sep_2 = bwfill(sep_2,'holes');


end

if target_num > 0 || maxarea == 0
    continue;
end

% 没发现目标,但存在可能目标块,认为目标可能位于最大块中

% %****************** 提取最大色块 ******************%

[Area,Area_index]=sort(-[region.Area]);
maxarea = 0;
if size(region,1) > 1
    maxarea = -Area(1);
end

rectanglesize = region(Area_index(1)).BoundingBox;
[height,width,c]= size(img_hsv);
for i=1:height
    for j=1:width
        if ~( j > rectanglesize(1) && j < rectanglesize(1)+rectanglesize(3) && i > rectanglesize(2) && i < rectanglesize(2) + rectanglesize(4))
            img_bw(i,j) = 0;
        end
    end
end


img_bigest_eroded = imerode(img_bw,se_better_erode);
img_bigest_eroded_restruct = imreconstruct(img_bigest_eroded,img_bw);

img_dilate = imdilate(img_bw,se_better_erode);
img_bigest_eroded_restruct_fill = bwfill(img_bigest_eroded_restruct,'holes');

% subplot(224),imshow(img_red);
% subplot(224),imshow(img_bigest_eroded_restruct_fill);
% subplot(221),imshow(img_bw);


% %****************** 提取目标区域 ******************%
CIRCLEWEIGHT = 0.7;
CIRCLESIMILARITYTHRESHOLD = 0.1;
AREAWEIGHTTHRESHOLD = 0.2;
WEIGHTTHRESHOLD = 0.5;
[region,result] = detectTarget(img_bigest_eroded_restruct_fill,CIRCLEWEIGHT,CIRCLESIMILARITYTHRESHOLD,AREAWEIGHTTHRESHOLD);
[target_num,index] = drawTarget(img_rgb,region,result,WEIGHTTHRESHOLD);   

end

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]陈哲. 自然场景下的小目标交通标志检测技术研究[D].南京邮电大学,2022.DOI:10.27251/d.cnki.gnjdc.2022.001500.

[2]王强(Eric Wang). 基于深度学习的交通标志检测和识别[D].南京邮电大学,2021.DOI:10.27251/d.cnki.gnjdc.2021.001659.文章来源地址https://www.toymoban.com/news/detail-775760.html

🌈4 Matlab代码实现

到了这里,关于【图像处理】交通标志检测(Matlab代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Yolov8的中国交通标志(CCTSDB)识别检测系统

    目录 1.Yolov8介绍 2.纸箱破损数据集介绍 2.1数据集划分 2.2 通过voc_label.py得到适合yolov8训练需要的 2.3生成内容如下 3.训练结果分析          Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的(SOTA)模型,它建立在先

    2024年02月09日
    浏览(75)
  • 基于深度学习的交通标志检测和识别(从原理到环境配置/代码运行)

    项目是一个基于Python和OpenCV的交通标志检测和识别项目,旨在使用计算机视觉和深度学习技术对交通标志进行检测和分类。本文将从介绍项目原理和框架开始,详细介绍该项目的实现过程和技术细节,最后给出项目的安装和使用方法。 Traffic-Sign-Detection项目的主要原理是使用

    2024年02月03日
    浏览(35)
  • 目标检测YOLO实战应用案例100讲-基于深度学习的交通标志小目标检测与识别研究

    目录 前言 目标检测算法相关理论  2.1 深度学习理论基础  2.1.2卷积神经网络 

    2024年02月11日
    浏览(38)
  • 【目标检测】基于yolov5的交通标志检测和识别(可识别58种类别,附代码和数据集)

    写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 (专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的

    2024年02月12日
    浏览(37)
  • 基于深度学习的交通标志检测识别系统(含UI界面、yolov8、Python代码、数据集)

    项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8     yolov8主要包含以下几种创新:         1. 添加注意力机制( SE 、 CBAM 等)         2. 修改可变形卷积( DySnake -主干 c3 替换、DySnake-所有c3替换) 数据集:     网上下载的数据集,详细介绍

    2024年03月09日
    浏览(69)
  • Opencv交通标志识别

    本文使用的数据集包含43种交通标志,使用opencv以及卷积神经网络训练模型,识别交通标志,使用pyqt5制作交通标志识别GUI的界面。 如视频中所示,可以选择交通标志,然后可以进行图像预处理操作,如灰度化,边缘检测等,最后可以点击识别按钮进行识别。 交通标志识别

    2024年02月11日
    浏览(44)
  • 毕业设计-基于机器视觉的交通标志识别系统

    目录 前言 课题背景和意义 实现技术思路 一、交通标志识别系统 二、交通标志识别整体方案 三、实验分析 四、总结 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几

    2024年02月03日
    浏览(40)
  • 竞赛 深度学习 opencv python 实现中国交通标志识别

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的中国交通标志识别算法研究与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:4分 创新点:3分 🧿 更多资料, 项目分享: http

    2024年02月06日
    浏览(41)
  • 软件杯 深度学习 opencv python 实现中国交通标志识别_1

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的中国交通标志识别算法研究与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:4分 创新点:3分 🧿 更多资料, 项目分享: http

    2024年03月17日
    浏览(65)
  • Android嵌入自己训练的yolov5模型(tfLite)交通标志

    目录 第一步:下载模型与修改参数 第二步:标注数据 第三步:开始训练 第四步:yolov5转为tfLite模型 第五步:我们可以检测一下tfLite是否可用 第六步:下载官方的示例代码 第七步:修改代码 第八步:运行软件 第九步:优化速率 效果图 参考:【精选】手把手教你使用YOLOV5训练自己的目标

    2024年04月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包