天天看點

基于MATLAB的無邊緣的字元識别算法仿真

% OCR (Optical Character Recognition).

% Author: Ing. Diego Barrag醤 Guerrero 

% e-mail: [email protected]

% For more information, visit: www.matpic.com

%________________________________________

% PRINCIPAL PROGRAM

warning off %#ok<WNOFF>

% Clear all

clc, close all, clear all

% Read image

imagen=imread('IMG_4367.JPG');

% Show image

subplot(3,2,1);

imshow(imagen);

title('原圖');

title('INPUT IMAGE WITH NOISE')

% Convert to gray scale

if size(imagen,3)==3 %RGB image

    imagen=rgb2gray(imagen);

end

[r,c]=size(imagen);

% Convert to BW

threshold = graythresh(imagen);

%**********************************************

sum=0;

for i=1:r

    for j=1:c

        if imagen(i,j)>threshold

            sum=sum+1;

        else

            sum=sum-1;

        end

    end

end 

%一般來說,車牌中,背景所占的比例大于前景所占的比例

if sum>=0  %sum大于0.說明背景的像素值偏大

    imagen=im2bw(imagen,threshold);%将圖像二值化 [0 threshold]設為1,[threshold 255]設為0. 背景設為黑色,前景設為白色

else

    imagen =~im2bw(imagen,threshold); %将圖像二值化  [0 threshold]設為0,[threshold 255]設為1.

end

% %圖像形态學處理

SE=strel('arbitrary',[0 1 0;1 1 1;0 1 0]);

imagen=imerode(imagen,SE);

imagen=imdilate(imagen,SE);

%imagen =~im2bw(imagen,threshold);   %将圖像二值化

%**************************************************

% Remove all object containing fewer than 30 pixels

imagen = bwareaopen(imagen,30);  %排除小于30像素的連通區域

subplot(3,2,2);

imshow(imagen);

title('二值化結果');

%Storage matrix word from image

word=[ ];

re=imagen;

%Opens text.txt as file for write

fid = fopen('text.txt', 'wt');

% Load templates

load templates

global templates

% Compute the number of letters in template file

num_letras=size(templates,2);

global num_letras;

%********************************************

%采用基于水準與垂直投影的字元分割方法

%計算垂直投影

clear sum;

vertical=sum(imagen,2);

subplot(3,2,3);

plot(vertical);

title('水準投影結果');

%根據垂直投影結果剪切圖檔

row=uint32(size(vertical,1)/8);

Y1=min(vertical(1:row,1));    

r1=find(vertical(1:row,1)==Y1);

Y2=min(vertical(size(vertical,1)-row:size(vertical,1),1));

r2=find(vertical(size(vertical,1)-row:size(vertical,1),1)==Y2);

imagen=imagen(max(r1):size(vertical,1)-row+min(r2)-1,:);

subplot(3,2,4);

imshow(imagen);

title('剪切得到的結果');

%計算水準投影

Horizon=sum(imagen); %Horizon 記錄了imagen的列和

subplot(3,2,5);

plot(Horizon);

title('垂直投影結果');

space=(size(Horizon,2)-0)/7;

i=5;

[L Ne] = bwlabel(Horizon);

figure;

count=1;

global count;

for n=1:Ne                           %Ne 辨別連通區域的個數

        [r,c] = find(L==n);

        % Extract letter

        n1=imagen(:,min(c):max(c));  

        if max(c)-min(c)>4*space/3

           letters=[];

           global letters;

           letters=Csegmentation(n1,min(c),max(c),Horizon,space);

           word=[word letters]

        else if max(c)-min(c)>space/6

           img_r=imresize(n1,[180 90]);

           subplot(5,2,count);  

           imshow(img_r);

           imwrite(img_r,strcat(num2str(count),'.bmp'));

           count=count+1;

          % img_r=imresize(n1,[42 24]);     %将分割出來的字元進行歸一化

           % Call fcn to convert image to text

           letter=read_letter(img_r,num_letras);

           % Letter concatenation

           word=[word letter];

            end

        end

end

%fprintf(fid,'%s\n',lower(word));%Write 'word' in text file (lower)

fprintf(fid,'%s\n',word);%Write 'word' in text file (upper)

% Clear 'word' variable

word=[ ]; 

fclose(fid);

%Open 'text.txt' file

winopen('text.txt')

clear all

仿真結果如下所示:

繼續閱讀