主要內容為對道路上的限速標志的標識牌進行框取以及對標識牌中的數字進行框取
原圖如下所示:
需要對上圖中的紅色框進行標記,以及將上圖中的數字進行框取出來。
諸多過程圖不加贅述,有需要可自行運行下下述代碼,了解相關算法步驟:
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
效果圖如下所示: