% 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
仿真结果如下所示:
  
D180