Solución al ejercicio: Identificando huellas digitales simuladas con Matlab (video y script)



Resultado gráfico del análisis de las imágenes. El archivo núm. 14 corresponde al  análisis de la misma imagen. De toda la base datos, el archivo núm. 3 es el que se parece más al archivo núm. 14



Resumen
Hace unos días propuse un ejercicio estilo el programa de televisión CSI. Dibuje unos cuantos garabatos como si fueran huellas digitales; a una de ellos lo llamé "asesino" al resto "sospechoso_num" --a todas las imágenes les añadí un poco de ruido--. Pues bien. revisando la pequeña base de datos uno se puede dar cuenta que el archivo asesino coincide con la imagen del sospechoso número 3. El ejercicio trata de emplear código Matlab para hacer esta identificación.

Pueden existir muchas soluciones, aquí les muestre el uso de la función correlación estadística  (CORR, en Matlab) para hacer esta identificación automática. La correlación permite comparar señales, se usa mucho para estimar ajustes de curvas a datos experimentales, entre otras aplicaciones. En el caso ideal, cuando la imagen se compara consigo misma, la correlación es uno; cuando las imágenes son totalmente dispares, la correlación vale cero. En este caso, los análisis que más se aproximen a 1 indican mayor probabilidad de tener identificación de nuestro "asesino". 

Ahora bien, nos apoyamos en la obtención del máximo (MAX en Matlab) y luego del promedio (MEAN en Matlab) para tener el valor más representativo de la mayor variación que se puede presentar en el análisis. 

La figura que ilustra este post muestra el  resultado del script --que se presenta al final de la entrada-- . Podemos ver que la comparación de la imagen consigo misma da 1, y que el archivo 3 es el que más se acerca al valor ideal. Mientras que los demás valores están bastante alejados del valor del archivo núm. 3. Por lo cual la identificación es exitosa.

Preguntas para pensar
1) Menciona otras aplicaciones de la función de correlación.
2) ¿Mediante que otra función se puede hacer el análisis de identificación?

Ejercicios
1) A la base de datos de imagenes asocie una base datos con nombres ficticios. (Por ejemplo: alfa, beta, gamma, etc.)   Modifique el guión para que la pantalla le de el nombre del sospechoso más probable.
2) Dibuje sus propios garabatos y haga experimentos. Por ejemplo, a una imagen añada diferentes cantidades y clases de ruido.  Identifique cuales son los limites de este análisis.
3) Sí las imágenes se giran, la identificación es valida. Haga experimentos.
4) La función correlación es la que más tiempo consume en el guion. ¿Cómo puede aumentar el tiempo de calculo para hacer más rápido el proceso?

% INICIO DE GUION EN MATLAB
%Cierra todas las ventanas emergentes, limpia la memoria y la pantalla
close all; clear; clc;
Ases = imread('asesino','jpeg'); %Lee la imágen y la asocia a una matriz
G = fft2(Ases); %Calcula la transformada de fourier en 2D de la imagen
m(13) = mean(max(corr(G,G))); %Se compara la imagen consigo misma

% Con este for cargamos las imagenes, las procesamos y obtenemos un valor
% significativo
for n =1:12
nom_arch=['sospechoso', num2str(n)]; %esta cadena de caracteres cambia como lo hace n
Sosp =imread(nom_arch, 'jpeg'); %se carga la imagen a trabajar
F = fft2(Sosp); % se obtiene la trasformada de Fourier
m(n) = mean(max(corr(F,G))); % Se comparara la imagen con un estándar
%m(i).- Se guarda el valor del i-ésimo sospechoso en la entrada m(i)
end

% Se define el contador x, para graficar
x = 1:13;
% Grafica de x, m. Utilizo puntos rojo y lineas verticales azules
h = stem(x,m,'fill','--');
set(get(h,'BaseLine'),'LineStyle',':')
set(h,'MarkerFaceColor','red')

%Formato de la gráfica
xlabel('Etiqueta para el de sospechoso (número)');
ylabel('Correlación entre imagenes');
axis([0 14 0 1.1]);

% clear
% clc
%fin del script

11 comentarios:

  1. Hola e staba tratando de usar tu script y descargue tu base de datos pero aparecen unos errores en mi version de Matlab. Por favor me puedes enviar tu codigo para que lo cite en una presentation y darte los creditos. mi email es sbbust@gmail.com. Gracias, espero que puedas ayudarme.

    ResponderEliminar
    Respuestas
    1. Stephanie: le código lo puedes encontrar al final de la entrada, de este comentario.
      Suerte con tu presentación.

      Eliminar
  2. Hola, estaba probando el script, tras usar el código y las imágenes de la base de datos y obserbo algunos errores:

    ??? Error using ==> ctranspose
    Transpose on ND array is not defined.

    Error in ==> corr>corrPearson at 305
    coef = xc' * yc; % 1/(n-1) doesn't matter, renormalizing anyway

    Error in ==> corr at 213
    coef = corrFun(rows,tail,x,y);

    Error in ==> dos at 15
    m(n) = mean(max(corr(F,G))); % Se comparara la imagen con un estándar

    Error in ==> run at 57
    evalin('caller', [s ';']);


    Es por la versión de Matlab? versión 7.12

    Gracias y saaludos

    ResponderEliminar
  3. tengo Matlab 2010R y probando el script tarda como 10 minutos, el unico detalle es que cargo como base de datos imagenes de 132 KB, no es estoy seguro si es por la imagen..que es que tarda pero como podria acelerar el procesamiento mediante una funcion de correlacion ???

    ResponderEliminar
    Respuestas
    1. Puedes usar la función corr2. Esta función tiene la ventaja de que ya no tienes que realizar la transformada de Fourier en el código. Además es una función más adecuada para trabajar imágenes.

      Dinos si te servio el comentario.

      Saludos

      Eliminar
    2. me funciono correctamente...probare una nueva muestra(de imagenes) para deteccion de defectos en telas, lei un articulo bastante interesante acerca del uso de la transformada de Fourier
      y te mando cualquier consulta ...saludos gracias...

      Eliminar
    3. Excelente. Exito y saludos. :D

      Eliminar
  4. hola ke tal.. acerca de la detección de defectos en telas necesito un ayuda acerca de la segmentación de imágenes donde pueda encontrar algún defecto (hueco o mancha) en la imagen, ya ke mi objetivo es realizar un promedio de las segmentaciones realizadas

    ResponderEliminar
  5. Hola me prodrias proporcionar tu base de datos?

    ResponderEliminar
  6. me sale eso men que hago?
    Error in buscar_asesino2 (line 8)
    m(13) = mean(max(corr(G,G))); %Se compara la imagen consigo misma

    ResponderEliminar
  7. hola men me sale este error
    Error in buscar_asesino2 (line 6)
    m(13) = mean(max(corr(G,G))); %Se compara la imagen consigo misma

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...