TFG Ailin Menendez Martinez
TFG Ailin Menendez Martinez
TFG Ailin Menendez Martinez
CURSO: 2018-2019
Autor: Ailín Menéndez Martínez
Tutora: Alfonsa García López
Herramientas MATLAB para el tratamiento de imágenes
Contenido
Contenido ................................................................................................................................. 1
Resumen................................................................................................................................... 2
Abstract. ................................................................................................................................... 2
Agradecimientos. ...................................................................................................................... 2
Listas/Siglas. ............................................................................................................................. 3
1. Prefacio. ............................................................................................................................ 4
2. Introducción. ..................................................................................................................... 5
3. Objetivos. .......................................................................................................................... 7
4. Justificación y metodología. .............................................................................................. 8
5. Instrucciones y herramientas MATLAB para el tratamiento de imágenes. .......................... 9
5.1 Instrucciones básicas. ...................................................................................................... 9
5.2 Toolbox de procesamiento de imágenes. ....................................................................... 12
5.2.1 Modo HDR: Rango Dinámico alto. ........................................................................... 12
6. Algoritmos de compresión de imágenes. ......................................................................... 15
6.1 Introducción. ................................................................................................................. 15
6.2 Algoritmo basado en SVD (Descomposición en Valores Singulares). ............................... 16
6.2.1 Definición de valores singulares de una matriz:....................................................... 16
6.1.2 Descomposición en valores singulares de una matriz: ............................................. 16
6.2.3 Utilidad de los valores singulares para comprimir una imagen: ............................... 17
6.3 Algoritmo JPEG. ........................................................................................................ 19
6.3.1 Transformación del espacio de color. ...................................................................... 20
6.3.2 Transformada discreta del coseno (DCT). ................................................................ 21
6.3.3 Cuantificación. ........................................................................................................ 22
6.3.4 Lectura de los bloques en zigzag. ............................................................................ 23
6.3.5 Ejemplo de compresión de imágenes usando el algoritmo JPEG con MATLAB. ........ 24
6.3.6 Ejemplo compresión JPEG para imágenes en color. ................................................. 25
6.4 Compresión wavelet basada en la transformada de Haar............................................... 26
6.4.1 Promedios y Diferencias. ........................................................................................ 26
6.4.2 Definición formal transformada de Haar. ................................................................ 27
6.4.3 Extendiéndolo a 2 dimensiones. ............................................................................. 28
7. Implementación. ............................................................................................................. 32
7.1 Función ValSing. ............................................................................................................ 32
7.2 Script JPEG_Grises.m. .................................................................................................... 32
1
Ailín Menéndez Martínez
Resumen.
En este proyecto de fin de carrera se muestra cómo funcionan algunas de las herramientas
MATLAB para el tratamiento de imágenes. Además, se ha incluido un análisis y comparación de
tres algoritmos para comprimir imágenes digitales. De esta forma podemos comprobar como
utilizando MATLAB y algoritmos matemáticos conseguimos implementaciones útiles para el
tratamiento de imágenes.
Abstract.
This PFG shows how are working some of MATLAB tools for image treatment. In addition,
analysis and comparison algorithm to compress digital images are included. In this way, using
MATLAB, we can confirm how can get useful implementations for images treatment.
Agradecimientos.
A mis padres, por darme mucho más de lo que podían para que terminase.
A Víctor, que me ha esperado todo este tiempo con paciencia y amor.
A mi familia en Cuba que les he sentido siempre cerca a pesar de los 7435 km de distancia.
A María Jesús, todo el que nos conoce sabe por qué. ¡Gracias!
A todos los profesores que he tenido durante esta carrera y en especial a Alfonsa, por su gran
vocación como maestra y su dedicación conmigo en este proyecto.
2
Herramientas MATLAB para el tratamiento de imágenes
Listas/Siglas.
3
Ailín Menéndez Martínez
1. Prefacio.
Como antelación, vamos a hacer una breve historia de un sistema que dio lugar
posteriormente a algunos algoritmos de compresión de datos.
Todo comenzó con Louis Braille, nacido en 1829 en Paris. Braille era ciego desde los 3 años y
con su ingenio creó un sistema para poder leer, sistema o código que todos conocemos hoy en
día como el sistema Braille [2] . Lo básico de este código es que cada carácter está formado
por un grupo de 3x2 pequeños círculos negros. Estos círculos están grabados en papel y
pueden ser al relieve (presentes) o lisos (ausentes).
Estos pequeños círculos son equivalentes a la información de un bit. Como resultado, el código
Braille es un código de 6 bits que puede ser representado por 64 símbolos (el código de 6
círculos negros planos representa el espacio en blanco).
Los seguidores del código Braille han modificado a lo largo de los años la manera de
comprender las palabras, por ejemplo, simplificando la forma de escribirlas. Una sola marca en
una letra aislada puede significar una palabra completa. Por ejemplo, la letra “b” por sí sola,
significa la palabra en inglés “but”, o la letra “p” la palabra en inglés “people” y así con muchas
otras.
Esto es una forma de comprimir el sistema para que, entendiéndose de la misma forma (y sin
perder información), la representación del mensaje en el papel sea más corta. Más adelante
esta idea fue una base para conseguir algoritmos que reduzcan el peso de los datos sin perder
información sustancial.
Figura 1.1.1: Sistema Braille de 26 letras. Figura 1.1.2: Algunas contracciones y palabras.
4
Herramientas MATLAB para el tratamiento de imágenes
2. Introducción.
Una de las herramientas más potentes que combina la utilización de algoritmos matemáticos
con la programación y el análisis de imágenes, es MATLAB.
La pregunta es: ¿Cómo reducir la información almacenada en una imagen de modo que la que
quede sea suficientemente relevante?
En 1993, la división de servicios de información de justicia penal del FBI desarrolló estándares
para la digitalización y compresión de huellas dactilares en cooperación con el Instituto
5
Ailín Menéndez Martínez
Por todo ello, entre otras cosas, en este PFG también analizaremos algoritmos que comprimen
imágenes ya que, si todas estas imágenes estuvieran comprimidas, ocuparían menos espacio y
el trabajo sería mucho más rápido y eficiente.
• Objetivos.
• Justificación y metodología.
• Instrucciones y herramientas MATLAB para el tratamiento de imágenes.
• Introducción a la descripción de los algoritmos de compresión de imágenes.
• Implementación.
• Pruebas.
• Análisis de resultados.
• Conclusiones y líneas de trabajo futuras.
• Referencias.
6
Herramientas MATLAB para el tratamiento de imágenes
3. Objetivos.
7
Ailín Menéndez Martínez
4. Justificación y metodología.
La elección de este trabajo de fin de grado ha sido mayoritariamente por mi interés por las
matemáticas y la fotografía. Poder aplicar el álgebra, que es una potentísima herramienta para
muchos campos de la informática en general y en concreto a la compresión de imágenes me
resulta fascinante.
8
Herramientas MATLAB para el tratamiento de imágenes
Con la instrucción imread podemos leer en MATLAB la imagen que se introduzca como
parámetro de entrada. La imagen debe encontrarse en el directorio de trabajo de MATLAB. Los
formatos de imagen soportados son: TIFF, JPEG, GIF, BMP, PNG, XWD. Una imagen de color
RGB se representa por tres matrices bidimensionales, la salida de la instrucción imread es un
array con tres canales, que contiene las tres matrices correspondientes a los planos R, G y B.
Para obtener cada una de estas matrices, basta acceder al tercer canal de la salida.
Por ejemplo:
Con la instrucción size, podemos saber el número de columnas (nc) y de filas (nf) de cada
matriz:
Podemos hacernos una idea de la información almacenada en cada una de las tres matrices,
con la Figura 5.1.1. Para obtenerla hemos utilizado el siguiente conjunto de instrucciones:
9
Ailín Menéndez Martínez
Los tipos de datos que podemos encontrar según la estructura de los pixeles [4] son:
- double: Doble precisión, números en punto flotante que varían en un rango aproximado de -
10308 a 10308 (8 bytes por elemento)
- uint8: Enteros de 8 bits en el rango de [0,255] (1 byte por elemento)
- uint16: Enteros de 16 bits en el rango de [0, 65535] (2 bytes por elemento)
- uint32: Enteros de 32 bits en el rango de [0, 4294967295] (4 bytes por
elemento)
- int8: Enteros de 8 bits en el rango de [-128, 127] (1 byte por elemento)
- int16: Enteros de 16 bits en el rango de [-32768, 32767] (2 bytes por elemento).
Para ver cómo cambiar de un tipo de dato a otros ver [4].
Ejemplo: Con las siguientes instrucciones, se lee una imagen RGB, se la convierte a escala de
grises y se representan conjuntamente.
10
Herramientas MATLAB para el tratamiento de imágenes
Existen varios tipos de espacio de color, por ejemplo, RGB, YCbCr… etc.
El algoritmo JPEG como veremos más adelante en la sección 6.3, utiliza el espacio de color
YCbCr para comprimir las imágenes.
Resultado:
11
Ailín Menéndez Martínez
Para poder trabajar con cada una de estas 3 matrices por separado podemos usar el siguiente
conjunto de instrucciones:
Navegando por Image Processing Toolbox™ [5] nos podemos dar cuenta que MATLAB
proporciona una amplia gama de apps integradas en él para el procesamiento y tratamiento
de imágenes de diferentes tipos, desde imágenes en blanco y negro, color, hasta imágenes en
3D.
Para leer la imagen HDR con la instrucción hdrread primeramente tenemos que tener una
imagen que sea .hdr, con una imagen .jpg o .tif por ejemplo, nos dará un error:
12
Herramientas MATLAB para el tratamiento de imágenes
La función tonemap convierte la imagen HDR en una imagen RGB de la clase uint8 [5].
Se puede apreciar que la imagen pasa de tonos oscuros y muchas sombras, a tonos demasiado
claros y quemados. Como esta conversión no fue del todo satisfactoria, se ha investigado
como mejorar la imagen convertida.
13
Ailín Menéndez Martínez
Buscando entre otras de las funciones para el tratamiento de imágenes HDR, se ha encontrado
una función parecida a tonemap llamada localtonemap, que se utiliza para mejorar el
contraste local, que produce la primera.
Esta diferencia entre el resultado de ambas funciones, se debe a que tonemap utiliza un
proceso llamado mapeo de tonos, para lograr un registro completo de todos los niveles de
brillo de la escena original, mientras que la función localtonemap utiliza el mismo proceso
mientras preserva su contraste local [5].
Cabe destacar que ajustando e incluyendo algunos parámetros más en la función tonemap,
también podemos conseguir un mejor contraste. RGB = tonemap(HDR,Name,Value)
permite que los parámetros controlen varios aspectos de la asignación de tonos.
14
Herramientas MATLAB para el tratamiento de imágenes
6.1 Introducción.
Los términos “zip”, “implode”,” stuffit” entre otros, son conocidos en el mundo de la
compresión de datos. Sin embargo, estos nombres no reflejan la naturaleza de lo que significa
este concepto. Comprimir una imagen no es “rellenar” o “exprimir”, pero sí eliminar
redundancias.
Esta redundancia podemos precisarla con lo que conocemos en matemática como información
teórica. Lo que nos concierne en este proyecto es la compresión de imágenes digitales, con lo
cual veremos cómo se aplica a este campo.
Tenemos dos tipos de redundancia en las imágenes digitales. El primer tipo se da en cada
imagen en particular ya que tenemos colores dominantes y otros menos frecuentes. Esta
redundancia puede ser eliminada asignando códigos de tamaño variable a los pixeles. El otro
tipo de redundancia es mucho más importante y se trata de la consecuencia de la correlación
de los pixeles.
Nuestros ojos se mueven alrededor de la imagen pixel a pixel, por lo tanto, en la mayoría de
los casos encontramos pixeles adyacentes de color similar.
Imaginemos una foto con un cielo azul, nubes blancas, montañas marrones y arboles verdes.
Mientras miramos, por ejemplo los árboles verdes, nuestro ojo tiende a ver todos los pixeles
adyacentes de un color similar (verde). Lo mismo ocurre con el cielo azul, los pixeles
adyacentes son todos tonos azules. Pero ¿qué ocurre cuando miramos al horizonte y se juntan
las montañas con el cielo? Vemos el color marrón y el azul diferentes a pesar de ser pixeles
adyacentes también, con lo cual podemos apreciar con este ejemplo como existe información
redundante y cuando hay otra que es más sensible e imposible de comprimir.
Independientemente del método que se use para comprimir la imagen, la efectividad depende
de la cantidad de redundancia que exista en dicha imagen. Un ejemplo extremo sería una
imagen de un solo color, aquí la compresión sería 100% efectiva, ya que todos los pixeles
adyacentes tienen el mismo color y son idénticos. El otro extremo es una imagen donde todos
los pixeles son de colores diferentes y por tanto no existe ninguna redundancia en la imagen
con lo cual no la podemos comprimir sin perder información relevante.
Estos dos son casos son extremos y no interesan demasiado, aunque pueden servir de
ejemplos para prácticas. Las imágenes que trataremos en este proyecto serán imágenes más
comunes, con paisajes, retratos, etc.
Actualmente, los métodos para comprimir imágenes son muy útiles ya que las compañías
trabajan con bases de datos extremadamente grandes.
15
Ailín Menéndez Martínez
La compresión con pérdida como bien dice su nombre, hace que perdamos información de la
foto original, lo que conlleva a una pérdida de calidad de la fotografía. Una vez realizada la
compresión, no se puede reconstruir la imagen exacta. Si bien se puede disponer de una
aproximación suficientemente buena para los propósitos de clasificación u otras tareas.
Por otro lado, la compresión sin pérdida no supone pérdida de información y permite la
reconstrucción exacta de la imagen original, pero requiere un mayor tiempo de proceso, ya
que es preciso realizar una fase de codificación y después otra de descodificación.
Una imagen digital, en escala de grises, con 𝑚 × 𝑛 pixeles se almacena mediante una matriz
de 𝑚 filas y 𝑛 columnas con números enteros entre 0 y 255, de modo que cada número
representa la intensidad del pixel correspondiente. Si la imagen es en color, se almacena
mediante tres matrices. Por tanto, los algoritmos de compresión que vamos a ver se basan en
transformaciones matriciales.
En esta sección presentamos un algoritmo de compresión con pérdida muy sencillo y eficaz,
basado en las propiedades de los valores singulares de una matriz.
Dada una matriz A€ 𝑅𝑛×𝑛 la SVD es una factorización de ésta. Para su definición y estudio
detallado se recomienda consultar [6] . Recogemos a continuación los resultados más
importantes, que la hacen útil en la compresión de imágenes.
16
Herramientas MATLAB para el tratamiento de imágenes
Ejemplo:
é 0 0 ù
ê ú é 9 0 ù
A= ê 0 9 ú AT A = ê ú
ê 3 0 ú ë 0 81 û
ë û
Como vemos, es una matriz simétrica, ya que es cuadrada y coincide con su traspuesta.
Podemos observar que el número de valores singulares no nulos coincide con el rango de la
matriz.
Av11 Av2 1
u1 = = [0 9 0]T = [0 1 0]T u2 = = [0 0 3]T = [0 0 1]T
s1 9 s2 3
0 0
0 1 9 0
Nuestras matrices son: 𝑉 = [ ] , 𝑈 = [1 0] , ∑ = [ ]
1 0 0 3
0 1
0 0
9 0 0 1
Comprobación: [1 0] · [ ]· [ ] = 𝐴
0 3 1 0
0 1
𝐴 = ∑ 𝜎𝑖 𝑢𝑖 𝑣𝑖𝑇
𝑖=1
Entonces la matriz de rango k<n más cercana a la matriz A con la norma euclídea es la matriz
𝐴𝑘 = ∑𝑘𝑖=1 𝜎𝑖 𝑢𝑖 𝑣𝑖𝑇 . Además ||𝐴 − 𝐴𝑘 ||2 = 𝜎𝑘+1
17
Ailín Menéndez Martínez
La idea del algoritmo es obtener k valores singulares de la matriz y aproximar la matriz A por
𝐴𝑘 . La implementación en MATLAB de este proceso es muy sencilla y se explica en el apartado
7.1
Nótese que para almacenar la matriz A son necesarios 𝑚 × 𝑛 números, mientras que 𝐴𝑘 se
puede almacenar guardando 𝑚 × 𝑘 números de los 𝑢𝑗 , los k valores singulares y 𝑘 × 𝑛
números de los 𝑣𝑗 . En total 𝑚 × 𝑘 + 𝑘 + 𝑘 × 𝑛 = 𝑘 (𝑚 + 𝑛 + 1) un número mucho más
pequeño que 𝑚 × 𝑛, cuando 𝑚 y 𝑛 son grandes. Además, se puede decidir el valor de k en
función del porcentaje de ahorro deseado.
Ejemplo: Este ejemplo ilustra cómo se puede comprimir una imagen, perrito.jpg, usando SVD.
Se han usado 50 VS, lo que ha dado lugar a un ahorro 82% y 20 VS con lo que se obtiene un
ahorro de 92 %.
Figura 6.1.1: Imagen original Figura 6.1.2: Con 50 VS Figura 6.1.3: Con 20 VS
Si la imagen es en color, se puede llevar cabo este proceso con cada una de las tres matrices
que la definen. En el ANEXO 10.1.2 podemos ver el código de la implementación para
conseguir esto.
Figura 6.1.4: Imagen original Figura 6.1.5: Con 50 VS (82%) Figura 6.1.6: Con 20 VS (92%)
18
Herramientas MATLAB para el tratamiento de imágenes
JPEG es el acrónimo de Joint Photographic Experts Group [2] Este estándar de compresión ha
sido el más ampliamente utilizado hasta el momento. Utiliza la transformada discreta del
coseno (DCT) para realizar una compresión con pérdidas aprovechando ciertas deficiencias del
ojo humano.
El grupo JPEG ha estado trabajando en las últimas décadas para establecer el primer estándar
internacional de compresión de imágenes digitales para imágenes fijas de tono continuo, tanto
en escala de grises como en color [7]
Una de las ventajas de JPEG es que existen muchos parámetros que permiten al usuario ajustar
la cantidad de datos perdidos en un rango muy amplio. Una de las características es la
flexibilidad a la hora de comprimir las imágenes, una gran pérdida de datos genera una
fotografía con una calidad muy baja, por el contrario la pérdida de pocos datos genera una
fotografía con una calidad buena y muy parecida a la original.
Este tipo de pérdida es acumulativa. Esto quiere decir que, si comprimimos una imagen y
volvemos a descomprimirla, se perderá calidad, pero si se vuelve a comprimir una imagen ya
comprimida se obtendrá una pérdida todavía mayor. Cada vez que comprimamos causará
mayor perdida en la calidad de la fotografía. Por ello no es conveniente en imágenes o gráficos
que tengan textos, líneas o bordes muy definidos, pero sí para archivos que contengan grandes
áreas de colores sólidos.
19
Ailín Menéndez Martínez
El diagrama de crominancia, Chromacity diagram [8] fue uno de los principales logros de la CIE
(Commission Internationale de l’Éclairage). Este diagrama muestra que no es necesario más de
tres parámetros para definir el color. El espacio de color más común es RGB, para tres
intensidades diferentes: rojo, verde y azul. Cada imagen se representa con tres matrices de
números enteros entre 0 y 255 (8 bits cada uno).
La CIE define un concepto que se refiere a la cantidad de luz que percibe el cerebro como
“luminancia”, basado en las características de la visión del ojo humano. La luminancia es un
concepto básico e importante en los campos de la compresión digital de imágenes.
El ojo humano es más sensible a los cambios de intensidad lumínica que a los cambios de
color, por eso es útil utilizar la luminancia como uno de los tres parámetros de un nuevo
espacio de color. Este parámetro se denota como “Y”. Para conseguir esto se resta Y de los
componentes azules y rojos del RGB y se utilizan los tres componentes Y, Cb=B – Y, Cr = R – Y.
20
Herramientas MATLAB para el tratamiento de imágenes
El algoritmo JPEG elige utilizar DCT por su buen rendimiento y porque no asume nada acerca
de la estructura de los datos que se comprimen. Se basa en la idea de que la DCT compacta la
energía de la señal en los primeros elementos, lo que permite, hacer la transformada,
prescindir de los últimos elementos para almacenarla y, a la hora de recuperar la imagen,
incluir ceros en las posiciones eliminadas, hacer la transformada inversa y recuperar una
imagen similar a la original.
En la literatura [9] se pueden encontrar distintas definiciones de la DCT con ligeras variantes.
En este TFG vamos a dar la usada el sistema MATLAB para la definición de sus funciones dct,
idct, dct2 e idct2.
Definición: Formalmente, la transformada discreta del coseno es una función lineal invertible
f : N → N (donde denota el conjunto de los números reales), que transforma una
lista de N datos [𝑥𝑘 ] , en otra lista [𝑓𝑘 ] definida por
𝑁−1
𝜋𝑘(2𝑛+1)
𝑓𝑘 = 2 ∑ 𝑥𝑛 𝑐𝑜𝑠 ( ) 0 ≤ k ≤ N-1
𝑛=0 2𝑁
La secuencia original [𝑥𝑘 ] se puede recuperar a partir de [𝑓𝑘 ] mediante la transformada inversa
del coseno, que se define por:
𝑁−1
1 𝜋𝑘(2𝑛 + 1)
𝑥𝑛 = ∑ β[k] 𝑓𝑘 𝑐𝑜𝑠 ( )
𝑁 2𝑁
𝑘=0
siendo
1
𝛽[𝑘] = {2 𝑠𝑖 𝑘 = 0
1 𝑠𝑖 𝑘 ≠ 0
21
Ailín Menéndez Martínez
Como queremos comprimir imágenes necesitamos actuar sobre una matriz con una
transformada bidimensional. La función dct2 de MATLAB calcula la DCT de una matriz A de M
filas y N columnas devolviendo otra matriz B del mismo tamaño, que se puede definir de la
forma:
6.3.3 Cuantificación.
Antes de aplicar la DCT, se forman bloques de matrices 8x8 con los coeficientes de la matriz
original, y se resta 128 a los elementos de cada bloque para tenerlos centrados en 0. Después
se aplica la DCT a cada uno de los bloques y se cuantifican los resultados. Esta cuantificación es
la que realmente comprime la imagen ya que permite convertir en cero, los valores pequeños
que se han obtenido al aplicar la DCT.
Sabemos que la DCT compacta la energía en los valores de la esquina superior izquierda de
cada matriz y que el resto de los valores son pequeños. Por tanto, cada número de los
coeficientes de la matriz DCT se divide por su correspondiente número de la “tabla de
cuantización” y se redondea. Esto es una operación irreversible.
Normalmente el algoritmo JPEG utiliza dos enfoques [2] :
22
Herramientas MATLAB para el tratamiento de imágenes
23
Ailín Menéndez Martínez
En esta sección, veremos un ejemplo de compresión de una imagen en escala de grises con el
algoritmo JPEG (ver ANEXO 10.2).
24
Herramientas MATLAB para el tratamiento de imágenes
En el anterior ejemplo se ha aplicado el algoritmo JPGE a una imagen en escala de grises, que
se representa mediante una sola matriz. Para una imagen de color tenemos tres matrices y,
tras aplicar la transformación de color, tendremos tres matrices A, B, C, de modo que en A se
almacena la luminancia (y se tratará del mismo modo que en el ejemplo anterior) y en B y C se
almacena la crominancia, donde las pérdidas son menos percibidas por el ojo humano.
Una opción que funciona es hacer ceros en la mayor parte de las entradas de matrices B y C.
Esto lo conseguimos dividiendo por un factor de muestreo, redondeando y volviendo a
multiplicar. En este ejemplo hemos utilizado 30 como factor. A la hora de enviar la imagen,
podemos eliminar todo lo que es cero, y así pesaría menos.
Para recuperarla, el receptor solo tendría que rellenar con ceros lo que falte.
En la Figura 6.3.7 podemos ver un ejemplo de aplicación de este proceso a una imagen en
color.
25
Ailín Menéndez Martínez
Wavelet es un método matemático sofisticado [8] [3] . La primera mención a wavelets aparece
en la tesis de Haar (1909). Una propiedad de la wavelet de Haar es que tiene soporte
compacto, lo que significa que se anula fuera de un intervalo finito. En 1985, Stephane Mallat
da un importante salto cualitativo en la teoría de wavelets, al aplicarla al procesado digital de
señal.
La transformada discreta Wavelet tiene muchas similitudes con la de Fourier. Ambos son
operadores lineales que se pueden computar de modo eficiente. Pero la diferencia más
significativa viene dada por el soporte compacto de la transformada de Haar, lo que la hace
útil en la compresión de imágenes.
El objetivo principal de esta sección es presentar, de la forma más sencilla posible, cómo se
aplica dicho método basado en la transformada de Haar para comprimir imágenes.
26
Herramientas MATLAB para el tratamiento de imágenes
Si los elementos están correlacionados los promedios serán parecidos y las diferencias
pequeñas. En el proceso iterativo aplicamos cada vez AvDif a la primera mitad. Si 𝑁 = 2𝑛 , en n
iteraciones tenemos en la primera posición el promedio de todo y en las demás diferencias.
𝑛 𝑛
1 − 2𝑛+1
∑ 2 = (∑ 2𝑖 ) − 1 =
𝑖
− 1 = 2𝑛+1 − 2 = 2(2𝑛 − 1) = 2(𝑁 − 1)
1−2
𝑖=1 𝑖=0
De acuerdo con la definición de [2] la transformada de Haar usa una función escalar 𝛷(𝑡) y
una ondular 𝜓(𝑡), con ambas se pueden conseguir un gran número de funciones 𝑓(𝑡).
∞ ∞ ∞
1, 0≤𝑥<1
𝛷(𝑡) = {
0, 𝑒𝑜𝑐
1, 0 ≤ 𝑡 < 0.5
𝜓(𝑡) = {
−1, 0.5 ≤ 𝑡 < 1
Aquí podemos ver que 𝜓(2𝑗 𝑡 − 𝑘) es una copia de 𝜓(𝑡) movido k unidades a la derecha y
escalado de tal manera que su ancho total es 1/2𝑗 .
Tanto 𝛷(2𝑗 𝑡 − 𝑘) como 𝜓(2𝑗 𝑡 − 𝑘) son distintos de cero en un intervalo 1/2𝑗 . Este intervalo
es el soporte compacto.
27
Ailín Menéndez Martínez
Hemos visto anteriormente que para una dimensión consiste en una serie de medias y
diferencias, por tanto, sabiendo esto podemos generalizarlo para 2 dimensiones también.
En la Figura 6.4.1 veremos cómo funciona el algoritmo comienza computando la
transformación wavelet de cada fila de la imagen.
Cada fila pasa por todas las iteraciones, hasta que el elemento de datos más a la izquierda de
la fila se transforma en un promedio y todos los demás elementos de datos se transforman en
diferencias.
La Transformada Wavelet, así como la transformada de Haar, hace subbandas. Esto significa
que dividen la imagen en regiones de tal manera que una región contiene grandes números
(promedios en el caso de la transformación Haar) y las otras regiones, contienen pequeños
números (diferencias). Sin embargo, estas regiones, que se denominan subbandas, son algo
más que conjuntos de números grandes y pequeños.
Ejemplo 1.
Supongamos que tenemos una imagen de 8x8 con pixeles de valor 12, excepto la línea vertical
con valor 14 y la horizontal con valor 16:
12 12 12 12 14 12 12 12 12 12 13 12 0 0 2 0 12 12 13 12 0 0 2 0
12 12 12 12 14 12 12 12 12 12 12 12 0 0 2 0 12 12 13 12 0 0 2 0
12 12 12 12 14 12 12 12 12 12 12 12 0 0 2 0 14 14 14 14 0 0 0 0
12 12 12 12 14 12 12 12 12 12 12 12 0 0 2 0 12 12 13 12 0 0 2 0
12 12 12 12 14 12 12 12 12 12 12 12 0 0 2 0 0 0 0 0 0 0 0 0
16 16 16 16 14 16 16 16 12 12 12 12 0 0 2 0 0 0 0 0 0 0 0 0
12 12 12 12 14 12 12 12 12 12 12 12 0 0 2 0 4 4 2 4 0 0 4 0
12 12 12 12 14 12 12 12 12 12 12 12 0 0 2 0 0 0 0 0 0 0 0 0
28
Herramientas MATLAB para el tratamiento de imágenes
1 1
2 0 0 0 0 0 0
2
1 1
0 0
2 2
0 0 0 0
1 1
0 0 0 0
2 2
0 0
0 1 1
0 0 0 0 0
2 2
W =
− 1 1
0 0 0 0 0 0
2 2
0 1 1
0 − 0 0 0 0
2 2
0 1 1
0 0 0 − 0 0
2 2
0 1 1
0 0 0 0 0 −
2 2
Como se puede ver esta matriz es ortonormal y por tanto su inversa coincide con su
traspuesta. Tras aplicar esta transformación, la información importante se acumula en la
esquina superior izquierda, ¼ de toda la matriz original. Como método de compresión se
almacenaría solo esta cuarta parte de la matriz y después, para recuperar la imagen se
completaría con ceros y se aplicaría la trasformación inversa H’*C*H.
Ejemplo 2.
29
Ailín Menéndez Martínez
Aplicando la trasformación inversa a esta matriz se obtiene una imagen similar a la original en
la que se ha conseguido un ahorro de un 75%.
30
Herramientas MATLAB para el tratamiento de imágenes
Se puede ver como la fotografía comprimida, tiene una buena calidad apreciativa. Además,
algunos de los errores que tiene la foto original, que está muy deteriorada, se han corregido al
comprimirla. Esto ocurre debido a cómo funciona el algoritmo de compresión de Haar ya que
en las zonas donde había perdido información, se rellenan con pixeles parecidos a los de su
alrededor, por tanto se unifican algunos tonos o manchas blancas que se aprecian en la cara
de las personas en la foto original.
Si se quiere conseguir mayor compresión, se puede hacer una segunda iteración aplicando la
trasformación de Haar con matriz de tamaño n/2 a la submatriz superior izquierda.
31
Ailín Menéndez Martínez
7. Implementación.
La función recibe como parámetros de entrada el porcentaje de ahorro deseado, que debe ser
un número entre 0 y 1 y una imagen en escala de grises.
K=round((1-ahorro)*EntradasM/(size(M,1)+size(M,2)+1))
Obtiene la descomposición con K valores singulares y reconstruye la imagen asociada a MK.
Tenemos un Script que lee una imagen en color y obtiene las tres matrices asociadas a RGB:
RGB = imread(foto);
La pasamos a escala de grises para trabajar con una sola matriz y obtenemos el número de filas
y columnas de A.
Suprimimos unas pocas filas y columnas, para que sean múltiplos de 8. Pasamos los datos de la
matriz a tipo numérico y les restamos 128 (para tenerlos centrados).
32
Herramientas MATLAB para el tratamiento de imágenes
M = [16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99] * q;
Aplicamos la DCT a cada bloque de 8x8 cuantificamos con el primer bucle for (Ver código en
ANEXO 10.6)
Para recuperar la imagen, aplicamos el proceso inverso, primero “descuantificamos” y luego
aplicamos la inversa de la DCT a cada bloque:
Por último, dibujamos la nueva imagen comprimida sumándole los 128 que habíamos quitado
al principio. Además, para dibujarla bien, se ha tenido que hacer una conversión de tipos, la
matriz comprimida era de tipo double y la pasamos a uint8 para poder sumarle los 128.
33
Ailín Menéndez Martínez
8. Pruebas.
Tenemos una batería de prueba de 10 imágenes. Se han convertido todas a escala de grises,
para agilizar el proceso y hacer las pruebas de forma más eficiente.
Además, para el algoritmo JPEG necesitamos que las dimensiones sean múltiplo de 8, ya que
va recorriendo bloques de 8x8, por ello hemos recortado cada fotografía antes del proceso de
compresión en cada algoritmo, quedando dimensiones múltiplo de 8, para que la comparación
se realizara con fotografías del mismo tamaño en cada caso y para cada algoritmo.
Para medir la calidad de las imágenes obtenidas hemos usado el Error cuadrático medio y el
índice de similitud estructural que están implementados como funciones de MATLAB:
1 2
𝑀𝑆𝐸 = (∑(𝑅𝑖𝑗 − 𝐴𝑖𝑗 ) )
𝑁
𝑖,𝑗
Es MSE es siempre mayor o igual que 0 y si es 0, significa que no hay error (A=R)
err = immse(X,Y) calcula el MSE entre los arrays X y Y. X y Y pueden ser matrices de
cualquier dimensión, pero deben ser del mismo tamaño y clase.
Esta medida objetiva es la más ampliamente usada como referencia de calidad ya que es fácil
de calcular. Pero tiene el inconveniente de que no se ajusta a la percepción visual. Puede
haber imágenes muy diferentes con el mismo MSE, ya que hay errores que el ojo humano
percibe más que otros.
Esta medida, basada en la información estructural, pretende ser un índice de calidad más
acorde con la percepción visual. Dado que la estructura de una escena no depende de la
34
Herramientas MATLAB para el tratamiento de imágenes
ssimval = ssim(A,R) calcula el valor del índice de similitud estructural (SSIM) para la
imagnen asociada a la matriz A, utilizando R como imagen de referencia.
A y R deben ser dos matrices del mismo orden, que corresponden a la imagen original (R) y a la
la imagen distorsionada (A). Se obtiene un número entre 0 y 1. Si sale 1 la similitud es total.
• Aplicar el algoritmo SVD primero con un ahorro del 10% y después con un ahorro del
90% a cada imagen.
• Aplicar el algoritmo JPEG, con dos parámetros de calidad diferentes (Q=1 y Q=5),
midiendo el ahorro obtenido en cada caso.
• Aplicar el algoritmo de Haar con una y dos iteraciones, lo que supone ahorros
respectivos del 75% y del 94%.
Se han realizado todas las medias de los valores estudiados foto a foto y los resultados se
pueden consultar en el ANEXO 10.9.
En la segunda columna vemos los parámetros de entrada para cada algoritmo. Se ha probado
el algoritmo SVD con un ahorro del 10% y otro del 90%, en todos los casos el usuario puede
introducir el ahorro o la calidad, según el algoritmo, que desee. En el JPEG hemos usado una
calidad de 1 y otra de 5, para que se notara que, a mayor numero, peor calidad. Y por último el
algoritmo de Haar se ha probado con una iteración y dos iteraciones.
Para el tiempo de ejecución, el MSE y el SSIM se han hecho las medias de todos los resultados
de las imágenes para cada algoritmo.
35
Ailín Menéndez Martínez
Calidad
Algoritmo Parámetros Tiempo Ejecución (MSE) (SSIM) Ahorro
apreciativa
2 buena
A= 0.9 2.66 𝑠 −4 0.84 5 mala 90%
9.61 ∗ 10
3 regular
2 buena
Q=5 12.24 𝑠 20.65 ∗ 103 0.0017 2 mala 96.6%
6 regular
9 buena
Haar Iteración 1 1.89 𝑠 5.94 ∗ 10−4 0.84 75%
1 mala
1 buena
Iteración 2 2.02 𝑠 0.35 0.10 6 mala 94%
3 regular
Tabla de comparación de los algoritmos de compresión.
36
Herramientas MATLAB para el tratamiento de imágenes
9. Análisis de resultados.
En general, los tres algoritmos funcionan bastante bien en cuanto al resultado final en
comparación con la fotografía original, siempre que la pérdida no sea muy grande.
Por otro lado, la velocidad de ejecución de cada algoritmo es diferente. El más veloz de todos
es el HAAR, al igual que la mejor calidad para las fotos comprimidas. A pesar de todo esto, hay
que tener en cuenta, que no solo se mide el tiempo que tarda el algoritmo, sino lo que tarde
MATLAB en ese momento en ejecutar, ya aquí entran otros factores como la velocidad de
nuestro ordenador o la cantidad de programas ejecutándose en segundo plano que haya en el
momento de medir la velocidad de ejecución de algoritmo. Uno de los algoritmos sí es
notablemente más lento que el resto, este es JPEG.
Esto ocurre porque dicho algoritmo está implementado de forma que recorre las matrices
asociadas a las imágenes, por tanto a mayor tamaño de imagen, más tiempo de cómputo.
Además, cabe destacar que MATLAB no funciona de forma óptima a la hora de tratar bucles
for, pero si para multiplicar matrices. Es por esto que, el resto de los algoritmos vistos, se
ejecutan de forma más rápida, porque precisamente lo que hacen es la multiplicación de
matrices.
Por último, si miramos el error cuadrático medio en el algoritmo JPEG, vemos que es un
número muy grande, con lo cual esto nos indicaría que la diferencia entre la fotografía original
y la comprimida, es demasiado alta. Sin embargo, a simple vista no notamos esas grandes
diferencias, por ello aunque el MSE es alto, la calidad apreciativa es buena. También podemos
observar que el índice de similitud estructural si es acorde al resultado visual, tal y como nos
indica la descripción del SSIM.
37
Ailín Menéndez Martínez
MATLAB es una herramienta muy potente. Una de las posibilidades que ofrece es multiplicar
grandes matrices, en segundos. Como sabemos, las imágenes están formadas por pixeles, que
forman entre todos matrices de diferentes dimensiones. MATLAB puede multiplicar todas
estas matrices y trabajar con ellas de forma muy veloz, lo que convierte esta herramienta en
una buena solución para el tratamiento de imágenes.
Además, gracias a que MATLAB cuenta con un repositorio de funciones útiles para el
tratamiento de imágenes, como la función immse y ssim, vistas anteriormente. Hemos
podido valorar la calidad de las imágenes comprimidas no solo de forma apreciativa y rápida,
sino con una comparación basada en cálculos matemáticos. Ha sido de mucha utilidad poder
implementar los algoritmos de compresión usando las funciones propias de MATLAB como la
DCT y su inversa.
Es probable que la implementación del algoritmo JPEG no sea óptima, ya que como hemos
dicho anteriormente, MATLAB es más eficiente multiplicando matrices, y para este algoritmo
hemos utilizado bucles for para recorrer las matrices. Como idea para futuros lectores, se
podría haber realizado una implementación basada en multiplicaciones de matrices u otro
camino diferente.
Para saber si podemos utilizar una imagen hay que conocer su propiedad intelectual [13]. Los
derechos de autor de una imagen limitan el uso que se puede hacer de ellas.
• Derechos de autor
• Obligaciones de los usuarios de imágenes
• Derechos de las personas que aparecen en las imágenes
Para respetar la primera se han utilizado imágenes de bancos gratuitos de Internet [14].
También se han elegido imágenes en las que no aparezcan personas de modo claro o explícito
o hemos contado con la autorización
38
Herramientas MATLAB para el tratamiento de imágenes
Uno de los tratamientos de imágenes que hemos explicado en este proyecto consiste en la
compresión de estas. La compresión de imágenes ayuda a paliar las dificultades de
almacenamiento, ahorrando espacio y disminuyendo el tiempo de computo.
Por otro lado, este proyecto forma parte de una línea de clasificación de imágenes, que se
podría usar con fines de investigación médica. Estas son llamadas imágenes diagnosticas, y son
el conjunto de estudio que, mediante la tecnología, obtienen y procesan imágenes del cuerpo
humano [15]:.
39
Ailín Menéndez Martínez
11. Referencias.
[3] Graps, A. “An introduction to Wavelets”. IEEE Computer Society, Vol.2, No.2, 1995.
[4] Medrano Garfia, B. Procesamiento de imágenes con MATLAB, Notas de Clase. Universidad
de Sevilla, 2014. Accesible en http://personal.us.es/majiro/2014_10_10_clase2.pdf. Fecha de
consulta: 30/05/2019)
[5] Math Works Incl. “Image Processing Toolbox”. Accesible en
https://es.mathworks.com/products/image.html. Fecha de consulta: 31/05/2019.
[6] Demmel, JW. “Applied Numerical lineal Algebra”, SIAM, 1997.
[7] Wallas, Gregory K. “The JPEG still picture compression standard”, IEEE Transactions on
Consumer Electronics, Vol. 38, No.1, 1992.
[8] Salomon, D.S. “Computer Graphics and Geometric Modeling”. Springer-Verlag, 1999.
[9] Oppenheim, A.V., Schafer, R. W., Buck, J, R. “Tratamiento de señales en tiempo discreto”.
Prentice Hall, 1999.
[12]: Zhou, W., A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli. "Image Qualifty Assessment:
From Error Visibility to Structural Similarity." IEEE Transactions on Image Processing. Vol. 13,
Issue 4, April 2004, pp. 600–612.
[13]: Ayuda Ley Proteccion de datos, “Privacidad digital de las imágenes”. Accesible en:
https://ayudaleyprotecciondatos.es/2018/11/16/privacidad-digital-
imagenes/#Que_es_la_privacidad_digital_de_las_imagenes
Fecha de consulta: 26/05/2019.
[14]: Public domain images of high quality. “Fotografias de dominio público”. Accesible en
https://www.publicdomainpictures.net/en/. Fecha de consulta 30/05/2019.
40
Herramientas MATLAB para el tratamiento de imágenes
Figura 6.1.1: Elaboración propia. Imagen a color original se puede consultar en:
https://www.pinterest.es/pin/611011874417007738/
Figura 6.3.1: Wallas, Gregory K. “ The JPEG still picture compression standard”, IEEE
Transactions on Consumer Electronics, Vol. 38, No.1, 1992.
Figura 6.3.6: Elaboración propia: La foto original en color ha sido obtenida de:
http://webipedia.es/2018/05/02/videojuegos-clasicos-super-mario-bros/
Figura 6.3.7: Elaboración propia: La foto original en color ha sido obtenida de:
http://webipedia.es/2018/05/02/videojuegos-clasicos-super-mario-bros/
41
Ailín Menéndez Martínez
Figura 6.4.2: Elaboración propia. Se ha obtenido el consentimiento de las personas que salen
en dicha fotografía o de sus familiares.
Figura 6.4.3: Elaboración propia. Se ha obtenido el consentimiento de las personas que salen
en dicha fotografía o de sus familiares.
Figura 6.4.4: Elaboración propia. Se ha obtenido el consentimiento de las personas que salen
en dicha fotografía o de sus familiares.
Figura 6.4.5: Elaboración propia. Se ha obtenido el consentimiento de las personas que salen
en dicha fotografía o de sus familiares.
42