localizaciÓn del iris en imÁgenes en escala de gris …...clase a través de su aplicación a un...
TRANSCRIPT
LOCALIZACIÓN DEL IRIS EN IMÁGENES EN ESCALA DE GRIS
USANDO LOS VALORES DE INTENSIDAD
Asignatura: Procesamiento de Imágenes DigitalesTutores:
- Mª José Jiménez Rodríguez - Belen Medrano Garfia
Grupo: TD25Curso: 2008/09Alumnos:
- Gómez Rodríguez, Francisco Manuel- González Guillén, Isidoro- Portero Espejo, Carlos
1
Índice de contenidos
1. Introducción. 3
2. Objetivos y contenido. 4
Objetivos 4
Contenido 4
3. Problema teórico: Descripción del algoritmo. 5
Paso 1: Localización del centro de la pupila. 5
Paso 2: Cálculo del radio de la pupila. 7
Paso 3: Estimación de los gradientes más significativos desde la pupila. 8
Paso 4: Cálculo del radio y del centro del iris. 11
4. Problema práctico: Descripción de la aplicación. 12
Paso 1: Localización del centro de la pupila. 12
Paso 2: Cálculo del radio de la pupila. 13
Paso 3: Estimación de los gradientes más significativos desde la pupila. 13
Paso 4: Cálculo del radio y del centro del iris. 15
5. Experimentación. 16
6. Conclusiones. 21
7. Bibliografía y referencias. 23
8. Plantillas de tiempos. 24
9. ANEXO: Manual de usuario. 26
2
1. Introducción.
La identificación automática de las personas viene siendo muy importante en los últimos
años. Debido a su gran fiabilidad se vienen desarrollando muchos sistemas de seguridad biométricos. La biométrica es la rama de la ciencia en la que una persona es automáticamente
identificada por su comportamiento (firma, paso, voz, etc) o su físico (huella dactilar, iris, retina, geometría de la mano, etc).
El iris empieza a formarse en el tercer mes de
gestación. Los patrones que forman el iris se completan en el octavo mes, aunque la pigmentación puede cambiar en el
primer año de vida. El patrón complejo del iris contiene muchas características como ligamentos arqueados, surcos,
crestas, anillos, coronas y pecas. El iris humano tiene características únicas y es lo suficiente complejo para ser
usado como firma biométrica y no cambia en la vida de una persona. No sólo los iris de gemelos idénticos son diferentes,
incluso el izquierdo y el derecho de una misma persona son diferentes.
La localización del iris en una imagen sirve como preprocesamiento en un sistema de
identificación por iris. Para cualquier sistema de reconocimiento, la precisión del sistema de reconocimiento del iris es muy dependiente de la precisión de la localización del iris. Cuanto mejor
localizado esté el iris, mejor será el rendimiento del sistema de reconocimiento.
En el siguiente documento se describe la implementación de un algoritmo para la localización del iris en imágenes en escala de grises usando los valores de intensidad. La
aplicación recibe como entrada una imagen en escala de grises de un ojo, tras la aplicación del algoritmo se delimitará el iris en la imagen.
3
2. Objetivos y contenido.
Objetivos
El trabajo desarrollado tiene principalmente dos objetivos:
• Didáctico.
Se pretende mostrar de una manera gráfica y sencilla las diferentes operaciones
necesarias para la localización del iris en una fotografía. Para ello, la aplicación permite la ejecución paso a paso.
• Funcional.
Queremos demostrar la utilidad de las operaciones y las técnicas que hemos estudiado en
clase a través de su aplicación a un problema real: la localización del iris en una fotografía.
Como veremos más adelante, el objetivo principal de la aplicación de operaciones morfológicas sobre imágenes en escala de grises es localizar el anillo que forma el iris para su
posterior tratamiento.
Contenido En lo referente al contenido del documento, a continuación se presenta el problema
teórico, que ofrece una descripción del proceso seguido para la obtención del resultado final. Seguidamente se muestra el problema práctico, en el que se describe a grandes rasgos la
aplicación desarrollada, explicando las principales funciones implementadas. En la fase de experimentación se exponen una serie de observaciones y resultados obtenidos a lo largo del
proceso de implementación y del proceso de pruebas. Por último, se muestra un apartado de conclusiones y problemas abiertos.
4
3. Problema teórico: Descripción del algoritmo.
En este apartado se van a mostrar los diferentes pasos que tiene el algoritmo para localizar el iris que hemos implementado en nuestra aplicación.
Paso 1: Localización del centro de la pupila.
Para localizar el centro de la pupila necesitaremos primero conocer la posición de
un punto cualquiera de la misma y después binarizar la imagen para hallar el centroide de la pupila.
• Suavizado
Como la pupila es una porción lisa y oscura en la imagen de un ojo, aplicamos un filtro de media. Para que el tiempo de proceso sea menor, se ignoran 50 pixeles alrededor de los
bordes de la imagen. Aplicamos una máscara de filtro de media de tamaño 3x3 pixeles.
• Localizar punto un interior de la pupila Para localizar un punto en el interior de la pupila seleccionaremos la fila y la
columna con mayor numero de valores grises oscuros. Es decir sumamos todos los valores de grises de una fila, para todas la filas, y seleccionamos la fila que que tenga un
valor menor en la suma anterior. El mismo proceso se realiza para las columnas de la imagen.
Px = {x,mínimo Intensidad(x,y)
columna∑ }
5
• Binarización con umbral adaptativo.
Una vez que tenemos un punto dentro de la pupila vamos a delimitar una zona cuadrada centrada en este punto. El tamaño de esta zona lo hemos decidido
experimentalmente en 160x160 pixeles. Necesitamos binarizar esta zona para delimitar dónde se encuentra exactamente la pupila. Hacemos una binarización con umbral
adaptativo basado en el valor máximo del histograma en esta región.
Py = {y,mínimo Intensidad(x,y)fila∑ }
6
• Cálculo del centroide
Tras binarizar la región vamos a calcular el centroide de la pupila. Para ello calculamos la posición media de los puntos negros que forman la pupila en la imagen
binarizada. Esto es para la coordenada X sumamos las coordenadas X de todos los pixeles negros y lo dividimos por el tamaño de la ventana. Y hacemos lo equivalente para
la coordenada Y. Con esto ya tenemos el centro de la pupila.
Paso 2: Cálculo del radio de la pupila.
Para calcular el radio de la pupila lo que hacemos es recorrer la imagen binarizada
partiendo del centro de la pupila. Contamos el número de pixeles negros consecutivos. Este proceso lo hacemos en las cuatro direcciones cartesianas. La media de estos cuatro
valores es el radio de la pupila.
7
Paso 3: Estimación de los gradientes más significativos desde la pupila.
• Filtro Gaussiano
Para reducir el efecto de los detalles puntiagudos en el iris suavizamos la imagen
aplicando un filtro Gaussiano de tamaño 27x27 y una desviación estándar sigma 3.
• Cálculo de la banda de computación
Trazaremos 2 circunferencias centradas en el centro de la pupila y que servirán de
“fronteras” para limitar la región de procesado de los siguientes cálculos.
8
Para encontrar el radio de la circunferencia interior, trazamos una linea horizontal
que pasa por el centro de la pupila. A partir del nivel de gris de los puntos de esa línea buscamos la primera cresta.
El radio interior tendrá ese radio, y para el radio exterior le sumamos el diámetro del iris.
• Búsqueda de los puntos con gradientes significativos
Trazamos 5 lineas centradas en el centro de la pupila hacia la izquierda y la
derecha desde la circunferencia interior hasta la exterior con inclinaciones entre horizontal y unos 40º hacia abajo.
Para cada uno de los pixeles contenidos en esos 10 segmentos, calculamos sus gradientes aplicando el operador Sobel.
9
De todos los puntos anteriores nos quedamos con los 90 que tengan mayor gradiente.
• Filtrado de los puntos de gradiente significativo
A todos los puntos seleccionados les calcularemos la distancia Euclídea hacia el centro de la pupila y seleccionaremos finalmente al mayor grupo de puntos con la misma
distancia. Se añade ademas la restricción de que deben ser al menos 3 puntos y debe haber al menos un punto a cada lado de la pupila, por ello, si el mayor grupo de puntos
equidistantes no cumple dichas restricciones se ira aumentando progresivamente un margen de diferencia entre los puntos hasta que existan suficientes puntos para alcanzar
los requerimientos.
10
Paso 4: Cálculo del radio y del centro del iris.
Con los cálculos anteriores hemos obtenido varios puntos (al menos 3) pertenecientes a la circunferencia que delimita la frontera entre el iris y la esclera. Así que escogemos 3
puntos de los anteriores y mediante un sistema de 3 ecuaciones calculamos el centro y el radio de una circunferencia que pase por dichos puntos. Al igual que antes, añadimos la
restricción de que uno de los 3 puntos tiene que estar al lado opuesto de la pupila que los otros dos.
Los parámetros del circulo de iris A, B y C son calculados para los puntos seleccionados
usando la ecuación:
El centro del iris es (-A/2, -B/2) y el radio es r = 12A2 + B2 − 4C
x2 + y2 + Ax + By + C = 0
11
4. Problema práctico: Descripción de la aplicación.
En esta apartado explicaremos cómo hemos implementado el problema teórico, mostrando cuáles han sido las funciones más importantes que hemos desarrollado.
Paso 1: Localización del centro de la pupila.
La función filtroMedia se encarga de aplicar el filtro de media a toda la imagen excepto a una zona de 50 pixeles alrededor de los bordes. Como parámetros recibe la imagen
original y su tamaño en horizontal y vertical.
public static byte[,] filtroMedia(byte[, ] image, int Filas, int Cols)
Esta función se sirve de la función aplicaMascaraMedia que aplica la máscara de media a
un solo pixel. Como parámetros de entrada recibe la imagen original y las coordenadas del pixel al que se desea aplicar el filtro de media.
public static float aplicaMascaraMedia(byte[,] image, int puntoX, int puntoY)
La función puntoPupila devuelve la posición de un punto perteneciente a la pupila, para
ello elige la fila cuyos pixeles sumen menor valor de gris e igual para al columna.
public static int[] puntoPupila(byte[,] image, int Filas, int Cols)
La función binarizaciónUmbralAdaptativo que realiza la binarización con umbral adaptativo en una zona de la imagen. Ésta función recibe la imagen tratada, el tamaño de la misma,
el punto de la pupila calculado anteriormente y el lado de la ventana en la que haremos la binarización.
public static byte[,] binarizacionUmbralAdaptativo(byte[,] image, int filas, int cols, int origenX, int origenY, int lado)
Para calcular el umbral esta función se sirve de la función GetPartialHistogram. Esta función calcula el histograma en una zona delimitada por los parámetros que recibe de
entrada.
public static long[] GetPartialHistogram(byte[,] matriz, int iniFilas, int finFilas, int iniCols, int finCols)
12
La función centroide devuelve la posición del centroide de los pixeles negros, es decir, la
media de la componente X de dichos pixeles y la media de su componente Y.
public static int[] centroide(byte[,] image, int Filas, int Cols, int origenX, int origenY, int lado)
Paso 2: Cálculo del radio de la pupila.
La función radioCentroide se encarga de calcular la media del radio de la pupila binarizada partiendo del centroide. Recibe como entradas la imagen parcialmente binarizada, el
centroide y el tamaño de un lado de la ventana donde hacemos las operaciones.
public static int radioCentroide(byte[,] image, int puntoX, int puntoY, int lado)
Paso 3: Estimación de los gradientes más significativos desde la pupila.
La función gauss devuelve el resultado de aplicar el filtro gaussiano con sigma 3 a la
imagen que recibe por parametro.
public static byte[,] gauss(byte[,] image, int tam)
La funciones Funtion2D, Kernel2D y KernelDiscret2D son funciones de AForge.NET que
sirven para calcular la mascara de convolución del filtro gaussiano.
public static double Function2D(double x, double y)public static double[,] Kernel2D(int size)public static int[,] KernelDiscret2D(int size)
La función aplicaMascara devuelve el resultado de aplicar una máscara de convolución al
pixel (i, j) de image.
public static byte aplicaMascara(byte[,] image, int i, int j, int[,] mascara)
La función primeraCresta devuelve la media de las cimas de la primera cresta desde el
centro de la pupila a la izquierda y la derecha, recibe el centro de la pupila, su radio y la imagen del ojo
public static int primeraCresta(int x, int y, int radioPupila, byte[,] array)
13
La función calcula calculaGradientes se encarga realizar varias llamadas a la función Linea
para diferentes segmentos y devolver los resultados en una lista ordenada.
public static SortedList calculaGradientes(byte[,] image, int x, int y, int radioInterior, int radioExterior)
La función Linea calcula todos los pixeles que pasan por una recta que pasa por el centro
de la pupila y un extremo de la imagen, y les calcula el gradiente. Esta función ignora los puntos que se encuentran antes cortar la circunferencia interior y los posteriores a cortar la
circunferencia exterior. Recibe como parámetros el punto inicial, el punto final, el radio de la circunferencia interior y el radio de la circunferencia exterior. Para la realización de esta
función nos hemos basado en código externo (ver referencias).
public static List<PuntoGradiente> Linea(byte[,] imagen, int xa, int ya, int xb, int yb, int radioInterior, int radioExterior)
Para el cálculo del gradiente en un punto, hacemos una aproximación al mismo mediante el operador Sobel. Esto lo realizamos con la función apply de la clase Sobel sacada de
internet (ver Bibliografía) que calcula la aproximación al gradiente con el operador Sobel en el pixel (i, j).
public static double apply(byte[,] image, int i, int j)
La función euclidea recibe una lista de puntos y devuelve la distancia de esos puntos al punto (cx, cy)
public static ArrayList euclidea(List<PuntoGradiente> l, int cx, int cy)
La función gradientesSignificativos devuelve los 90 primeros elementos de la lista que recibe por parámetro.
public static List<PuntoGradiente> gradientesSignificativos(SortedList s)
La función mismaMahalanobis devuelve el mayor grupo de puntos con la misma distancia euclidea al centro, su nombre confuso se debe a que inicialmente usaba la distancia de
mahalanobis en lugar de la distancia euclidea.
public static List<PuntoGradiente> mismaMahalanobis(List<PuntoGradiente> l, int cx, int cy)
14
Paso 4: Cálculo del radio y del centro del iris.
Una vez que tenemos el conjunto de puntos que están a una misma distancia del centro de
la pupila, tenemos que calcular el radio exterior y el centro del iris. Para ello usamos la función construyeIris.
public static double[] contruyeIris(List<PuntoGradiente> puntos, int centrox)
Esta función resuelve un sistema de ecuaciones lineales con las ecuaciones de la
circunferencia para obtener el centro y el radio exterior del iris. La función que resuelve el sistema de ecuaciones es GaussianElimination, esta función usa el método de Gauss-Jordan para resolver el sistema lineal. Este código no lo hemos desarrollado nosotros (ver referencias).
public static bool GaussianElimination(double[,] a, double[] r)
15
5. Experimentación.
La experimentación ha sido clave para poder determinar exactamente aquellos puntos del algoritmo que el documento no explicaba correctamente o que simplemente no se comentaban en
él. Gracias a ella hemos podido adaptar ciertos parámetros del algoritmo para mejorar su eficiencia y su fiabilidad a la hora de localizar de una forma adecuada el iris. Concretamente los
parámetros ajustados mediante la experimentación han sido:
• Tamaño de la región cuadrada alrededor de la pupila: Una vez localizado un punto interior de la pupila debíamos buscar un cuadrado suficientemente grande para que contuviera
completamente la pupila, comprobamos que era suficiente con 160x160 pixeles.
• Umbral de binarización: El articulo de referencia explicaba que para binarizar la imagen se
debía escoger un umbral basado en el máximo valor en el histograma. Observamos que si le sumábamos 6 a ese nivel de gris, el posteriormente el radio de la pupila se ajustaba más a
su valor real, debido a que así en la binarización también aparecían negros los pixeles cercanos al borde de la pupila donde empezaban a aclararse, probablemente debido al
suavizado del filtro de la media.
• Direcciones para buscar el radio de la pupila: Cuando buscamos el radio de la pupila, decidimos por simplicidad solo contar el número de ceros en horizontal y vertical, se podría
comprobar si merece la pena usar también direcciones oblicuas.
• Filtro gaussiano: Al aplicar el filtro gaussiano nos encontrábamos el problema común al aplicar mascaras de convolución en los bordes de una imagen, este problema se agravaba
debido a que se trataba de una máscara de convolución muy grande. Finalmente optamos por aplicar máscaras de convolución más pequeñas (aunque con la misma sigma) conforme
nos acercamos a los bordes, lo cual nos dio muy buen resultado. Otro problema que relacionado con el tamaño de la máscara es que demora unos segundos, lo cual quizás
pudiera solucionarse consultando implementaciones más eficientes.
• Primera cresta: Este calculo ha sido reajustado multitud de veces durante la implementación ya que un buen radio ajustado al borde de la esclera permite además de ahorrar tiempo
computacional evitar encontrar gradientes significativos en el interior del iris. Finalmente se opto por empezar a buscar la cima de la cresta partir de la distancia del radio de la pupila
más cuarenta pixeles, y considerar que la cima aparece cuando el valor de intensidad
16
decrece en una unidad. Sería muy interesante seguir probando si se puede incrementar el
valor de 40 pixeles sin que por ello haya peligro de salirnos del iris.
• Radio de la circunferencia de computación exterior: Probablemente este ha sido uno de los valores que peor hemos ajustado ya que actualmente aparecen muchos ojos en los en los
que el radio es tan grande que prácticamente no se tiene en cuenta. Según el articulo de referencia debía estar basado en el radio de la pupila, por ello lo ajustamos a la suma del
circulo interior más 7/4 del radio de la pupila, pero se podrían buscar otras formulas.
• Inclinación de las rectas en las que calculamos los gradientes: La primera mejora sobre las especificaciones del articulo fue lanzar las rectas solo a unos 40º por debajo del eje
horizontal en vez de usar toda la región inferior la justificación es que en la mayoría de los ojos por debajo de esa inclinación los párpados tapaban el borde del iris. Concretamente la
línea más baja llega a 6/7 de la distancia que hay entre el ojo y el margen inferior de la imagen.
• Número de rectas en las calculamos los gradientes: Comprobamos que aunque pueda
resultar contradictorio, si lanzamos muchas rectas, obtenemos peores resultados que si solo lanzamos unas pocas. Esto se debe a que cuando en los siguientes pasos obtenemos los
puntos con la misma distancia euclídea al centro, si había muchas rectas, obtendremos unos puntos demasiado cercanos, lo que hace que al hacer pasar la circunferencia por ellos
tengamos resultados inexactos, en especial en la posición del centro de la circunferencia. Viendo los resultados obtenidos para 10 rectas, parece que incluso se pudieran reducir aún
más este numero.
• Número de puntos con gradiente significativo: Hemos considerado que 90 puntos es un número que funciona bastante bien, pero se podría probar con un menor numero de puntos,
hay que tener en cuenta que este número puede estar relacionado con lo ajustado que tengamos la banda de computación y el numero de segmentos usados para calcular los
gradientes.
• Distancia de Mahalanobis: Se ha usado la distancia euclídea en lugar de la distancia de Mahalanobis, se profundizara un poco más sobre este cambio en las conclusiones.
• Puntos seleccionados para trazar el circulo de iris: Como ya se dijo en el planteamiento
teórico, se ha añadido la restricción de que se deben escoger puntos a ambos lados de la pupila, para que posteriormente el circulo del iris se ajuste mejor al real.
17
Se ha realizado un muestreo para las 20 primeras galerías (151 fotos) de la base de datos
del articulo de referencia, obteniendo los siguientes resultados:
El algoritmo presenta un 90% de eficacia, el 10% erróneo se debe aparentemente a 3 motivos:
• En un 25% de los casos se debe a que las pestañas son muy gruesas y oscuras, esto
provoca que cuando se busca un punto interior de la pupila a partir del nivel de intensidad, la intensidad de las pestañas descentra tanto el punto que el rectángulo de binarización no
contiene completamente a la pupila. Al ser de los primeros pasos, esto afecta al resto del algoritmo. Aparentemente no hay una solución directa para estos casos.
18
• Un 31% es debido a que el centro de la pupila esta considerablemente desplazado respecto
al centro del iris, esto invalida el paso de filtrado por distancia euclidea al centro. Este problema probablemente podría arreglarse con una correcta implementación de la distancia
de Mahalanobis.
• Finalmente en casi la mitad (44%) de los casos erróneos, los puntos de gradiente significativo no están bien colocados por lo que invalida los pasos posteriores del calculo del
circulo del iris. Estos casos suelen coincidir con malas fotografías, con mala iluminación o párpados demasiado cerrados, la solución sería exigir un mínimo de calidad en las fotos,
aunque también se podría intentar reajustar los parámetros del calculo de gradiente significativo eligiendo más puntos o trazando más rectas.
19
En resumen, consideramos que el algoritmo tiene un rango de acierto muy alto y más aún si se tiene en cuenta que hay una gran proporción de fotos en las que la iluminación no es
adecuada o el iris aparece parcialmente oculto bajo los párpados.
20
6. Conclusiones.
El algoritmo implementado cumple sus expectativas, es decir, la localización del iris en imágenes en escala de grises. La fotografía a procesar ha de tener unas características
adecuadas: una foto de un único ojo en escala de grises con resolución de 320x280 pixeles y una iluminación adecuada.
La efectividad del algoritmo se enfrenta a dos pasos críticos, primero, localizar un punto
interior de la pupila, este paso da problemas en algunas ocasiones debido a que unas pestañas gruesas y oscuras pueden desviar tanto el punto que haga posteriormente el recuadro no
contenga completamente la pupila, actualmente no parece que haya una solución a este problema, además al ser de los primeros pasos esto invalida el resto del proceso. Segundo,
filtrado de los puntos de máximo gradiente y misma distancia Euclídea para trazar el circulo del iris, en algunas ocasiones estos puntos no se eligen bien, se podría seguir experimentando
modificando estos parámetros para hacer conseguir que funcionara en las pocas fotos que no funcionan. Otra forma de mejorar la elección de estos puntos sería ajustando aún más la banda
de computación (más detalles en experimentación).
Es necesario tener bastantes conocimientos de procesamiento de imagen, ya que para el algoritmo se usan filtros y transformaciones que se dan por sabidas.
Encontramos que la mayoría de los pasos se realizan de forma casi instantánea, el único paso que demora unos segundos es el filtro Gaussiano, luego es ahí donde se debería incidir si se
quiere mejorar el tiempo de respuesta.
El gran cambio que hemos realizado sobre el planteamiento teórico original es el usar la distancia Euclídea en lugar de la distancia de Mahalanobis, debido a que la distancia de
Mahalanobis daba peores resultados. En concreto, el radio del circulo final del iris parecía correcto pero la mayoría de las veces el centro del iris aparecía muy desplazado. No estamos seguros si
esto es debido a un error en nuestra implementación, así que una posibilidad sería buscar librerías externas probadas y comparar sus resultados con los nuestros, por ello, en el código
fuente hemos dejado nuestra implementación de la matriz de covarianza y la función de Mahalanobis.
Si se quisiera ampliar la funcionalidad del programa, en el articulo de referencia se
explicaba como tratar imágenes en las que en la pupila aparecían 8 círculos blancos en el interior del iris, además se explicaba como eliminar los párpados superpuestos al iris, aunque este paso
era el que peores resultados daba. También se podría aumentar la compatibilidad permitiendo la
21
entrada de imágenes a diferentes escalas, formatos de imagen y color. Estos pasos no han sido
realizados para reducir la carga de trabajo.
22
7. Bibliografía y referencias.
• “Programación en Visual Studio .NET bajo C# de Aplicaciones Gráficas”: Proyecto de Ricardo Villa Brieva de la Universidad de Málaga. (base del código de la función Linea).
• http://www.wikipedia.org
• “Eliminación de Gauss-Jordan en C#”: http://vexpert.mvps.org/articles/GJE.htm. Código de la
técnica Eliminación de Gauss-Jordan para resolver sistemas de ecuaciones lineales de reales y complejos. Por Harvey Triana.
• Matriz de varianzas/covarianzas. http://www.psico.uniovi.es/Dpto_Psicologia/metodos/tutor.6/
matcov.html
• “Localization of iris in gray scale images using intensity gradient” por A. Basit, M.Y. Javed (Artículo de referencia). Optics and Lasers in Engineering, Volume 45, Issue 12, December
2007, Pages 1107-1114. http://www.sciencedirect.com/science?_ob=ArticleURL&_udi=B6V4G-4PGPKX6-1&_user=10&_coverDate=12%2F31%2F2007&_rdoc=
1&_fmt=&_orig=search&_sort=d&view=c&_acct=C000050221&_version=1&_urlVersion=0&_userid=10&md5=2cd9a0b0d761c6d5640f341ac2752420
• Cálculo del gradiente Sobel. .NET GDI+ Graphics Edge Detection via Sobel Filter by
Shailendra Sason. http://www.eggheadcafe.com/tutorials/aspnet/c833c86a-677a-4ff3-b820-43126cbeb1a7/net-gdi-graphics-edge-d.aspx
• Cálculo de la matriz inversa para la distancia de Mahalanobis. Sinapse Neural Networking
Tool by Cesar Roberto de Souza. http://sinapse.googlecode.com
• Cálculo de la máscara de convolución para el filtro Gaussiano. AForge .NET library created by Andrew Kirillov. http://code.google.com/p/aforge/
• Entorno gráfico de la aplicación. “DETECCIÓN DE OJOS BASADA EN MORFOLOGÍA EN ESCALA DE GRISES” Procesamiento de Imágenes Digitales. 2006/2007. Santiago Miguel
Aranda Rojas, Miguel Ángel Luna Cantador, José Antonio Mora
• "Visual C#" 2ª Edición, Fco. Javier Ceballos, Editorial Ra-Ma..
23
8. Plantillas de tiempos.
Fecha Inicio Fin Tiempo de interrupción Tiempo Miembros Actividad
21/11/08 17:30 19:30 0 2 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Comprensión del articulo de referencia
28/11/08 17:30 19:30 0 2 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Comprensión del articulo de referencia
12/12/08 17:30 19:30 0 2 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Comprensión del articulo de referencia
15/12/08 8:00 14:00 0 6 horas Carlos P. E. Interfaz gráfica
16/12/08 8:00 14:00 0 6 horas Carlos P. E. Interfaz gráfica
17/12/08 8:00 14:00 0 6 horas Carlos P. E. Interfaz gráfica
18/12/08 8:00 14:00 0 6 horas Carlos P. E. Interfaz gráfica
09/01/08 17:30 19:30 0 2 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Comprensión del articulo de referencia
10/01/08 10:00 21:00 1 hora 10 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Implementación
11/01/08 10:00 21:00 1 hora 10 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Implementación
12/01/08 10:00 14:00 0 4 horas Isidoro G. G., Carlos P. E. Implementación
12/01/08 15:00 21:00 0 6 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Implementación
13/01/08 10:00 14:00 0 4 horas Isidoro G. G., Carlos P. E. Implementación
13/01/08 15:00 21:00 0 6 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Implementación
24
14/01/08 10:00 14:00 0 4 horas Isidoro G. G., Carlos P. E. Implementación
15/01/08 10:00 14:00 0 4 horas Isidoro G. G., Carlos P. E. Implementación
15/01/08 15:00 21:00 0 6 horas Francisco M. G. R., Isidoro G. G. Implementación
16/01/08 10:00 17:00 1 hora 6 horasFrancisco M. G. R.,
Isidoro G. G., Carlos P. E.
Preparación de la presentación
17/01/08 11:00 13:00 0 2 horas Francisco M. G. R., Isidoro G. G. Documentación
17/01/08 11:00 12:00 0 1 hora Carlos P. E. Documentación
18/01/08 11:00 22:00 1 hora 10 horas Isidoro G. G. Documentación
18/01/08 11:00 22:00 1 hora 10 horas Francisco M. G. R. Documentación
25
9. ANEXO: Manual de usuario.
26