Senin, 08 Juni 2015

Vehicle Licence Plate Identification BY OCR Matlab

Refrensi:
https://www.youtube.com/watch?v=4v8hJbD_B2s
http://datab.us/qkfrpNRZMIs#Automated%20License-Plate%20Recognition%20On%20Egyptian%20Licenses%20Using%20Matlab

  
clc;
close all;
clear all;
%.................................
f=imread('6.jpg');
f=imresize(f,[400 NaN]);                   %%image loading unit
imshow(f);
g=rgb2gray(f);
g=medfilt2(g,[3 3]);
%**********************************
conc=strel('disk',1);
gi=imdilate(g,conc);
ge=imerode(g,conc);            %%%% morphological image processing
gdiff=imsubtract(gi,ge);
gdiff=mat2gray(gdiff);
gdiff=conv2(gdiff,[1 1;1 1]);
gdiff=imadjust(gdiff,[0.5 0.7],[0 1],.1);
B=logical(gdiff);
[a1 b1]=size(B);
figure(2)
imshow(B)
er=imerode(B,strel('line',100,0));
figure(3)
imshow(er)
out1=imsubtract(B,er);
F=imfill(out1,'holes');      %%%filling the object
H=bwmorph(F,'thin',1);
H=imerode(H,strel('line',3,90));
figure(4)
imshow(H)
%%
final=bwareaopen(H,floor((a1/15)*(b1/15))); 
final(1:floor(.9*a1),1:2)=1;
final(a1:-1:(a1-20),b1:-1:(b1-2))=1;
yyy=template(2);
figure(5)
imshow(final)
Iprops=regionprops(final,'BoundingBox','Image');
hold on
for n=1:size(Iprops,1)
    rectangle('Position',Iprops(n).BoundingBox,'EdgeColor','g','LineWidth',2);
end
hold off
NR=cat(1,Iprops.BoundingBox);   %%Data storage section
[r ttb]=connn(NR);

if ~isempty(r)
   
   
    xlow=floor(min(reshape(ttb(:,1),1,[])));
    xhigh=ceil(max(reshape(ttb(:,1),1,[])));
    xadd=ceil(ttb(size(ttb,1),3));
    ylow=floor(min(reshape(ttb(:,2),1,[])));    %%%%%area selection
    yadd=ceil(max(reshape(ttb(:,4),1,[])));
    final1=H(ylow:(ylow+yadd+(floor(max(reshape(ttb(:,2),1,[])))-ylow)),xlow:(xhigh+xadd));
    [a2 b2]=size(final1);
    final1=bwareaopen(final1,floor((a2/20)*(b2/20)));
    figure(6)
    imshow(final1)
   
  
    Iprops1=regionprops(final1,'BoundingBox','Image');
    NR3=cat(1,Iprops1.BoundingBox);
    I1={Iprops1.Image};
   
    %%
    carnum=[];
    if (size(NR3,1)>size(ttb,1))
        [r2 to]=connn2(NR3);
       
        for i=1:size(Iprops1,1)
           
            ff=find(i==r2);
            if ~isempty(ff)
                N1=I1{1,i};
                letter=readLetter(N1,2);
            else
                N1=I1{1,i};
                letter=readLetter(N1,1);
            end
            if ~isempty(letter)
                carnum=[carnum letter];
            end
        end
    else
        for i=1:size(Iprops1,1)
            N1=I1{1,i};
            letter=readLetter(N1,1);
            carnum=[carnum letter];
        end
    end
    %%
   
    fid1 = fopen('carnum.txt', 'wt');
    fprintf(fid1,'%s',carnum);
    fclose(fid1);
    winopen('carnum.txt')
  


else
    fprintf('license plate recognition failure\n');
    fprintf('Characters are not clear \n');
end

=================================================
function letter=readLetter(snap, i1)


load NewTemplates
snap=imresize(snap,[42 24]);
comp=[ ];
if (i1==1)
    for n=1:(length(NewTemplates)-1)
        sem=corr2(NewTemplates{1,n},snap);
        comp=[comp sem];
    end
    vd=find(comp==max(comp));
 
    %*-*-*-*-*-*-*-*-*-*-*-*-*-
   
    if vd==1 || vd==2
        letter='A';
    elseif vd==3 || vd==4
        letter='B';
    elseif vd==5
        letter='C';
    elseif vd==6 || vd==7
        letter='D';
    elseif vd==8
        letter='E';
    elseif vd==9
        letter='F';
    elseif vd==10
        letter='G';
    elseif vd==11
        letter='H';
    elseif vd==12
        letter='I';
    elseif vd==13
        letter='J';
    elseif vd==14
        letter='K';
    elseif vd==15
        letter='L';
    elseif vd==16
        letter='M';
    elseif vd==17
        letter='N';
    elseif vd==18 || vd==19
        letter='O';
    elseif vd==20 || vd==21
        letter='P';
    elseif vd==22 || vd==23
        letter='Q';
    elseif vd==24 || vd==25
        letter='R';
    elseif vd==26
        letter='S';
    elseif vd==27
        letter='T';
    elseif vd==28
        letter='U';
    elseif vd==29
        letter='V';
    elseif vd==30
        letter='W';
    elseif vd==31
        letter='X';
    elseif vd==32
        letter='Y';
    elseif vd==33
        letter='Z';
    %*-*-*-*-*
   
    elseif vd==34
        letter='1';
    elseif vd==35
        letter='2';
    elseif vd==36
        letter='3';
    elseif vd==37 || vd==38
        letter='4';
    elseif vd==39
        letter='5';
    elseif vd==40 || vd==41 || vd==42
        letter='6';
    elseif vd==43
        letter='7';
    elseif vd==44 || vd==45
        letter='8';
    elseif vd==46 || vd==47 || vd==48
        letter='9';
    elseif vd==49 || vd==50
        letter='0';
    elseif vd==51
        letter='-';
    end
end
if (i1==2)
    for n=51:length(NewTemplates)
        sem=corr2(NewTemplates{1,n},snap);
        comp=[comp sem];
        max(comp);
    end
    if (max(comp)>.3)
        letter='-';
    else
        letter=[];
    end
end
end



2 komentar: