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
del celular, a una hoja blanca en la cual se encuentran cuatro firmas distintas realizadas con un
lapicero 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íxel 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('[Link]');
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 = [[Link]]';
axis1 = [[Link]]';
axis0 = [[Link]]';
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, '[Link]');
I = imread('[Link]');
[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 de los ejes y el área nuevamente por medio de la segmentación de la
imagen de prueba.
iF1 = find(th>=0.9 & area >= 560);
iF2 = find(th<=0.3 & area <= 240);
iF3 = find(th<=0.7 & th > 0.6);
iF4 = find(th<=0.7 & th > 0.6);
nF1 = length(iF1);
nF2 = length(iF2);
nF3 = length(iF3);
nF4 = length(iF4);
F1 = zeros(N,M);
F2 = zeros(N,M);
F3 = zeros(N,M);
F4 = zeros(N,M);
Clasificación
De acuerdo a lo siguiente:
Primero se obtiene el valor del área del primer objeto y los ejes del mismo.
Segundo, se indica si el área del objeto es igual a 85321, entonces se clasifica como Firma 1, en
caso contrario se validará con las otras sentencias.
Tercero, este procedimiento se repetirá con cada uno de los objetos segmentados, si cumplen con
una validacion se clasificarán.
Cuarto, lo querealizará el for, será comparar objeto por objeto de la imagen de prueba
segmentada con los rangos que obtuvimos en la fase de entrenamiento.
for i = 1:n
axE = stats (i).Area;
axR = stats(i).MinorAxisLength/stats(i).MajorAxisLength;
if(axE==85321 || axE==903)
F1(stats(i).PixelIdxList) = ones(stats(i).Area,1);
else
if (axE==49968 || axE==30580)
F2(stats(i).PixelIdxList) = ones(stats(i).Area,1);
else
if (axE==126412 || axE==814)
F3(stats(i).PixelIdxList) = ones(stats(i).Area,1);
else
if(axE==81813)
F4(stats(i).PixelIdxList) = ones(stats(i).Area,1);
end
end
end
end
figure(3)
imshow([F1;ones(10,M);F2;ones(10,M);F3;ones(10,M);F4;ones(10,M)],[])
pause(0.5)
end
A continuación se exponen algunas capturas con su breve explicación del funcionamiento del
programa.
El programa genera la primer imagen de la cual se van a obtener las firmas.
Genera también la imagen binaria.
En esta imagen determina cuantos objetos se encuentran en la misma.
Genera la imagen con la primer firma y pide que se le indique a que número de firma pertenece.
De igual manera lo hace con la segunda firma.
Genera una parte de la firma 2 ya que al pertenecer a la misma firma pero estar separadas, el
programa los toma como objetos distintos.
Otro caso en el que realiza lo mismo que en la imagen anterior.
Se presenta la tercer firma.
Ahora la cuarta firma.
Una parte correspondiente a la tercer firma.
El programa genera el histograma correspondiente.
En esta parte el programa pregunta que imagen utilizará para poder hacer la comparación.
Esta imagen muestra el orden en que se extrajeron las imágenes, la mas destacada fue la ultima y
la menos destacada fue la primera.
Se muestra ya la clasificación correcta de todas y cada una de las firmas.
Por último el programa muestra la evaluación del desempleño.
Diagrama de Flujo
Video de demostración
[Link]
Conclusiones
Por medio de el desarrollo de este programa pudimos aplicar los conocimientos obtenidos a lo
largo del curso y ver el gran alcanze que tiene este tipo de tecnologia, la cual no solo se puede
aplicar a el reconocimiento de firmas si no tambien a areas como la biometria que es un tanto mas
complicada, pero estan basados sobre lo mismo principios, tambien pudimos aprender a usar
distintas funciones que fueron de mucha utilidad al momento de procesar imágenes entre otras,
este tipo de proyectos nos deja una experiencia y los conocimientos basicos para poder realizar un
proyecto distinto y de mayor dificultad, ademas de dejar un cierto interes o curiosidad de
aprender mas sobre este tipo de proyectos.
En el desarrollo de este proyecto vimos la importancia del reconocimiento de patrones en la
utilización de la tecnología actual ya que es utilizada en diversos casos en los teléfonos celulares,
ya sea reconocimiento por voz, reconocimiento facial, reconocimiento de huellas dactilares o
reconocimiento de patrones de movimiento. También es utilizado en muchas medidas de
seguridad y de asuntos policiales, es un tema muy interesante ya que tú puedes desarrollar
diversos algoritmos para poder realizar tu objetivo que en este caso es el reconocimiento de
escritura manual, utilizando la herramienta de Matlab encontramos muchas alternativas de
desarrollo y después de un poco de investigación poder comprender y utilizar de manera más
adecuada este gran programa sus diversas alternativas que ayudan al diseño de programas de
reconocimiento de patrones. La clasificación de los patrones obtenidos llego a ser un poco
complejo pero no ayudo a aplicar la lógica y así poder generar más conocimiento para que en un
futuro podamos aplicarlo en diversos campos no solo en este. Es una muy grata experiencia el
poder realizar este tipo de proyectos y despierta el interés por aprender más sobre este tema y el
desarrollo de las aplicaciones que en un futuro podrán ayudar mucho a la humanidad ya que todo
va en vías de aplicar la tecnología hasta en lo más básico de nuestra vida cotidiana.
Es interesante como mediante una camara y una imagen que contiene 4 firmas, un programa que
parece tan complicado facilite el análisis y la clasificación de las mismas, cabe resaltar que la
tecnología de hoy en día facilita dicho proceso, ya que mediante una herramienta como lo es
Matlab, se pueden realizar estos y muchos más programas que ayuden a reconocer imágenes,
escritura, etc. Al realizar este programa, se pusieron en juego algunas de nuestras habilidades
como lo son, la investigación, el análisis, la pasciencia y sobre todo el trabajo en equipo,
habilidades que aunadas al interés, ayudaron a que se concluyera satisfactoriamente la actividad y
se llevara una grata experiencia.