fi = imread('noplate.jpg');
%imshow(fi)
fin = rgb2gray(fi);
imshow(fin);
d=double(fin)
%imshow(fin)
[r c]= size(d)
% Mexican filter operator
filter = [ 0 0 0 -1 -1 -1 0 0 0 ;
0 -1 -1 -3 -3 -3 -1 -1 0;
0 -1 -3 -3 -1 -3 -3 -1 0;
-1 -3 -3 6 13 6 -3 -3 -1;
-1 -3 -1 13 24 13 -1 -3 -1;
-1 -3 -3 -6 13 6 -3 -3 -1;
0 -1 -3 -3 -1 -3 -3 -1 0;
0 -1 -1 -3 -3 -3 -1 -1 0;
0 0 0 -1 -1 -1 0 0 0 ];
% creating image matrix for mexican hat operator
gm = zeros(r,c);
for i=5:2:r-5
for j=5:2:c-5
gm(i,j) = sum(sum(double(fin(i-4:i+4,j-4:j+4)).*filter,2));
end;
end;
% removing the unwanted edges by using a threshold
fh = gm>1200;
%Dilation operation
x = 1;
y =1;
fs = double(fh);
se = ones(3,3);
for x= 3:3:r-20
for y = 3:3:c-20
if(x+50<=r)
xend = x+50;
else
xend = r;
end;
if(y+100<=r)
yend = y + 150;
else
yend = c;
end;
if(sum(fh(x:xend,y))<=35||sum (fh(x,y:yend,2)<=60))
if(sum(fh(x,y:y+3),2)<=3) && (sum(fh(x,y:y+3),2)>2)
fs(x-2:x+2,y-2:y+2)=bwmorph(fh(x-2:x+2,y-2:y+2),'dilate',se);
end;
end;
end;
end;
%imshow(fin)
%image with dilation performed
f=double(fs);
[row col]=size(f);
%initialising a matrix for a segmented image
g=zeros(row,col);
gl=zeros(row,col);
label=1;
n=1;
x=1;
iter=[];
it=0;
ss_prev=0;
nn=[];
sss_mat=[];
for i=1:2:row
for j=1:2:col
r_pt=i;
c_pt=j;
if(g(r_pt,c_pt)==0)
while(true)
|%using 4 neighbour rule|
if(f(r_pt(n),c_pt(n))==1 && g(r_pt(n),c_pt(n))==0)
g(r_pt(n),c_pt(n))=label;
if(r_pt(n)+1<=row)
if(f(r_pt(n)+1,c_pt(n))==1)
r_pt=[r_pt r_pt(n)+1];
c_pt=[c_pt c_pt(n)];
x=x+1;
end;
end;
if(c_pt(n)-1>=1)
if(f(r_pt(n),c_pt(n)-1)==1)
r_pt=[r_pt r_pt(n)];
c_pt=[c_pt c_pt(n)-1];
x=x+1;
end;
end;
if(c_pt(n)+1<=col)
if(f(r_pt(n),c_pt(n)+1)==1)
r_pt=[r_pt r_pt(n)];
c_pt=[c_pt c_pt(n)+1];
x=x+1;
end;
end;
if(r_pt(n)-1>=1)
if(f(r_pt(n)-1,c_pt(n))==1)
r_pt=[r_pt r_pt(n)-1];
c_pt=[c_pt c_pt(n)];
x=x+1;
end;
end;
end;
if(n>=x)
break;
end;
n=n+1;
end;
y1=min(r_pt);
y2=max(r_pt);
x1=min(c_pt);
x2=max(c_pt);
a1=g(min(r_pt):max(r_pt),min(c_pt):max(c_pt));
f1=d(min(r_pt):max(r_pt),min(c_pt):max(c_pt));
[ra ca]=size(a1);
| if(n>=50)|
b1=bwlabel(a1);
ss=regionprops(b1,'euler number');
sss=struct2array(ss);
sss=min(sss);
sss_mat=[sss_mat sss];
if(sss<ss_prev && sss<0 && ca <=190 && ra<=60 && ca>=50 && ra >=15 && mean(mean(f1))<=220)
x_cor1=x1;
y_cor1=y1;
x_cor2=x2;
y_cor2=y2;
ss_prev=sss;
end;
label=label+1;
else
g(r_pt,c_pt)=0;
end;
end;
x=1;
n=1;
it=1;
end;
end;
if(exist('y_cor1')==1)
d(y_cor1:y_cor1+2,x_cor1:x_cor2)=255;
d(y_cor2:y_cor2+2,x_cor1:x_cor2)=255;
d(y_cor1:y_cor2,x_cor1:x_cor1+2)=255;
d(y_cor1:y_cor2,x_cor2:x_cor2+2)=255;
end;
% Segmented licence plate image
d=mat2gray(d);
|lp=d(y_cor1:y_cor2,x_cor1:x_cor2);|
%%% 2. Character Segmentation
%License plate image, characters of wcich are to be segmented
lp1 = d(y_cor1:y_cor2,x_cor1:x_cor2);
[rl cl] = size(lp1);
% Median Filtering
lp = medfilt2(lp1,[3 3]);
% Contrast Enhancement
lpf = imadjust(lp,stretchlim(lp,[0.1 0.5]));
%creating output image matrix
output= zeros(rl,cl);
% Window for local threshold operation
dis = round(cl/7);
% Local threshold operation
for i=1:dis:cl
if(i+dis-1<=cl)
t=threshcal(lpf(:,i:i+dis-1),a);
for i=1:dis:cl
if(i+dis-1<=cl)
t=threshcal(lpf(:,i:i+dis-1),a);
output(:,i:i+dis-1)=lpf(:,i:i+dis-1)<=t;
else
t=threshcal(lpf(:,i:cl),a);
for z1=2:rl-1
for z2=i+5:cl-5
if(mean(mean(lpf(z1-1:z1+1,z2-5:z2+5)))<=t)
output(z1,z2)=1;
end;
end;
end;
output(:,i:cl)=lpf(:,i:cl)<=t;
end;
end;
end;
end;
% Structuring element for erosion operation
se = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
output = output - imerode(output,se);
[of lab lpdet] = reggrowl(logical(output),number);
% Segmented characters
lpdet = logical(lpdet);
% Character Recognition
% output String giving licence plate information
lpstr=[];
for i= 1:lab-1
R = lpdet(:,st
t+9);
st = st+10;
b = bwlabel®;
% Feature extraction
ar = struct2array(regionprops(b,'area'));
or = struct2aarray(regionprops(b,'orientation'))/90;
eu = struct2array(regionprops(b,'eulernumber'))/10;
pe = struct2array(regionprops(b,'perimeter'));
mi = struct2array(regionprops(b,'minoraxislength'));
ma = struct2array(regionprops(b,'majoraxislength'));
temp = logical®;
% Reflection X and Y coefficient determination
v1 = temp;
v1(:,6:10)=flipdim(temp(:,1:5),2);
vx = (v1 + temp)/2;
vx = vx>=0.5;
xcoef = sum(sum(temp),2)/sum(sum(vx),2);
v2 = temp;
v2(1:12,
= flipdim(temp(13:24,
,1);
vy = (v2 + temp)/2;
vy = vy >= 0.5;
ycoef = sum(sum(temp),2)/sum(sum(vy),2);
ed = struct2array(regionprops(b,'equivdiameter'))/100;
[val pos] = max(fa);
vcoeff = pe(pos)/ar(pos);
mcoeff = ed(pos);
Rp = [xcoef/ycoef;pe(pos)/ar(pos);mi(pos)/ma(pos)];
answer=find(compet(A2)==1);
if(i<=numel(lpnum))
if(alphamat(answer)==lpnum(i))
numrc = numrc+1;
else
answ = find(alphamat==lpnum(i));
err(answ) = err(answ) + 1;
end;
end;
lpstr = [lpstr alphamat(answer)];
end;
numc = numc + numel(lpnum);
if(strcmp(lpstr,lpnum)==1)
tr = tr + 1;
sr = strcat(num2str(num),'/',num2str(1),'//');
casep = [casep sr];
else
fr = fr +1;
sr = strcat(num2str(num),'/',num2str(1),'/',num2str(answer),'//');
casen = [casen sr];
end;
Thanking you, With regards, Rakshitha
9 Comments
Show 6 older comments
Rakshitha on 1 Apr 2012
K Sir, thank you so much... i will try using debuggers.
mahjoub el attar on 4 Apr 2012
Hello Rakshita.
With respect....
I'd like to solve your problem.
But code is not clear, not segmented and not commented.
It's big time consuming answer.
If you expect help, you need to provide clear and readable code.
Friendly.
aziz rehman on 4 Mar 2016
Hello sir .. Sir can you provide the image on which you run this code? The images that you tested for this code.
Tags
artificial neural networklprocrann
Products
No products are associated with this question.
3 Answers
mahjoub el attar
Vote1
Link
Answer by mahjoub el attar on 4 Apr 2012
Accepted answer
function [LPImageGray,LPImageBW,BW2,BW3,stats,LPImageTH,EdgeImage,imrefdata,ids,im] = AnprEngine( LPImage,thresh)
%ANPRENGINE Summary of this function goes here
% Process image input analytics and output licence plate alphanumeric string
% Based on static image
tic
%%
% Variables Initialization
% EligibleBands = zeros(3,2);
% Pointer = 1;
% Sensing = 0;
% MinimalHeight = 15;
srcData = load('AnprSysData.mat');
imrefdata = srcData.AlphaNumRef;
im = [];
C = zeros(109);
% toc
%%
% Pre-process LPImage
LPImageGray = rgb2gray(LPImage);
LPImageTH = imtophat(LPImageGray,strel('ball',12,7));%Close ball 18 7/ Far ball 12 4
imadjust(LPImageTH,[0;0.1],[0;1]);
%[EdgeImage, thr, gv, gh] = edge(LPImageGray,'sobel','nothinning');
[EdgeImage, ~, ~] = edge(LPImageGray,'sobel');
LPImageBW = ~im2bw(LPImageTH,thresh);
%LPImageVH = edge(LPImageGray, 'sobel',0.11,'vertical');
%sz = size(LPImage);
toc
%%
% Skew detection Spacial Transformation correction
%%
% Process Image ROI candidates, Heuristic and Bands Elimamination
toc
ProjectionVH = sum(LPImageVH,2);%Compute sum of Horizontal Projection of vertical lines
maxIndexValue = find(ProjectionVH == max(ProjectionVH), 1,'last');%Find Max Index Value of ProjectionVH 1*m Matrix
% Locate most significative eligible bands.
sensor = mean(ProjectionVH);% Define standard deviation of ProjectionVH to find eligible bands
for idx = 1
z(1,1)
if(ProjectionVH(idx) > sensor && Sensing == 0)
Sensing = 1;
EligibleBands(Pointer, 1) = idx;
end
if(ProjectionVH(idx) < sensor && Sensing == 1)
Sensing = 0;
EligibleBands(Pointer, 2) = idx;
if((EligibleBands(Pointer, 2)-EligibleBands(Pointer, 1))>MinimalHeight)
Pointer = Pointer + 1;
end
end
end
for i = 1
z(1,1)
if(i < EligibleBands(1,1) || i > EligibleBands(1,2))
LPImageBW(i,
= 0;
end
end
%%
% Locate Licence Plate Bands
%%
% Blobs Analysis
CC = bwconncomp(LPImageBW);
stats = regionprops(CC, 'Area','BoundingBox','Image');
ids = find([stats.Area] > 8 & [stats.Area] < 250);
BW2 = ismember(labelmatrix(CC),ids);
toc
%%
% Blobs Analysis
CC2 = bwconncomp(~LPImageBW);
stats2 = regionprops(CC2,'Area','BoundingBox','Eccentricity');
ids2 = find([stats2.Area] > 20 & [stats2.Eccentricity] > 0.95);
BW3 = ismember(labelmatrix(CC2),ids2);
%BW3 = [];% ismember(labelmatrix(CC2),ids2);
toc
%%
% Pre-OCR
for k=1:length(ids)
imOriginal = stats(ids(k)).Image;
BB = stats(ids(k)).BoundingBox;
NormIm{1,1} = resizem(imOriginal,[60,30]);
NormIm{2,1} = BB(4)/BB(3);
[NormIm{3,1} NormIm{4,1}, NormIm{5,1}] = getMaxCorrelationRate(NormIm{1,1},imrefdata);
if(BB(4)/BB(3)>=1.4 && BB(4)/BB(3)<=2 || BB(4)/BB(3)>=3 && BB(4)/BB(3)<=10)
im = [im NormIm];
%imshow(cell2mat(PD(1,
)) %to display all column in first row on NormIm
%output
%imshow(cell2mat(E2(2)))
end
end
toc
%%
% OCR Function
function [Rate,id, Letter] = getMaxCorrelationRate(imOriginal,imrefdata)
for n=1:length(imrefdata)
Rates(n) = corr2(imOriginal,cell2mat(imrefdata(1,n)));
end
[Rate,id] = max(Rates);
if(Rate>0.48)
Letter = imrefdata{2,id};
else
Letter ='';
end;
end
%%
% OCR AlphaNumerical resolution
%%
% LPNumber = 'Hello Plate';
%% Output
end
% It uses correlation instead of ANN.
% All is in AnprSysData.mat file Chars are indexed from 1 to 109
% Author Mahjoub El attar 2002-2006 for smartKam. For more information feel free to contact me at my profile email contact address.
8 Comments
Show 5 older comments
Rakshitha on 6 Apr 2012
K Sir.. but in the line
CC = bwconncomp(LPImageBW); bwconncomp is undefined.
mahjoub el attar on 6 Apr 2012
Hello, "bwconncomp" is an image processing built-in function.
On binary connected component!
Rakshitha on 6 Apr 2012
Sir, for
LPImageBW = ~im2bw(LPImageTH,thresh);
as you have said I gave the thresh value= 0.17 ie
LPImageBW = ~im2bw(LPImageTH,0.17);
later for CC = bwconncomp(LPImageBW); it shows error as
??? Undefined function or method 'bwconncomp' for input arguments of type 'logical'.
mahjoub el attar
Vote0
Link
Answer by mahjoub el attar on 4 Apr 2012
fi = imread('noplate.jpg');
%imshow(fi)
fin = rgb2gray(fi);
imshow(fin);
d=double(fin)
%imshow(fin)
[r c]= size(d)
% Mexican filter operator
filter = [ 0 0 0 -1 -1 -1 0 0 0 ; 0 -1 -1 -3 -3 -3 -1 -1 0; 0 -1 -3 -3 -1 -3 -3 -1 0; -1 -3 -3 6 13 6 -3 -3 -1; -1 -3 -1 13 24 13 -1 -3 -1; -1 -3 -3 -6 13 6 -3 -3 -1; 0 -1 -3 -3 -1 -3 -3 -1 0; 0 -1 -1 -3 -3 -3 -1 -1 0; 0 0 0 -1 -1 -1 0 0 0 ];
% creating image matrix for mexican hat operator
gm = zeros(r,c);
for i=5:2:r-5
for j=5:2:c-5
gm(i,j) = sum(sum(double(fin(i-4:i+4,j-4:j+4)).*filter,2));
end;
end;
% removing the unwanted edges by using a threshold
fh = gm>1200;
%Dilation operation
x = 1;
y =1;
fs = double(fh);
se = ones(3,3);
for x= 3:3:r-20
for y = 3:3:c-20
if(x+50<=r)
xend = x+50;
else
xend = r;
end;
if(y+100<=r)
yend = y + 150;
else
yend = c;
end;
if(sum(fh(x:xend,y))<=35||sum (fh(x,y:yend,2)<=60))
if(sum(fh(x,y:y+3),2)<=3) && (sum(fh(x,y:y+3),2)>2)
fs(x-2:x+2,y-2:y+2)=bwmorph(fh(x-2:x+2,y-2:y+2),'dilate',se);
end;
end;
end;
end;
%imshow(fin)
%image with dilation performed
f=double(fs);
[row col]=size(f);
%initialising a matrix for a segmented image
g=zeros(row,col);
gl=zeros(row,col);
label=1;
n=1;
x=1;
iter=[];
it=0;
ss_prev=0;
nn=[];
sss_mat=[];
for i=1:2:row
for j=1:2:col
r_pt=i;
c_pt=j;
if(g(r_pt,c_pt)==0)
while(true)
%using 4 neighbour rule
if(f(r_pt(n),c_pt(n))==1 && g(r_pt(n),c_pt(n))==0)
g(r_pt(n),c_pt(n))=label;
if(r_pt(n)+1<=row)
if(f(r_pt(n)+1,c_pt(n))==1)
r_pt=[r_pt r_pt(n)+1];
c_pt=[c_pt c_pt(n)];
x=x+1;
end;
end;
if(c_pt(n)-1>=1)
if(f(r_pt(n),c_pt(n)-1)==1)
r_pt=[r_pt r_pt(n)];
c_pt=[c_pt c_pt(n)-1];
x=x+1;
end;
end;
if(c_pt(n)+1<=col)
if(f(r_pt(n),c_pt(n)+1)==1)
r_pt=[r_pt r_pt(n)];
c_pt=[c_pt c_pt(n)+1];
x=x+1;
end;
end;
if(r_pt(n)-1>=1)
if(f(r_pt(n)-1,c_pt(n))==1)
r_pt=[r_pt r_pt(n)-1];
c_pt=[c_pt c_pt(n)];
x=x+1;
end;
end;
end;
if(n>=x)
break;
end;
n=n+1;
end;
y1=min(r_pt);
y2=max(r_pt);
x1=min(c_pt);
x2=max(c_pt);
a1=g(min(r_pt):max(r_pt),min(c_pt):max(c_pt));
f1=d(min(r_pt):max(r_pt),min(c_pt):max(c_pt));
[ra ca]=size(a1);
| if(n>=50)|
b1=bwlabel(a1);
ss=regionprops(b1,'euler number');
sss=struct2array(ss);
sss=min(sss);
sss_mat=[sss_mat sss];
if(sss<ss_prev && sss<0 && ca <=190 && ra<=60 && ca>=50 && ra >=15 && mean(mean(f1))<=220)
x_cor1=x1;
y_cor1=y1;
x_cor2=x2;
y_cor2=y2;
ss_prev=sss;
end;
label=label+1;
else
g(r_pt,c_pt)=0;
end;
end;
x=1;
n=1;
it=1;
end;
end;
if(exist('y_cor1')==1)
d(y_cor1:y_cor1+2,x_cor1:x_cor2)=255;
d(y_cor2:y_cor2+2,x_cor1:x_cor2)=255;
d(y_cor1:y_cor2,x_cor1:x_cor1+2)=255;
d(y_cor1:y_cor2,x_cor2:x_cor2+2)=255;
end;
% Segmented licence plate image
d=mat2gray(d);
lp=d(y_cor1:y_cor2,x_cor1:x_cor2);
%%% 2. Character Segmentation
%License plate image, characters of wcich are to be segmented
lp1 = d(y_cor1:y_cor2,x_cor1:x_cor2);
[rl cl] = size(lp1);
% Median Filtering
lp = medfilt2(lp1,[3 3]);
% Contrast Enhancement
lpf = imadjust(lp,stretchlim(lp,[0.1 0.5]));
%creating output image matrix
output= zeros(rl,cl);
% Window for local threshold operation
dis = round(cl/7);
% Local threshold operation
for i=1:dis:cl
if(i+dis-1<=cl)
t=threshcal(lpf(:,i:i+dis-1),a);
for i=1:dis:cl
if(i+dis-1<=cl)
t=threshcal(lpf(:,i:i+dis-1),a);
output(:,i:i+dis-1)=lpf(:,i:i+dis-1)<=t;
else
t=threshcal(lpf(:,i:cl),a);
for z1=2:rl-1
for z2=i+5:cl-5
if(mean(mean(lpf(z1-1:z1+1,z2-5:z2+5)))<=t)
output(z1,z2)=1;
end;
end;
end;
output(:,i:cl)=lpf(:,i:cl)<=t;
end;
end;
end;
end;
% Structuring element for erosion operation
se = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
output = output - imerode(output,se);
[of lab lpdet] = reggrowl(logical(output),number);
% Segmented characters
lpdet = logical(lpdet);
% Character Recognition
% output String giving licence plate information
lpstr=[];
for i= 1:lab-1
R = lpdet(:,st
t+9);
st = st+10;
b = bwlabel®;
% Feature extraction
ar = struct2array(regionprops(b,'area'));
or = struct2aarray(regionprops(b,'orientation'))/90;
eu = struct2array(regionprops(b,'eulernumber'))/10;
pe = struct2array(regionprops(b,'perimeter'));
mi = struct2array(regionprops(b,'minoraxislength'));
ma = struct2array(regionprops(b,'majoraxislength'));
temp = logical®;
% Reflection X and Y coefficient determination
v1 = temp;
v1(:,6:10)=flipdim(temp(:,1:5),2);
vx = (v1 + temp)/2;
vx = vx>=0.5;
xcoef = sum(sum(temp),2)/sum(sum(vx),2);
v2 = temp;
v2(1:12,
= flipdim(temp(13:24,
,1);
vy = (v2 + temp)/2;
vy = vy >= 0.5;
ycoef = sum(sum(temp),2)/sum(sum(vy),2);
ed = struct2array(regionprops(b,'equivdiameter'))/100;
[val pos] = max(fa);
vcoeff = pe(pos)/ar(pos);
mcoeff = ed(pos);
Rp = [xcoef/ycoef;pe(pos)/ar(pos);mi(pos)/ma(pos)];
answer=find(compet(A2)==1);
if(i<=numel(lpnum))
if(alphamat(answer)==lpnum(i))
numrc = numrc+1;
else
answ = find(alphamat==lpnum(i));
err(answ) = err(answ) + 1;
end;
end;
lpstr = [lpstr alphamat(answer)];
end;
numc = numc + numel(lpnum);
if(strcmp(lpstr,lpnum)==1)
tr = tr + 1;
sr = strcat(num2str(num),'/',num2str(1),'//');
casep = [casep sr];
else
fr = fr +1;
sr = strcat(num2str(num),'/',num2str(1),'/',num2str(answer),'//');
casen = [casen sr];
end;
%% Now your code is a little more clear....