error in template matching while doing character recognition

2 views (last 30 days)
I am using template matching in character extraction and getting error output. Appologises for poor presentation of coding i cannot attach the function code as file since my attachment count reaches the limit. Hope reader can tolerate this difficulty. Refer the link for input image. https://www.mathworks.com/matlabcentral/answers/uploaded_files/101640/2222.jpg
function [strPlate] = Recognition(Objects,ImgChar)
I=imread('2222.jpg');
[ImgPlate] = LocationPlate(I);
[Objects,ImgChar]=Segmentation(ImgPlate);
N=struct('Image',{});
numbers={'q0','q1','sign','0','1','2','3','4','5'};
N(1).Image=imresize(im2bw(uint8(imread('untitled0.bmp'))),[100 100]);
N(2).Image=imresize(im2bw(uint8(imread('untitled1.bmp'))),[100 100]);
N(3).Image=imresize(im2bw(uint8(imread('untitled2.bmp'))),[100 100]);
N(4).Image=imresize(im2bw(uint8(imread('untitled3.bmp'))),[100 100]);
N(5).Image=imresize(im2bw(uint8(imread('untitled4.bmp'))),[100 100]);
N(6).Image=imresize(im2bw(uint8(imread('untitled5.bmp'))),[100 100]);
N(7).Image=imresize(im2bw(uint8(imread('sign.bmp'))),[100 100]);
if Objects==9 % Number of characters segmented from the plate
strPlate=[];
for i=1:Objects
char=ImgChar(:,:,i);
list_corr=[];
for j=1:7
corr=corr2(N(j).Image,char);
list_corr=[list_corr corr];
end
f=max(list_corr);
maxcorr=find(list_corr==f);
strPlate=[strPlate numbers(maxcorr)];
end
end
Code for Locationplate:
function [ImgPlate] = LocationPlate(I)
%%Cutting and resizing the original image %%
% I=imread('2222.jpg');
% figure,imshow(I);
[rows columns]=size(I);
columns=columns/3;
xmin=round(0.20*rows);
ymin=round(0.20*columns);
width=round((0.85*columns)-(0.10*columns));
height=round((0.85*rows)-(0.15*rows));
Io=imcrop(I,[xmin ymin width height]);
Io=imresize(Io,[480 640]);
Io=rgb2gray(Io);
Io=imadjust(Io);
%%Image processing to focus the area of number plate %%
%%Smooth edges and contours to delete characters.
%%Subtracting the original image to obtain the information
%%previously deleted and thus stay with the characters.
%%Select the elements with a higher level of 85.
%%Pass a mask to the image to remove excess information common to
%%all images.
se=strel('rectangle',[6 30]);
Ic=imclose(Io,se);
Ic=imadjust(Ic);
tophat=Ic-Io;
Ibw=(tophat>85);
% Ibw=Ibw1 & im2bw(imread('marco.bmp'));
% Ibw=Ibw1&&im2bw(I);r
%%Remove the related elements with fewer than 70 pixels %%
%%Remove objects that are not plate %%
plate= bwlabel(Ibw,4);
obj= max(max(plate));
dim1 = regionprops(plate, 'area')';
dim=[dim1.Area];
dim(find(dim<70))=0;
for i=1:obj
index=find(plate==i);
if dim(i)==0
plate(index)=0;
else
plate(index)=1;
end
end
CC=bwconncomp(plate);
P=regionprops(CC,'all');
[rp cp]=size(plate);
for i=1:CC.NumObjects
if P(i).MajorAxisLength>(2*cp/3)
plate(P(i).PixelIdxList(:,1))=0;
end
end
%%Remove objects that are not candidates for plate %%
se3=strel('rectangle',[30 70]);
r2=imclose(plate,se3);
se2=strel('rectangle',[5 30]);
r=imdilate(r2,se2);
CC=bwconncomp(r);
P=regionprops(CC,'all');
for i=1:CC.NumObjects
if P(i).MajorAxisLength>(2*cp/3)
r(P(i).PixelIdxList(:,1))=0;
end
end
%%select the largest connected component after preprocessing, the
%%plate
plate1= bwlabel(r,4);
dim2= regionprops(plate1, 'area')';
dim1=[dim2.Area];
f=max(dim1);
indMax=find(dim1==f);
plate1(find(plate1~=indMax))=0;
%%cutting of original image %%
[cuty, cutx] = find( plate1 > 0);
up = min(cuty);
down = max(cuty);
left = min(cutx);
right = max(cutx);
img_cut_v = Io(up:down,:,:);
img_cut_h = img_cut_v(:,left:right,:);
ImgPlate = img_cut_h;
%%different mask for location plate %%
[r c]=size(ImgPlate);
if r<25 || r>65
[rows columns]=size(I);
columns=columns/3;
xmin=round(0.20*rows);
ymin=round(0.20*columns);
width=round((0.85*columns)-(0.10*columns));
height=round((0.85*rows)-(0.15*rows));
Io=imcrop(I,[xmin ymin width height]);
Io=imresize(Io,[480 640]);
Io=rgb2gray(Io);
Io=imadjust(Io);
se=strel('rectangle',[6 30]);
Ic=imclose(Io,se);
Ic=imadjust(Ic);
tophat=Ic-Io;
Ibw1=(tophat>85);
mask=zeros(480,640);
for i=40:370
for j=40:575
mask(i,j)=1;
end
end
Ibw=Ibw1 & im2bw(mask);
plate= bwlabel(Ibw,4);
obj= max(max(plate));
dim1 = regionprops(plate, 'area')';
dim=[dim1.Area];
dim(find(dim<70))=0;
for i=1:obj
index=find(plate==i);
if dim(i)==0
plate(index)=0;
else
plate(index)=1;
end
end
CC=bwconncomp(plate);
P=regionprops(CC,'all');
[rp cp]=size(plate);
for i=1:CC.NumObjects
if P(i).MajorAxisLength>(cp/3)
plate(P(i).PixelIdxList(:,1))=0;
end
end
se3=strel('rectangle',[30 70])
r2=imclose(plate,se3);
se2=strel('rectangle',[5 30]);
r=imdilate(r2,se2);
plate1= bwlabel(r,4);
dim2= regionprops(plate1, 'area')';
dim1=[dim2.Area];
f=max(dim1);
indMax=find(dim1==f);
plate1(find(plate1~=indMax))=0;
[cuty, cutx] = find( plate1 > 0);
up = min(cuty);
down = max(cuty);
left = min(cutx);
right = max(cutx);
img_cut_v = Io(up:down,:,:);
img_cut_h = img_cut_v(:,left:right,:);
ImgPlate = img_cut_h;
end
%%Representation %%
% figure(1);
% imshow(I);
% subplot(2,2,1);imshow(I);
% subplot(2,2,2);imshow(Ic);% subplot(2,2,3);imshow(plate);
% subplot(2,2,4);imshow(plate1);
figure(2); imshow(img_cut_h);title('output location plate');
end
%code for segmentation
function [Objects,ImgChar]=Segmentation(ImgPlate)
%%Binarize the image %%
% ImgPlate=imread('ImgPlate.jpg')
level = graythresh(ImgPlate);
Ibw =(im2bw(ImgPlate,level));
%%Select the orientation of the largest object in the image.
%%Turn this angle at the picture.
%%Plate cutting to segment the characters that compose %%
Fl=bwlabel(Ibw);
Statsbf=regionprops(Fl,'all');
Flmax=find([Statsbf.Area]==max([Statsbf.Area]));
angle=Statsbf(Flmax).Orientation;
F2=imrotate(Fl,-angle);
L=bwlabel(F2);
Statsbf=regionprops(L,'all');
maxi=find([Statsbf.Area]==max([Statsbf.Area]));
BB=Statsbf(maxi).BoundingBox;
F2=imcrop(F2,[BB(1,1) BB(1,2) BB(1,3) BB(1,4)]);
% figure,imshow(F2);
%%First three and last three rows to zero.
%%First two and last two columns to zero.
%%So remove connectivity between characters and background %%
%%Remove small impurities %%
L4=not(F2);
[r c]=size(L4);
L4(1,:)=0;
L4(2,:)=0;
L4(3,:)=0;
L4(r,:)=0;
L4(r-1,:)=0;
L4(r-2,:)=0;
L4(:,1)=0;
L4(:,2)=0;
L4(:,c)=0;
L4(:,c-1)=0;
L4b=bwlabel(L4);
Stats3=regionprops(L4b,'all');
sarea3=[Stats3.Area];
G=find(sarea3<70)
for cv=1:length(G)
G1=find(L4b==G(cv));
L4(G1)=0;
end
[r c]=size(L4);
CC=bwconncomp(L4);
L=bwlabel(L4);
ind2=max(L(:,c-2));
P=regionprops(CC,'all');
%%Remove objects smaller and larger than a character %%
i=1;
if (max(P(i,1).PixelList(:,1))-min(P(i,1).PixelList(:,1)))<(c/13)
L4(CC.PixelIdxList{1,i})=0;
end
for i=1:CC.NumObjects
if (max(P(i,1).PixelList(:,1))-min(P(i,1).PixelList(:,1)))>(2*c/3)
L4(CC.PixelIdxList{1,i})=0;
end
if (max(P(i,1).PixelList(:,2))-min(P(i,1).PixelList(:,2)))<(r/3)
L4(CC.PixelIdxList{1,i})=0;
end
if (max(P(i,1).PixelList(:,1))-min(P(i,1).PixelList(:,1)))<(c/8)
L4(find(L==ind2))=0;
end
end
L4=imclose(L4,strel('disk',1));
L4=imopen(L4,strel('disk',1));
% figure(4);
imshow(L4);
L4b=bwlabel(L4);
Stats3b=regionprops(L4b,'all');
N=length(Stats3b);
while N>8
L4=imdilate(L4,strel('disk',1));
L4b=bwlabel(L4);
Stats3b=regionprops(L4b,'all');
N=length(Stats3b);
end
L4b=bwlabel(L4);
Stats3b=regionprops(L4b,'all');
ImgChar=zeros(100,100,N);
%%Dividing characters which are connected %%
%%Remove objects that have been listed as characters but are not%
%%Show every character in the correct position %%
cont=0;
cont1=0;
for i=1:N
[r1 c1]=size(Stats3b(i,1).Image);
if c1>round(c/6)
cont1=cont;
Stats3b(i,1).Image(:,round(c1/2))=0;
L5=Stats3b(i,1).Image;
CC=bwconncomp(L5);
CC1=regionprops(CC,'all');
for j=1:CC.NumObjects
[r2 c2]=size(CC1(j,1).Image);
if c2>round(c/7)
CC1(j,1).Image(:,round(c2/2))=0;
L6=CC1(j,1).Image;
LL=bwconncomp(L6);
CC2=regionprops(LL,'all');
for k=1:LL.NumObjects
CC2(k).Image=imresize(CC2(k).Image, [100 100]);
figure;imshow((CC2(k).Image))
ImgChar(:,:,i+cont1)=not(CC2(k).Image);
cont1=cont1+1;
end
cont=cont+1;
else
CC1(j).Image=imresize(CC1(j).Image, [100 100]);
figure;imshow((CC1(j).Image))
ImgChar(:,:,i+cont1)=not(CC1(j).Image);
cont1=cont1+1;
end
end
cont=cont+1;
else
Stats3b(i).Image=imresize(Stats3b(i).Image, [100 100]);
figure;imshow((Stats3b(i).Image))
if cont~=0
ImgChar(:,:,i+cont)=not(Stats3b(i).Image);
else
ImgChar(:,:,i)=not(Stats3b(i).Image);
end
end
end
%%Remove spurious %%
[x, y, Objects]=size(ImgChar);
disp(Objects);
end

Answers (0)

Categories

Find more on Images in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!