關於道路標志牌的標記和數字標記


主要內容為對道路上的限速標志的標識牌進行框取以及對標識牌中的數字進行框取

原圖如下所示:

需要對上圖中的紅色框進行標記,以及將上圖中的數字進行框取出來。

諸多過程圖不加贅述,有需要可自行運行下下述代碼,了解相關算法步驟:

 

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

 效果圖如下所示:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM