INFORME FINAL
OBJETIVO:
Utilizar tcnicas de procesamiento de imgenes para solucionar un
problema especfico, el cual ser la creacin de un sistema reconocedor
automtico de placas que podr ser instalado a la entrada de un
parqueadero.
DESARROLLO DEL PROYECTO
Restricciones: Las imgenes tomadas pueden ser de cualquier
tamao, pero la placa debe cumplir con las siguientes condiciones de
150 a 210 pixels y de 50 a 110 pixels de ancho. Ademas, las fotos
tomadas de la placa no pueden estar inclinadas.
Procedimiento: Inicialmente se necesita diferenciar si la imagen est
en escala de grises o en RGB para poder hacer la conversin
correspondiente. Se utiliza el siguiente cdigo:
I=imread('C:\foto104.jpg');
info=imfinfo('C:\foto104.jpg');
if info.ColorType=='truecolor'
I=rgb2gray(I);
else
I=I;
End
Una vez realizado esto se recorta la imagen para poder eliminar zonas
en las que no existe informacin relevante a la placa como los bordes
superiores y externos, se muestra en la figura 1. Se observaron las fotos
para determinar cual es el rango aproximado que se puede cortar.
Creo una variable que me dice de que color era el ultimo grupo que guarde
de esta forma se que la cola del final de la fila pertenece al otro color
la variable se llama ultimoColor, si vale cero fue oscuro y si vale uno
fue claro.
numOscuros=0;
numClaros=0;
oscuros=0;
claros=0;
cont=0;
acum=0;
%
%
%
%
if imagen(1,1)<(max(max(imagen))/2)
% Como es oscuro pongo que el ultimo color fue claro.
ultimoColor=1;
else
% Como es claro pongo que el ultimo color fue oscuro.
ultimoColor=0;
end
for i=1:filasImagen
if ultimoColor==0
numClaros=numClaros+cont;
cont=0;
claros=claros+acum;
acum=0;
else
numOscuros=numOscuros+cont;
cont=0;
oscuros=oscuros+acum;
acum=0;
end
for j=1:columnasImagen
if gradiente(i,j)==0
cont=cont+1;
acum=acum+imagen(i,j);
else
if gradiente(i,j)==-1
numOscuros=numOscuros+cont;
cont=1;
oscuros=oscuros+acum;
acum=imagen(i,j);
ultimoColor=0;
else
numClaros=numClaros+cont;
cont=1;
claros=claros+acum;
acum=imagen(i,j);
ultimoColor=1;
end
end
end
end
if ultimoColor==0
numClaros=numClaros+cont;
claros=claros+acum;
else
numOscuros=numOscuros+cont;
oscuros=oscuros+acum;
end
% Media de los claros.
mediaClaros=claros/numClaros;
[R C]=size(I);
cropsize=[(R*0.25) (C*0.15) (C*0.625) (R*0.6)];
Ic=imcrop(I,cropsize);
fondo innecesario
figure; imshow(Ic)
Id=double(Ic); [R C]=size(Ic)
operaciones
I2=sobel(Id,R,C,2.5);
umbral=umbraloptimo(Id,R,C,I2);
Figura 2.
Figura 3. Umbral
Top-Hat
Figura 6. Dilatacin
%Crea regiones
%Estadisticas de las regiones
%Diferencia las regiones con Area >
%Crea una imagen con dichas regiones
L=bwlabel(IM6);
stats = regionprops(L,'all');
E=stats(1).BoundingBox;
X=E.*[[1] [0] [0] [0]]; X=max(X);
Y=E.*[[0] [1] [0] [0]]; Y=max(Y);
W=E.*[[0] [0] [1] [0]]; W=max(W)
H=E.*[[0] [0] [0] [1]]; H=max(H);
Corte=[X Y W H];
IMF=imcrop(Ic,Corte);
figure; imshow(IMF)
%Crea regiones
%Estadisticas de las regiones
%Toma tamao de la region
%Determina eje X esquina superior Izq. Placa
%Determina eje Y esquina superior Der. Placa
%Determina Ancho Placa
%Determina Altura placa
%Determina coordenadas de corte
%Realiza el corte
%Muestra imagen de la zona de la placa
%Muestra Imagen
FIGURA 9
FIGURA 8
FIGURA 10
El siguiente paso es recortar cada carcter por separado, para esto
utilizamos el comando bwlabel para que nos divida la imagen en
regiones y poder determinar el rea que posee cada regin (que en este
caso nos demarcar el rea ocupada por el carcter) y poder recortarlo
con el comando imcrop, obteniendo cada carcter en una variable por
separado. Luego, a cada carcter se le realiza un nuevo
X3=max(X3);
Y3=max(Y3);
W3=max(W3);
H3=max(H3);
X3=max(X3);
Y3=max(Y3);
W3=max(W3);
H3=max(H3);
X3=max(X3);
Y3=max(Y3);
W3=max(W3);
H3=max(H3);
figure; imshow(L4b)
E3=stats(5).BoundingBox;
caracter
X3=E3.*[[1] [0] [0] [0]];
Izq. Placa
Y3=E3.*[[0] [1] [0] [0]];
Der. Placa
W3=E3.*[[0] [0] [1] [0]];
H3=E3.*[[0] [0] [0] [1]];
Corte3=[X3 Y3 W3 H3];
L5=imcrop(C2,Corte3);
L5b=imresize(L5,[42 24]);
L5b=L5b>150;
figure; imshow(L5b)
E3=stats(6).BoundingBox;
caracter
X3=E3.*[[1] [0] [0] [0]];
Izq. Placa
Y3=E3.*[[0] [1] [0] [0]];
Der. Placa
W3=E3.*[[0] [0] [1] [0]];
H3=E3.*[[0] [0] [0] [1]];
Corte3=[X3 Y3 W3 H3];
L6=imcrop(C2,Corte3);
L6b=imresize(L6,[42 24]);
L6b=L6b>150;
figure; imshow(L6b)
Y3=max(Y3);
W3=max(W3);
H3=max(H3);
X3=max(X3);
Y3=max(Y3);
W3=max(W3);
H3=max(H3);
b=imread('C:\MATLAB6p5\work\B.bmp');
d=imread('C:\MATLAB6p5\work\D.bmp');
f=imread('C:\MATLAB6p5\work\F.bmp');
h=imread('C:\MATLAB6p5\work\H.bmp');
j=imread('C:\MATLAB6p5\work\J.bmp');
l=imread('C:\MATLAB6p5\work\L.bmp');
m=imread('C:\MATLAB6p5\work\M.bmp'); n=imread('C:\MATLAB6p5\work\N.bmp');
o=imread('C:\MATLAB6p5\work\O.bmp'); p=imread('C:\MATLAB6p5\work\P.bmp');
q=imread('C:\MATLAB6p5\work\Q.bmp'); r=imread('C:\MATLAB6p5\work\R.bmp');
s=imread('C:\MATLAB6p5\work\S.bmp'); t=imread('C:\MATLAB6p5\work\T.bmp');
u=imread('C:\MATLAB6p5\work\U.bmp'); v=imread('C:\MATLAB6p5\work\V.bmp');
w=imread('C:\MATLAB6p5\work\W.bmp'); x=imread('C:\MATLAB6p5\work\X.bmp');
y=imread('C:\MATLAB6p5\work\Y.bmp'); z=imread('C:\MATLAB6p5\work\Z.bmp');
uno=imread('C:\MATLAB6p5\work\1.bmp'); dos=imread('C:\MATLAB6p5\work\2.bmp');
tres=imread('C:\MATLAB6p5\work\3.bmp'); cuatro=imread('C:\MATLAB6p5\work\4.bmp');
cinco=imread('C:\MATLAB6p5\work\5.bmp'); seis=imread('C:\MATLAB6p5\work\6.bmp');
siete=imread('C:\MATLAB6p5\work\7.bmp'); ocho=imread('C:\MATLAB6p5\work\8.bmp');
nueve=imread('C:\MATLAB6p5\work\9.bmp'); cero=imread('C:\MATLAB6p5\work\0.bmp');
alfabeto=[[a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] [l] [m] [n] [o] [p] [q] [r] [s] [t]
[u] [v] [w] [x] [y] [z]];
numeral=[[uno] [dos] [tres] [cuatro] [cinco] [seis] [siete] [ocho] [nueve] [cero]];
pos=1;
temp=0;
while pos<11
temp=numero{1,pos};
co=corr2(temp,plc);
num(fila,pos)=co;
pos=pos+1;
end
fila=fila+1;
posp=posp+1;
end
end
for ind = 1:3
maxs=max(num,[],2);
[posx posy]=find(num==maxs(ind,1));
nums(ind)=posy
ind=ind+1;
end
close all
mal='a';
ltr=1;
lt=1;
while ltr < 4
while lt < 4
if letras(ltr)== 1
mal(lt)='A'
elseif letras(ltr)
mal(lt)='B'
elseif letras(ltr)
mal(lt)='C'
elseif letras(ltr)
mal(lt)='D'
elseif letras(ltr)
mal(lt)='E'
elseif letras(ltr)
mal(lt)='F'
elseif letras(ltr)
mal(lt)='G'
elseif letras(ltr)
mal(lt)='H'
elseif letras(ltr)
mal(lt)='I'
elseif letras(ltr)
mal(lt)='J'
elseif letras(ltr)
mal(lt)='K'
elseif letras(ltr)
mal(lt)='L'
elseif letras(ltr)
mal(lt)='M'
elseif letras(ltr)
mal(lt)='N'
elseif letras(ltr)
mal(lt)='O'
elseif letras(ltr)
mal(lt)='P'
elseif letras(ltr)
mal(lt)='Q'
elseif letras(ltr)
mal(lt)='R'
== 2
== 3
== 4
== 5
== 6
== 7
== 8
== 9
== 10
== 11
== 12
== 13
== 14
== 15
== 16
== 17
== 18
elseif letras(ltr) ==
mal(lt)='S'
elseif letras(ltr) ==
mal(lt)='T'
elseif letras(ltr) ==
mal(lt)='U'
elseif letras(ltr) ==
mal(lt)='V'
elseif letras(ltr) ==
mal(lt)='W'
elseif letras(ltr) ==
mal(lt)='X'
elseif letras(ltr) ==
mal(lt)='Y'
elseif letras(ltr) ==
mal(lt)='Z'
else
mal(lt)='Paila'
end
lt=lt+1;
ltr=ltr+1;
19
20
21
22
23
24
25
end
26
end
nmr=1;
man='1';
nm=1;
while nmr < 4
while nm < 4
if nums(nmr)== 1
man(nm)='1'
elseif nums(nmr) ==
man(nm)='2'
elseif nums(nmr) ==
man(nm)='3'
elseif nums(nmr) ==
man(nm)='4'
elseif nums(nmr) ==
man(nm)='5'
elseif nums(nmr) ==
man(nm)='6'
elseif nums(nmr) ==
man(nm)='7'
elseif nums(nmr) ==
man(nm)='8'
elseif nums(nmr) ==
man(nm)='9'
elseif nums(nmr) ==
man(nm)='0'
else
disp('Paila')
end
nm=nm+1;
nmr=nmr+1;
end
end
plate=horzcat(mal,man);
disp(plate)
2
3
4
5
6
7
8
9
10
CONCLUSIONES