ÍNDICE
1.) Introducción. 2.) Análisis de la aplicación 3.) Implementación 4.) Conclusiones 5.) Manual de Usuario 6.) Código del trabajo 7.) Bibliografía1)
Introducción.
Nuestro trabajo consiste en realizar un Analizador topológico usando la Transformada de Haar.
Las imágenes que usaremos para el análisis de transformadas, serán líneas rectas, tanto verticales, como horizontales y como diagonales
Estas imágenes que utilizaremos serán imágenes binarias y con una dimensión de 8x8. Usamos imágenes binarias, porque es la única imagen que nos deja dibujar correctamente. Para dibujar una imagen en escala de grises, necesitaríamos unas librerías de Matlab. Y usamos imágenes de dimensión 8x8 porque Matlab no admite los retornos de carro en los cuadros de texto, por tanto, para cada fila de la matriz de la imagen tenemos que usar un cuadro de texto, por tanto, si fueran de mayor dimensión, se verían muy engorrosas.
Nuestro Analizador topológico lo usaremos para varios usos. Un uso que le daremos será el de la compresión de imágenes, ya que si queremos mandar una imagen por red, nos interesa que ocupe poco espacio. Otro uso que le daremos es para ver como se comporta topológicamente una imagen frente a un ruido. Se le podría dar más usos, pero nos hemos centrado en estos dos, que son muy importantes en la vida real.
Por último indicar, que gracias a las transformadas y en particular a las transformadas bidimensionales, que es con la que trabajamos, podemos conseguir restauraciones, compresiones, codificaciones, restauraciones y descripción de imágenes.
2)
Análisis de la Aplicación
El análisis de nuestra aplicación se basa en la Transformada de Haar. Esta transformada es poco conocida y poco útil en la práctica debido a las mejoras que se consiguen con otras transformadas, aunque éstas sean más complejas. En cuanto a compresión, hemos visto que la transformada de Haar comprime poco en comparación con otras. Este problema lo podemos arreglar si usamos un algoritmo más eficiente.
Esta Transformada tiene como propiedades que es lineal, es real y es muy rápida, es decir su orden de complejidad es 0(n). Además, las matrices que usa deben de cumplir dos propiedades:
• Ortogonal, es decir, que la transformada es igual que la inversa • Sus valores son cero o potencia de 2
El algoritmo que usa la Transformada de Haar se basa en sumas, diferencias y divisiones, donde cogemos la suma y la diferencia de cada par de píxels. Estas sumas y diferencias se realizan para cada fila y cada columna y pone las sumas en la parte superior izquierda y las diferencias en el resto de la matriz, es decir, en la parte derecha y en la parte inferior izquierda. Por tanto, obtenemos una matriz con valores altos en la parte superior izquierda y valores bajos en el resto de la matriz. Iterando este proceso varias veces el resultado será una matriz con la energía empaquetada en la esquina superior izquierda de la matriz. De la matriz resultante, es fácil volver a la imagen original.
En las transparencias que se adjuntan viene paso a paso el algoritmo que usa la Transformada de Haar.
3)
Implementación.
En este apartado nos disponemos a explicar brevemente el funcionamiento del programa realizado. Explicaremos cada fichero *.m que hemos creado para la realización del trabajo.
Los ficheros *.m que vamos a explicar son: 1. Fichero Haar.m 2. Fichero Modificar.m 3. Fichero imostrada1.m 4. Fichero imostrada2.m 5. Fichero imostrada3.m 6. Fichero imostrada4.m 7. Fichero mostrarMatriz.m
1.- Fichero Haar.m
Esta función es la función principal del programa, en este fichero nos encontramos las funciones necesarias para realizar la Transformada de Haar y su inversa. En la interfaz de dicho fichero, seleccionaremos una imagen, que será de 8x8, y realizaremos la transformada de Haar sobre dicha imagen. En esta interfaz, además de realizarse la transformada, podemos realizar otras cosas, tales como mostrar la matriz de la imagen seleccionada, mostrar la matriz de la transformada,... Ya iremos explicando cada una de ellas.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
Las funciones de este fichero son:
• cargar_Callback, esta función nos ayuda a seleccionar la imagen con la que queremos trabajar.
• cargaImagen, esta función es la encargada se dibujar la imagen seleccionada por la función anterior y la dibuja en el axes, cuadro de imagen, correspondiente.
• bmmo_Callback, esta función es la encargada de mostrar la matriz de la imagen seleccionada.
• bTransformada_Callback, esta función es la encargada de realizar la transformada de Haar sobre la imagen previamente seleccionada.
• bmmt_Callback, esta función es la encargada de mostrar la matriz de la transformada obtenida anteriormente.
• bComparar_Callback, esta función es la encargada de realizar una comparación entre la matriz original y la matriz transformada.
• bInversa_Callback, esta función es la encargada de realizar la inversa de Haar sobre la transformada obtenida sobre la imagen previamente seleccionada. En teoría, deberíamos de obtener la imagen original, pero puede que no.
• realizarCambios_Callback, esta función es la encargada de realizar la llamada ala interfaz modificar, para realizar los cambios que quiera el usuario.
• salir_Callback, esta función es la encargada de salir del programa.
2.- Fichero Modificar.m
Esta función es la función secundaria del programa, en este fichero nos encontramos las funciones necesarias para realizar modificaciones a la imagen original y ver como afecta en la Transformada de Haar y en su inversa.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
Las funciones de este fichero son:
• Inicio Callback, esta función nos ayuda a iniciar dicha interfaz.
• bAplicar_Callback, esta función es la encargada de realizar los cambios
propuestos en la imagen original.
• bMostrarO_Callback, esta función es la encargada de mostrar la matriz de la imagen original con sus respectivos cambios.
• bTransformada_Callback, esta función es la encargada de realizar la transformada de Haar sobre la imagen original modificada
• bMostrarT_Callback, esta función es la encargada de mostrar la matriz de
la transformada obtenida anteriormente.
• bInversa_Callback, esta función es la encargada de realizar la inversa de Haar sobre la transformada obtenida sobre la imagen original modificada.
3.- Fichero imostrada1.m
Este fichero mostrará la matriz correspondiente. En la interfaz, mostraremos la matriz del fichero con el que estábamos trabajando.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
La función de este fichero es:
• bMostrar_Callback, esta función es la encargada de mostrar la matriz de la imagen original.
4.- Fichero imostrada2.m
Este fichero mostrará la matriz correspondiente. En la interfaz, mostraremos la matriz de la transformada de la imagen original.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
La función de este fichero es:
• bMostrar_Callback, esta función es la encargada de mostrar la matriz de la transformada de Haar de la imagen original.
5.- Fichero imostrada3.m
Este fichero mostrará la matriz correspondiente. En la interfaz, pasamos a mostrar la matriz transformada que corresponde a la ventana en la que realizamos diversas modificaciones.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
La función de este fichero es:
• bMostrar_Callback, esta función es la encargada de mostrar la matriz de la transformada de Haar de la imagen original modificada.
6.- Fichero imostrada4.m
Este fichero mostrará la matriz correspondiente. En la interfaz, pasamos a mostrar el resultado de la matriz de la imagen original una vez aplicados los cambios deseados.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
La función de este fichero es:
• bmorigmodificada Callback, esta función es la encargada de mostrar la matriz original modificada.
7.- Fichero mostrarMatriz.m
Por último, nos queda sólo el fichero que se encarga de obtener las filas de una matriz pasada como parámetro.
El código, con indicaciones de su realización, de todas las funciones de este fichero, se encontrarán al final de este apartado
La función de este fichero es:
• mostrarMatriz, esta función es la encargada de obtener las filas de la matriz pasada como parámetro.
4)C
onclusiones.
Una vez terminada la interfaz del programa, y haber experimentado con nuestro analizador, hemos logrado determinar algunas conclusiones que hemos extraído
al probar con diferentes imágenes binarias de 8x8, y observar su topología:
Para lograr esas conclusiones hemos determinado también un índice del grado de compresión, que nosotros hemos definido, para ver qué ocurre cuando se pierde información de la imagen transformada, o sea que ocurre cuando se elimina elementos que consideramos innecesarios de la imagen transformada e intentamos recuperar la imagen original de esa propia matriz transformada alterada.
Ese grado de compresión lo determinamos calculando el numero de elementos alterados de la imagen transformada, una vez obtenido, lo dividimos por el numero total de píxeles que tiene la matriz:
Nº PIXELES MODIFICADOS
Grad.compres.= --- x 100;
Nº PIXELES TOTALES
La pregunta ahora sería, ¿y en función de qué alteramos la matriz transformada? ¿Cuál es la información que consideramos innecesaria? Pues bien, hemos determinado una cota inferior igual a 0 (parámetro δ), de manera que cualquier elemento de la matriz de la imagen transformada que esté por debajo de esa cota, será despreciado y puesto su valor a 0.
Como estamos despreciando información de la imagen transformada, estamos aumentando nuestro grado de compresión, de manera que si elegimos cuidadosamente esa cota inferior podemos llegar hasta un alto grado de compresión despreciando información que no le es útil a la transformada de Haar para recuperar la imagen original.
Entre las conclusiones que hemos extraído de la experimentación destacan:
1. Al tener la transformada de Haar unas características determinadas, basándose en un número determinado de iteraciones(según el cual se divide la esquina superior izquierda de la matriz transformada en 4 regiones). Si continuamos haciendo iteraciones y subdividiendo dicha porción de la matriz, llegaría un momento en que no se pueden realizar más divisiones, ya que la porción consta de un solo píxel, el cual no podemos dividir más.
En nuestro caso, para imágenes 8x8, es a partir de la iteración 4 cuando es imposible recuperar la imagen original y cuando las matrices de la imagen transformada coinciden para iteraciones superiores a 4, por lo que aumentar el número de iteraciones no serviría de nada. Ello se debe a que al hacer 3 divisiones, los puntos más
significativos, que son para la transformada de Haar los puntos de la parte superior izquierda, es decir, los de mayor valor, pasan sucesivamente de 4x4,a 2x2 y a 1x1(un píxel) en la iteración 3, por lo que en la iteración 4 ya es imposible dividir más la región de puntos más significativos y esto hace que sea imposible recuperar la imagen original al hacer la inversa.
Veamos la disposición de los puntos en la imagen transformada. Los puntos más significativos, es decir, los de mayor valor numérico, se sitúan en la esquina superior izquierda de dicha matriz, mientras que las regiones restantes contienen el resto de los puntos, todos de menos valor que los situados en la primera región descrita. Veámoslo con este ejemplo. Como vemos, con 1 iteración, la imagen inicial de 8x8 se ha dividido en cuatro regiones iguales.
Imagen original: Imagen transformada:
Con una iteración
Si a través del analizador vemos con detalle los valores de la matriz transformada podemos apreciar como los valores 0,en la imagen se consideran como grises, esto se debe a errores internos de matlab que no hemos podido solucionar, sin embargo luego a la hora de realizar la transformada con compresión los valores 0, si salen correctamente en negro,pero que nos influye a la hora de los resultados.
Si realizamos dos iteraciones los puntos más significativos se siguen encontrando en la parte superior izquierda, pero ahora en una región 2x2. A continuación, para 3 iteraciones, la parte superior izquierda sólo ocupará 1 píxel.
Todas esta pruebas se han realizado sin llevar a cabo perdida de información de la imagen transformada, por lo que el grado de compresión, como es de suponer es de:
2.-Si tenemos en cuenta todo lo anterior pero aplicándole una pérdida de información al realizar la transformada, obtenemos unos resultados diferentes a los expuestos en el punto anterior ya que al haber despreciado información, o sea al estar comprimiendo, puede que no se recupere la imagen original.
Si seguimos considerando el ejemplo de la diagonal principal, obtenemos los siguientes resultados:
Imagen original
Como vemos, el grado de compresión alcanzado es del 6%. ¿Pero cómo se obtiene ese 6%?
Para realizar una compresión con pérdida, debemos en primer lugar elegir un parámetro δ, tal que aquellos valores de la matriz transformada que sean menores que dicho parámetro δ toman el valor 0 automáticamente.
Como podemos ver en la imagen transformada sin pérdida de información (que está más arriba en el punto anterior dibujada) ésta tiene cuatro elementos por debajo del δ elegido, por lo que el número de elementos a alterar o modificar en la elección de Con perdida de información será 4. Como el número de píxeles totales son 64, el índice que nos determina el grado de compresión queda:
Grado de compresión = (PIXELES MODIFICADOS / PIXELES TOTALES) * 100; de ahí sale el 6%,ya que 6/64 ronda aproximadamente el 6%.
Si observamos la imagen inversa, al haber despreciado información en la imagen transformada, no es posible recuperar por completo la imagen aunque, como podemos ver, sí conserva la topología, ya que se mantiene la recta diagonal principal aunque el tamaño de los píxeles haya variado:
El grado de compresión aumenta ya que se han alterado más elementos que antes en la imagen transformada, es por ello también que al aplicar la inversa no se recupera la imagen aunque también sigue conservando la topología:
Si realizamos tres iteraciones obtenemos como imagen transformada la siguiente:
Vemos como el grado de compresión sigue aumentando al haber variado mas todavía el numero de elementos alterados de la matriz imagen transformada:
Y al realizar la inversa, vemos que con este grado de compresión ya ni siquiera se recupera la topología de la imagen: