Reconocimiento De Firma Manuscritas - Matlab
Enviado por omar.regino • 12 de Mayo de 2014 • 1.689 Palabras (7 Páginas) • 758 Visitas
Objetivo
El objetivo principal es el diseño y elaboración de un programa en Matlab el cual permita el reconocimiento de firmas y su clasificación, a partir de una imagen, tomada mediante la cámara de una lap top, a una hoja blanca en la cual se encuentran cuatro firmas distintas realizadas con un plumón negro.
Introducción
Para entender lo que el programa realizará debemos de tener en cuenta algunos conceptos, como lo son los siguientes:
Umbralización
Es aquella que permite etiquetar la imagen resultante de los procesos de filtrado del ruido y realce de los bordes a fin de obtener los píxels en los que se produce un borde. Los principales problemas que se presentan en la umbralización son los siguientes:
Pérdidas de conectividad entre los píxels que forman parte del borde, bien por la existencia de bordes poco definidos, por la utilización de fuertes algoritmos de filtrado de ruido, o por condiciones de umbralización muy exigentes.
Generación de bordes de anchura múltiple por la existencia de bordes muy difuminados después del filtrado del ruido, o por condiciones de umbralización poco exigentes.
Existencia de falsos bordes, preferentemente por la existencia de ruido.
Histograma
Es una representación gráfica de una variable en forma de barras, donde la superficie de cada barra es proporcional a la frecuencia de los valores representados.
En el eje vertical se representan las frecuencias, y en el eje horizontal los valores de las variables, normalmente señalando las marcas de clase, es decir, la mitad del intervalo en el que están agrupados los datos.
Segmentación
Es el proceso de dividir una imagen digital en varias partes u objetos y su objetivo principal es simplificar y/o cambiar la representación de una imagen en otra más significativa y más fácil de analizar, se usa tanto para localizar objetos como para encontrar los límites de estos dentro de una imagen.
Programa
A continuación se presenta el programa, una pequeña explicación de algunas de las partes del mismo y sus ilustraciones correspondientes.
Fase de Entrenamiento
Primero lee la imagen desde un archivo, si la imagen es RGB, la convierte a escala de grises, en caso contrario sólo toma la imagen tal y como se lee en escala de grises.
imagen=imread('test2.jpg');
if size(imagen,3)==3
gris=rgb2gray(imagen);
else
gris=imagen;
end
Segmentación
Ya que se tiene la imagen en escala de grises, se convierte a imagen binaria, ya que asi es mas facil manipularla, despues de eso se hace uso de la funcion strel para analizar dicha imagen en busca de lineas que contengan el valor de 1.
Im_bin=im2bw(gris,0.3);
Im_bin2=not(Im_bin);
SE=strel('line',10,0);
Im_erode=imerode(Im_bin2,SE);
Im_dilate=imdilate(Im_erode,SE);
Im_label=bwlabel(Im_dilate,8);
n=max(max(Im_label));
Lo siguiente sólo indica al programa, de acuerdo a la imagen que lee, que elimine los picos y los huecos respectivamente.
bina=bwmorph(Im_label,'open');
bina=bwmorph(Im_label,'close');
Aqui la variable "L" toma el valor de la imagen binaria ya segmentada con un total de 7 objetos contenidos y despues es mostrada, luego la variable stats toma el valor de las caracteristicas de cada objeto por separado, tales como su area, ejeMayor, ejeMenor, etc., estos valores los obtiene la funcion regionprops().
L=bwlabel(bina);
imshow(L)
stats = regionprops(L,'all');
TY = zeros(n,1);
Extraccion de Caracteristicas
El for indica que en el primer objeto que se detecte, en este caso la primer firma, se obtengan los valores de area, ejeMayor, ejeMenor, etc., indicándole así a que firma pertenece, si a la F1, F2, F3, F4, en este caso, pertenece a la primer firma.
for i = 1:n
disp(sprintf('%3d) EjeMayor=%6.2f EjeMenor = %6.2fd Area =%5d',i,stats(i).MajorAxisLength,stats(i).MinorAxisLength,stats(i).Area));
figure(3)
imshow(L==i)
TY(i) = input('Ingrese F1=1 F2=2 F3=3 F4=4)');
end
En esta parte en donde la variable area, axis1, axis0 toman el valor de la caracateristica correspondiente y le indica que si el valor que ingresaste es 1, entonces las caracteristicas dadas del objetos se van a referenciar a la primer firma, en pocas palabras, se le indica al programa que características pertenecen a cada firma.
area = [stats.Area]';
axis1 = [stats.MajorAxisLength]';
axis0 = [stats.MinorAxisLength]';
axisR = axis0./axis1;
iF1 = find(TY==1);
iF2 = find(TY==2);
iF3 = find(TY==3);
iF4 = find(TY==4);
Lo siguiente nos va a ayudar a graficar la razon de ejes y el area de cada firma y le asignará un identificador a cada una de ellas.
figure(4)
clf
plot(axisR(iF1),area(iF1),'rx')
hold on
plot(axisR(iF2),area(iF2),'*')
hold on
plot(axisR(iF3),area(iF3),'+')
hold on
plot(axisR(iF4),area(iF4),'O')
xlabel('Razon de Ejes');
ylabel('area')
legend('F1','F2','F3','F4')
axis([0 1 0 150000]);
Con la presentación de las características extraidas concluye la Fase de entrenamiento.
Fase de Prueba
Con el siguiente código el programa obtendrá la imagen desde la cámara web.
disp('Parte 2: Prueba (presione enter)');
pause
close all
cam=imaqhwinfo('winvideo',1);
video=videoinput('winvideo',1, 'YUY2_640x480');
set(video, 'ReturnedColorSpace', 'rgb');
preview(video)
disp('Coloque la imagen frente a la camara depues presione enter)');
pause
imrgb=getsnapshot(video);
imwrite(imrgb, 'test1.jpg');
I = imread('test1.jpg');
[N,M] = size(I);
figure(1)
imshow(I,[]);
Una vez obtenida la imagen del sensor (cámara), se tendrá que segmentar, el proceso de segmentación será el mismo que se utilizó en la Fase de Entrenamiento.
Se obtienen los valores
...