El programa de reconocimiento de placas de vehículos “ENSAYO”, se realizó en Matlab 7.1 y se utilizaron algunos algoritmos de procesamiento digital de imágenes incluidos en Matlab’s Image Processing Toolbox v 4.2.
%ENSAYO.m
close all
clear all
clc
%LECTURA DE IMAGEN
I= imread('car (29).jpg');
ImPlaca = DetePlacaHough(I);
if ImPlaca == 0
error('no se encontro la placa')
end
%SEGMENTACION
placa = ImPlaca;
angle = angulo(placa);%calculo del angulo de inclinacion
placares = restauracion2(placa, angle);
placabw = umbralizacion(placares);
%garantiza que el contenido de 6 caracteres
placa = filtrado2(placabw);
%funcion que separa los caracteres por componentes conec
caracterres = separaCarateres(placa);
%RECONOCIMIENTO
CaracPro = zonificacion(caracterres);%Zonificación, vector de caracteristicas
NumeroPlaca = reconocimiento(CaracPro)
IMAGEN DE ENTRADA:
Lectura de una imagen desde un banco de imágenes.
%LECTURA DE IMAGEN
I= imread('car (29).jpg');
Para localizar la placa del vehículo dentro de la imagen, primeramente se pasa la imagen original a escala de grises y se recorta tanto vertical como horizontalmente porque se supone que la placa se encuentra ubicada en el centro de la imagen.
%Funcion principal que encuentra las coordenadas de la placa; utilizando
%la transformada de Hough
function Irec = DetePlacaHough(I)
Ig=I(:,:,1); % para obtener una sola matrix de la imagen
%[alto ancho] = size(I)
%I = I(380:(alto-300), 380:(alto-200));
[alto ancho] = size(Ig); % se recorta la placa suponiendo que la placa se
%encuentra en el centro
VeCorte = ceil([ancho*0.20 alto*0.23 ancho*0.61 alto*0.55]);
I = imcrop(Ig, VeCorte);
Ir=imresize(I,0.6); %[280 280 alto-200 (alto-400)]
% se redimenciona la 60%

