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

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

原图如下所示:

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

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

 

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:count
    fill_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:count

top_i = 0;
top_j = 0;
bottom_i = 0;
bottom_j = 0;
flag = 0;
%识别该段从北方开始的位置( - 顶部)
for i = 1:row
    for j = 1:col
    if(input(i,j) == values(indexing))
        top_i = i;
        top_j = j;
        flag = 1;
        break
    end
    end
    if(flag == 1)
        break
    end
end
flag = 0;

%识别,段在南方( - 底部)结束
for i = row:-1:1
    for j = 1:col
    if(input(i,j) == values(indexing))
        bottom_i = i;
        bottom_j = j;
        flag = 1;
        break
    end
    end
    if(flag == 1)
        break
    end
end

flag = 0;

%识别,段从哪里到达东边(-right)
for i = col:-1:1
    for j = 1:row
    if(input(j,i) == values(indexing))
        right_i = j;
        right_j = i;
        flag = 1;
        break
    end
    end
    if(flag == 1)
        break
    end
end

flag = 0;

%识别段开始于西部的位置(-left)
for j = 1:col
    for i = 1:row
    if(input(i,j) == values(indexing))
        left_i = i;
        left_j = j;
        flag = 1;
        break
    end
    end
    if(flag == 1)
        break
    end
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<30
            I_h(i,j,2)=0;
            %I_h(i,j,1)=0;
            %I_h(i,j,3)=0;
        end
    end
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_1

top_i_1 = 0;
top_j_1 = 0;
bottom_i_1 = 0;
bottom_j_1 = 0;
flag_1 = 0;
%识别该段从北方开始的位置( - 顶部)
for i = 1:row_1
    for j = 1:col_1
    if(input_1(i,j) == values_1(indexing_1))
        top_i_1 = i;
        top_j_1 = j;
        flag_1 = 1;
        break
    end
    end
    if(flag_1 == 1)
        break
    end
end
flag_1 = 0;

%识别,段在南方( - 底部)结束
for i = row_1:-1:1
    for j = 1:col_1
    if(input_1(i,j) == values_1(indexing_1))
        bottom_i_1 = i;
        bottom_j_1 = j;
        flag_1 = 1;
        break
    end
    end
    if(flag_1 == 1)
        break
    end
end

flag_1 = 0;

%识别,段从哪里到达东边(-right)
for i = col_1:-1:1
    for j = 1:row_1
    if(input_1(j,i) == values_1(indexing_1))
        right_i_1 = j;
        right_j_1 = i;
        flag_1 = 1;
        break
    end
    end
    if(flag_1 == 1)
        break
    end
end

flag_1 = 0;

%识别段开始于西部的位置(-left)
for j = 1:col_1
    for i = 1:row_1
    if(input_1(i,j) == values_1(indexing_1))
        left_i_1 = i;
        left_j_1 = j;
        flag_1 = 1;
        break
    end
    end
    if(flag_1 == 1)
        break
    end
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

 效果图如下所示:

 

 

posted @ 2019-01-23 10:07  zhuhongzhous  阅读(1730)  评论(0编辑  收藏  举报