主要内容为对道路上的限速标志的标识牌进行框取以及对标识牌中的数字进行框取

原图如下所示:

需要对上图中的红色框进行标记,以及将上图中的数字进行框取出来。

诸多过程图不加赘述,有需要可自行运行下下述代码,了解相关算法步骤:

close all
%读入一张图片
source = imread('test2.jpg');
figure(1);imshow(source),title('Source Image');
%图像中的RGB通道
red = source(:,:,1);
green = source(:,:,2);
blue = source(:,:,3);%原图只保留R通道
final = red - blue - green;
figure(2);imshow(final),title('After R portion Extraction');%将图像转化为2进制图像
binary_image = imbinarize(final);
figure(3);imshow(binary_image),title('After converting to Binary Image');%去噪,剔除小噪点
noiseless_image = bwareaopen(binary_image, 400);
figure(4);imshow(noiseless_image),title('After removing smaller areas');%4通道分析
connected = bwlabel(noiseless_image, 4);
Major_axis = regionprops(connected, 'MajorAxisLength');
Minor_axis = regionprops(connected, 'MinorAxisLength');%没有连接的部分
uniques = unique(connected);
count = max(uniques);
output = connected; %删除不是作为标牌的图像部分
for i = 1:countfill_numerator = Major_axis(i).MajorAxisLength;fill_denominator = Minor_axis(i).MinorAxisLength;fill_ratio = fill_numerator/fill_denominator;%避免除以零if (Minor_axis(i).MinorAxisLength==0)output(connected==i) = 0;%填充标准elseif (fill_ratio > 1.6)output(connected==i) = 0;end
end
figure(5);imshow(output);title('Removing filling ratio > 1.6');%确定消除面积小的区域
BW2 = bwareaopen(output, 500);
%figure(6);subplot(1,3,2),
%imshow(BW2),title('Eliminating the segments other than signage');%映射连接组件映像上的现有区域
output(BW2 == 0) = 0;
figure(7);
imshow(output),title('Segmented Image');
%从源图像裁剪分段
input = output;
values = unique(input(input~=0));
count = numel(values);
Area = zeros(count,1);
[row,col] = size(input);
%对于所有已识别的细分
for indexing = 1:counttop_i = 0;
top_j = 0;
bottom_i = 0;
bottom_j = 0;
flag = 0;
%识别该段从北方开始的位置( - 顶部)
for i = 1:rowfor j = 1:colif(input(i,j) == values(indexing))top_i = i;top_j = j;flag = 1;breakendendif(flag == 1)breakend
end
flag = 0;%识别,段在南方( - 底部)结束
for i = row:-1:1for j = 1:colif(input(i,j) == values(indexing))bottom_i = i;bottom_j = j;flag = 1;breakendendif(flag == 1)breakend
endflag = 0;%识别,段从哪里到达东边(-right)
for i = col:-1:1for j = 1:rowif(input(j,i) == values(indexing))right_i = j;right_j = i;flag = 1;breakendendif(flag == 1)breakend
endflag = 0;%识别段开始于西部的位置(-left)
for j = 1:colfor i = 1:rowif(input(i,j) == values(indexing))left_i = i;left_j = j;flag = 1;breakendendif(flag == 1)breakend
end%平方计算的边界 - 形成正方形square_right_row_top = top_i - 5;
square_right_col_top = right_j + 5;square_left_row_top = square_right_row_top;
square_left_col_top = left_j - 5;square_left_row_bottom = bottom_i + 5;
square_left_col_bottom = square_left_col_top;square_right_row_bottom = square_left_row_bottom;
square_right_col_bottom = square_right_col_top;%在原始图像上绘制已识别的形状
width = square_right_col_top - square_left_col_top;
height = square_left_row_bottom - square_left_row_top;Area(indexing) = width * height;if(Area(indexing) > 2000)
figure(8)
imshow(source)
rectangle('Position',[square_left_col_top,square_left_row_top,width,height],'LineWidth',5,'EdgeColor','r'),title('Identified Signage Information');
%分析裁剪的图像
%从源中提取段
cropped_Image = source(square_left_row_top:square_right_row_bottom,square_left_col_top:square_right_col_bottom,:);
figure(9)
imshow(cropped_Image),title('Extracted Image');
%% %数字提取
i=source;
figure(10)
imshow(i),title('Extracted Image');
rectangle('Position',[square_left_col_top,square_left_row_top,width,height],'LineWidth',5,'EdgeColor','r'),title('Identified Signage Information');
I_h=rgb2hsv(i);
for i=square_left_row_top:(height+square_left_row_top)for j=square_left_col_top:(width+square_left_col_top)h=I_h(i,j,1);s=I_h(i,j,2);v=I_h(i,j,3);%通过将h通道颜色值特定范围内饱和度设为0,保留范围外颜色值if 0<h && h<0.833 %if 130<h && h<170 && 45<s&&s<85&&v>20&&v<30I_h(i,j,2)=0;%I_h(i,j,1)=0;%I_h(i,j,3)=0;endend
end
I_r=hsv2rgb(I_h);
figure(11),imshow(I_r),title('11Image');
i1=rgb2gray(I_r);
i1=im2bw(i1,0.17);
i1=medfilt2(i1, [7 7]);
i1=~i1;
figure(12),imshow(i1),title('11Image');
se=strel('disk',10);
marker=imerode(i1,se);
figure(13),imshow(marker),title('11Image');
f_obj=imreconstruct(marker,i1);
figure(14),imshow(f_obj),title('imreconstruct_image')
%%
input_1=f_obj;
values_1 = unique(input_1(input_1~=0));
count_1 = numel(values_1);
Area_1 = zeros(count_1,1);
[row_1,col_1] = size(input_1);
%对于所有已识别的细分
for indexing_1 = 1:count_1top_i_1 = 0;
top_j_1 = 0;
bottom_i_1 = 0;
bottom_j_1 = 0;
flag_1 = 0;
%识别该段从北方开始的位置( - 顶部)
for i = 1:row_1for j = 1:col_1if(input_1(i,j) == values_1(indexing_1))top_i_1 = i;top_j_1 = j;flag_1 = 1;breakendendif(flag_1 == 1)breakend
end
flag_1 = 0;%识别,段在南方( - 底部)结束
for i = row_1:-1:1for j = 1:col_1if(input_1(i,j) == values_1(indexing_1))bottom_i_1 = i;bottom_j_1 = j;flag_1 = 1;breakendendif(flag_1 == 1)breakend
endflag_1 = 0;%识别,段从哪里到达东边(-right)
for i = col_1:-1:1for j = 1:row_1if(input_1(j,i) == values_1(indexing_1))right_i_1 = j;right_j_1 = i;flag_1 = 1;breakendendif(flag_1 == 1)breakend
endflag_1 = 0;%识别段开始于西部的位置(-left)
for j = 1:col_1for i = 1:row_1if(input_1(i,j) == values_1(indexing_1))left_i_1 = i;left_j_1 = j;flag_1 = 1;breakendendif(flag_1 == 1)breakend
end%平方计算的边界 - 形成正方形square_right_row_top_1 = top_i_1 - 5;
square_right_col_top_1 = right_j_1 + 5;square_left_row_top_1 = square_right_row_top_1;
square_left_col_top_1 = left_j_1 - 5;square_left_row_bottom_1 = bottom_i_1 + 5;
square_left_col_bottom_1 = square_left_col_top_1;square_right_row_bottom_1 = square_left_row_bottom_1;
square_right_col_bottom_1 = square_right_col_top_1;%在原始图像上绘制已识别的形状
width_1 = square_right_col_top_1 - square_left_col_top_1;
height_1 = square_left_row_bottom_1 - square_left_row_top_1;Area_1(indexing_1) = width_1 * height_1;if(Area_1(indexing_1) > 2000)
figure(15)
imshow(input_1)
rectangle('Position',[square_left_col_top_1,square_left_row_top_1,width_1,height_1],'LineWidth',3,'EdgeColor','r'),title('Identified Signage Information');
%分析裁剪的图像
%%
%二次识别图像数字
input_2=input_1;
se=strel('disk',5);
input_2=imdilate(input_2,se);
%figure(16)
%imshow(input_2)
%title('sss');
L = bwlabel(input_2,8);
stats = regionprops(input_2, 'basic');
centroids = cat(1, stats.Centroid);
figure('name','regionprops'),
%绘制开操作之后的二值化图像
imshow(input_2),title('centroids')
hold on
%绘制重心
%plot(centroids(:,1), centroids(:,2), 'b*'),
%绘制感兴趣区域ROI
for i=1:size(stats)rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','-','EdgeColor','r'),
end
figure(16)
imshow(L)
title('sss');
%%
%显示图像
figure(17)
imshow(source)
rectangle('Position',[square_left_col_top,square_left_row_top,width,height],'LineWidth',3,'EdgeColor','r'),title('Identified Signage Information');
rectangle('Position',[square_left_col_top_1,square_left_row_top_1,width_1,height_1],'LineWidth',3,'EdgeColor','r'),title('Identified Signage Information');
for i=1:size(stats)rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','-','EdgeColor','r'),
end
end
end%%
%字符识别
%text = ocr(cropped_Image);
end
end

 效果图如下所示:

转载于:https://www.cnblogs.com/zhuhongzhous/p/10307410.html

关于道路标志牌的标记和数字标记相关推荐

  1. Excel如何批量给混合文本中的数字标记不同颜色

    今天跟大家分享一下Excel如何批量给表格中的数字标记不同颜色 1.打开Excel文件 2.选择要标记数字颜色的单元格 3.点击下图选项(Excel工具箱,百度即可了解详细下载安装信息,本文这里就不做 ...

  2. 前端:HTML/02/排版标记,块元素,行内元素,html字符实体,列表标记,图片标记

    html排版标记 <p></p> :表示一个段落 常用属性:align :水平对齐方式,取值:left(左),center(居中),right(右) 换行标记<br> ...

  3. html图层标记,图层标记和合成标记

    使用合成标记和图层标记可存储注释和其他元数据,以及标记合成或图层中的重要时刻.合成标记显示在合成的时间标尺上,而每个图层标记显示在相应图层的持续时间条上.两种标记都可以保存相同的信息. 标记可以指单个 ...

  4. Ae:图层标记和合成标记

    使用合成标记 Composition Marker和图层标记 Layer Marker可存储注释和其他元数据,以及标记合成或图层中的重要时刻,既可指单个时间点,也可以指一段持续时间. 合成标记显示在时 ...

  5. 垃圾回收之垃圾回收算法(标记清除、标记整理、复制)、分代垃圾回收

    2. 垃圾回收算法 之前我们学习了如何判断一个对象是不是可以作为垃圾被回收,但是具体回收还需要依赖一些回收方面的算法,常见的有三种: 分别是标记清除.标记整理.和复制这三种算法,下面先从第一种标记清除 ...

  6. html语言设计表格,HTML标记语言——表格标记

    HTML标记语言--表格标记 互联网   发布时间:2008-10-17 18:55:24   作者:佚名   我要评论 点击这里返回网页教学网 HTML教程 栏目. 上文:标记语言--标题 原文出处 ...

  7. 【五线谱】踏板标记 ( 踩下踏板 Ped 标记 | 松开踏板 * 标记 | MIDI 中的对应踏板指令 | 连续控制信号 | 开关控制信号 )

    文章目录 一.踏板标记 ( 踩下踏板 Ped 标记 | 松开踏板 * 标记 ) 二.连续控制信号 ( Continuous Controller ) 与 开关控制信号 ( Switch Control ...

  8. lisp 标记形心_标记-压缩算法

    前言 内存碎片一直是非移动垃圾回收器(指在垃圾回收时不进行对象的移动)的一个问题,比如说在前面的标记-清除垃圾回收器就有这样的问题.而标记-压缩垃圾回收算法能够有效的缓解这一问题. 算法原理 既然叫标 ...

  9. 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优

    67.Java垃圾收集机制 67.1.对象引用 67.2.垃圾对象的判定 67.3.垃圾收集算法 67.3.1.标记-清除算法 67.3.2.标记-整理算法 67.3.3.分代收集 67.4.垃圾收集 ...

最新文章

  1. 关机时 ,提示其他用户登录到这台计算机,关闭WINDOWS会使他们丢失数据
  2. 计算密集型服务 性能优化实战始末
  3. UITableView 重用cell方法edequeueReusableCellWithIdentifier,出现错误
  4. java封装264成flv,将H.264封装为FLV格式-Go语言中文社区
  5. mysql mha配置idrac远程关机_iDRAC远程管理功能试用_戴尔 PowerEdge R810(Xeon E7520/16GB/3*146GB)_服务器评测与技术-中关村在线...
  6. 开源运维管理软件排名_企业运维监控平台架构设计与实现(ganglia篇)
  7. 关于C#使用工具类解析JSON数据以及将类JSON化
  8. 遗传算法求解TSP问题(Python)
  9. 室内定位无GPS怎么办?阿木送来解决方案~
  10. 深度学习系列18:开源人脸识别库
  11. kali安装百度网盘客户端
  12. HTC Vive Unity 教程
  13. 道德经和译文_老子《道德经》全文解析及通俗译文
  14. 支付宝小程序设置服务器维护,教程|如何开发支付宝小程序服务端:蚂蚁金融云...
  15. The SetStack Computer UVA - 12096 集合栈计算机 set集合
  16. 经典案例--JS购物车
  17. 前端开发者使用Chrome浏览器开发用到的插件
  18. Omnipeek空口抓包(2):扫描无线网络
  19. 【电源专题】案例:单节18650电池供电的设备在3.6V时候怎么电量就只剩下一格了?
  20. 五洲20国政商代表团到访全球蜂集团

热门文章

  1. 设计模式之结构型模式
  2. spring入参为指定值,校验java入参的值为规定的值,利用Validator指定值校验注解——一看就会
  3. 什么是响应式网页设计?
  4. Python数据挖掘:利用聚类算法进行航空公司客户价值分析
  5. Spring Cloud的基本认识和使用Spring Cloud的基本教程(山东数漫江湖)
  6. 迈向云原生开发,我眼中的云原生
  7. uni-app通过wifi连接设备并进行命令交互
  8. 大白话:计算机网络——网速
  9. WPS文档:格式显示,页码标注,公式居中编号右对齐,公式编号不能在行中间显示
  10. 强制退出scrapy