Para la detección de bordes se utilizó el método de canny y se identificaron las líneas verticales del contorno de la placa mediante un filtro.
%METODO DE EDGE CANNY
It= edge(Ir, 'canny',[0.1 0.5],0.6); %deteccion de bordes con Canny
%PARA LAS LINEAS VERTICALES APLICANDO UN FILTRO
h = [-1 1];
I = imfilter(It,h);
I = bwareaopen(I,20); % Se eliminan pequeños fragmentos
I = I(6:end-6,6:end-6);% para evitar posibles lineas en los limites de la imagen
iMAGEN 3
Mediante la transformada de se Hough se localizaron con precisión las coordenadas de las líneas que conforman el contorno de la placa y poder extraer en otra imagen solamente el área que se requiere.
numsearch = 0;
%contador de el numero de busquedas, cambiando de detector de bordes
done = false;
while ~ done
[h theta,rho]=houghmv(I,1,1);
[r,c] = houghpeaksm(h,4);
% h:transformada de hough, 4 val: numero de picos
linesv = houghlinesm(I, theta, rho, r,c , 20, 6);
% r , c son las coordendas
% de las filas, columnas de los picos identificadso
[lvp] = findlines(linesv);
%posicion de la estructura linesv donde se encuentran las lines verticales
%se ncuentra la longitud de la placa para calcular la relacion ancho
%alto, utilizando los puntos inicial y final de las lineas encontradas,
%donde lvp.lin contiene los pares de las posibles lineas verticales
c1 = ceil(linesv(lvp(1).lin(1)).point2(1));%
c2 = ceil(linesv(lvp(1).lin(1)).point1(1));
c3 = min(ceil(linesv(lvp(1).lin(1)).point1(2)),ceil(linesv(lvp(1).lin(1)).point2(2)));
c4 = max(ceil(linesv(lvp(1).lin(2)).point1(2)),ceil(linesv(lvp(1).lin(2)).point2(2)));
% si los puntos vienen invertidos se corrigen
if c1 > c2
ctem = c1;
c1 = c2;
c2 = ctem;
end
if c4 > c3
ctem = c3;
c3 = c4;
c4 = ctem;
end
% si cumple con la relacion ancho/alto finaliza la busqueda
if ((c3-c4)/(c2-c1) <= 1.2*(165/70)) & ((c3-c4)/(c2-c1) >= 0.75*(165/70));
done = true;
Irec = Ir(c1-30:c2+37,c4-5:c3+5);% se recorta la placa
%Irec = Ig(c1:c2,c4:c3);
numsearch == inf;
else
% si no cumple con la relacion se utiliza otra tecnica para la
%deteccón de bordes y se hace la busqueda nuevamente
if numsearch ==5
% si el numero de busquedas es 4 se finaliza con fracaso en la busqueda
error('placa no detectada')
numsearch == inf;
end
%++ DETECTORES DE BORDES ++
if numsearch == 4;
numsearch = numsearch + 1;
I = I(8:end-8,8:end-8);
I= edge(Ig, 'canny');
I = bwareaopen(I,20);
h = [-1 1];
I = imfilter(I,h);
I = bwareaopen(I,20);
I = I(8:end-8,8:end-8);
end
if numsearch == 3;
numsearch = numsearch + 1;
I = bordes(Ig);
I = bwareaopen(I,20);
h = [-1 1];
I = imfilter(I,h);
I = bwareaopen(I,20);
I = I(4:end-4,4:end-4);
end
if numsearch == 2;
numsearch = numsearch + 1;
I = edge(Ig, 'sobel',[],'vertical');% utilizando sobel
I = bwareaopen(I,20);
I = I(15:end-15,15:end-15);
end
if numsearch == 1;
numsearch = numsearch + 1;
%Ig=fliplr(Ig);
I = bordes(Ig);
I = bwareaopen(I,20);
I = I(10:end-10,10:end-10);
end
if numsearch == 0;
numsearch = numsearch + 1;
end
end
end
end
%Funcion que corrige la imagen de la placa de acuerdo al angulo de
%inclinacion, recibido en angulo
%Entrada: imagen de la placa, y el angulo de inclinación
%Salida: imagen de la placa corregida
function placa = restauracion2(placa , angulo)
[m n] = size(placa);
%n: ancho; m: alto angulo
switch angulo
case {2,88}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 1*n 0.0198*m; 0.0194*n 0.89*m; n m];
case {3,4,87,86}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.98*n 0.0598*m; 0.0394*n 0.83*m; n m];
case {5,85}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.07*m; 0.04*n 0.83*m; n m];
case {6,84}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.03*m; 0.02*n 0.9*m; n m];
case {7,83}
puntosbase = [10 1; n 1; 1 m; n m];
puntosentrada = [1 1;0.99*n 0.12*m; 0.025*n 0.8*m; n m];
case {8,9,80,82}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.13*m; 0.03*n 0.78*m; n m];
case {9,10,11,79,80,81}
puntosbase = [1 1; n 1; 1 m; n m];
puntosentrada = [1 1; 0.99*n 0.18*m; 0.03*n 0.71*m; n m];
case {12,13,14,15,16,75,76,77,78}
puntosbase = [1 1; n 1; 1 m-10; n m-10];
puntosentrada = [1 1; 0.99*n 0.20*m; 0.057*n 0.72*m; n m];
otherwise
return;
end
tform = cp2tform(puntosentrada, puntosbase, 'projective');placa = imtransform(placa, tform, 'xdata', [1 n], 'ydata', [1 m], 'size',size(placa), 'fill', 128);
Programa que digitaliza la imagen y detecta seis objetos mediante la técnica de análisis de componentes conectados.
%funcion que encuentra y separa los caracateres utilizando etiquetado de
%componetes conectados
function caracNor = separaCarateres(placa)
placa = ~placa;
[bwEtiq caraEncon] = bwlabel(placa);
carac = cell(1,6);
carac(1) = {bwEtiq == 1};
carac(2) = {bwEtiq == 2};
carac(3) = {bwEtiq == 3};
carac(4) = {bwEtiq == 4};
carac(5) = {bwEtiq == 5};
carac(6) = {bwEtiq == 6};
for g = 1:6
[I,J] = find(carac{g} == 1);
carac{g} = carac{g}(min(I):max(I),min(J):max(J));
if g==6
[alto ancho] = size(carac{g});
if alto/ancho < sumhoriz =" sum(carac{g});" posbus =" ceil(alto/2);" vectbus =" sumHoriz(PosBus:end);" i="1:length(VectBus)-5"> 6
carac{g} = carac{g}(:,1:PosBus+i);
break
end
end
end
end
caracNor{g} = imresize(carac{g},[60,25],'bilinear');
caracNor{g} = ~bwareaopen(~caracNor{g},14);
end
Este programa realiza el reconocimiento de cada objeto y lo representa como carácter en la ventana de comandos de Matlab.
function NumeroPlaca = reconocimiento(CaracPro)
for i = 1:6
carac = CaracPro{i};
try
ia=i;
load thetaexper
%contiene los datos de los vectores de caracteristicas de letras ya aprendidos
ThetaLetra=thetaexper;
load thetaexpernume
%contiene los datos de los vectores de caracteristicas de letras ya aprendidos
ThetaNume=thetaexpernume;
i=ia;
catch
end
LetNum = VecinoHo(carac,i,ThetaLetra,ThetaNume);
%calculo del vecino
if i > 3
if LetNum == 10
LetNum = 0;
end
end
if i < letn =" char(LetNum*90);" letn =" char(65+" letn =" char(49+" letn =" char(48">

1 comentario:
excelente ayudame con le codigo como podriamos hablar
Publicar un comentario