TFG Ailin Menendez Martinez

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 43

GRADO EN INGENIERÍA DE COMPUTADORES

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

7.3 Script Transformada de Haar. ........................................................................................ 33


8. Pruebas. .......................................................................................................................... 34
9. Análisis de resultados. ..................................................................................................... 37
10. Conclusiones y líneas de trabajo futuras. ..................................................................... 38
11. Referencias. ................................................................................................................ 40

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.

• PFG: Proyecto de fin de grado.


• MATLAB: MATrix LABoratory.
• IDE: Entorno de Desarrollo Integrado.
• GUI: Interfaces de usuarios.
• Toolbox: Entorno de desarrollo.
• HDR: High Dynamic Range.
• VS: Valores Singulares.
• DCT: Discrete Cosine Transform.
• RGB: Referente al Espacio de color (Red, Green, Blue).
• JPEG: Joint Photographic Experts Group.
• SVD: Descomposición en valores singulares.
• MSE: Mean-squared-error. (Error cuadrático medio).
• SSIM: Structural similarity. (Indice de similitude estructural).
• HDR: High Dynamic Range. (Rango dinámico alto).

3
Ailín Menéndez Martínez

1. Prefacio.

El sistema MATLAB [1] es un software matemático ampliamente utilizado en ingeniería, con


muchas prestaciones relativas al tratamiento de imágenes, una disciplina muy demandada en
la actualidad. Este trabajo fin de grado (PFG) inicia una línea de estudio de herramientas
MATLAB para el tratamiento de imágenes y además la presentación de algunas de las
capacidades del sistema en el desarrollo y análisis de algunos algoritmos de compresión.

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.

La importancia del tratamiento de imágenes hoy en día no es un tema banal. En muchos


ámbitos profesionales y comerciales se utilizan imágenes para su clasificación y posterior
tratamiento.

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.

MATLAB, es la abreviatura de MaTrix Laboratory. Es un sistema de cómputo numérico que


ofrece un entorno de desarrollo integrado (IDE) y un lenguaje de programación propio
(lenguaje M).

Entre sus prestaciones básicas se hallan: la manipulación de matrices, la representación de


datos y funciones, la implementación de algoritmos, la creación de interfaces de usuario (GUI)
y la comunicación con programas en otros lenguajes. Además, se pueden ampliar las
capacidades de MATLAB con las cajas de herramientas (toolboxes). Para el caso de
manipulación de imágenes se emplea el toolbox “Image Processing”.

La clasificación de imágenes hace referencia a la forma de extraer clases de acuerdo con


determinada información. Hoy en día se utilizan este tipo de clasificaciones. Por ejemplo, para
publicidad, muchas veces se utiliza la clasificación de imágenes para ofrecer al cliente un
producto adecuado a sus gustos y necesidades. Algunos algoritmos de búsqueda de Google
también utilizan clasificación de imágenes.

La clasificación de imágenes requiere gran capacidad de cómputo y muchos recursos, ya que


precisa manejar documentos muy pesados. Cabe plantearse si se puede aligerar esta tarea
mediante la compresión con pérdida de las imágenes.

La pregunta es: ¿Cómo reducir la información almacenada en una imagen de modo que la que
quede sea suficientemente relevante?

Como ejemplo que ilustra el impacto social de la compresión de imágenes, de cara a la


clasificación, se puede comentar el siguiente ejemplo encontrado en [3] .

Entre 1924 y hoy, la oficina federal de investigación de EE.UU. ha recolectado alrededor de 30


millones de imágenes de huellas dactilares. Tienen principalmente impresiones en papel de
dichas huellas dactilares. Los escaneos de las impresiones se distribuyen entre los organismos
encargados de hacer cumplir la ley, pero la calidad de la digitalización suele ser baja. Debido a
que varias jurisdicciones están experimentando con el almacenamiento digital de las
impresiones, las incompatibilidades entre formatos de datos se han convertido recientemente
en un problema. Este problema llevó a que la comunidad de la justicia penal adoptara una
norma de digitalización y compresión.

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

Nacional de Estándares y Tecnología, el Laboratorio Nacional de Los Álamos, vendedores


comerciales y comunidades de justicia penal.

Vamos a poner el problema de almacenamiento de datos en perspectiva. Las imágenes de las


huellas dactilares se digitalizan a una resolución de 500 píxeles por pulgada con 256 niveles de
información en escala de grises por píxel. Una sola huella dactilar tiene unos 700.000 píxeles y
necesita unos 0,6 Mbyte para almacenarse. Un par de manos, entonces, requiere cerca de 6
Mbyte de almacenamiento. Así que digitalizar el archivo actual del FBI daría como resultado
unos 200 terabytes de datos. (Nótese que al precio actual es de unos 900 dólares por Gbyte
para el almacenamiento en el disco duro, el coste de almacenar estas imágenes sin comprimir
sería de unos 200 millones de dólares).

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.

A continuación, veremos cómo está estructurada la memoria a partir de ahora:

• 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.

El objetivo general de este PFG es el aprendizaje del funcionamiento de algunas herramientas


de MATLAB para el tratamiento de imágenes, así como la implementación y el análisis de
distintos algoritmos de compresión, con pérdida, de imágenes digitales.

Como objetivos específicos cabe señalar:

1. Adquirir destreza en el uso del sistema MATLAB y conocer algunas de sus


posibilidades.
2. Aprender algunos de los algoritmos de compresión de imágenes más utilizados y
entender su fundamento matemático.
3. Diseñar y aplicar una metodología experimental para el análisis y comparación de los
distintos algoritmos estudiados.

7
Ailín Menéndez Martínez

4. Justificación y metodología.

MATLAB es una herramienta muy utilizada en el tratamiento de imágenes, y este es un tema


interesante en diferentes aspectos de nuestra vida cotidiana. Analizando las propias imágenes
guardadas en su teléfono o las de sus búsquedas, se puede saber si una persona tiene
preferencia por un tipo de producto u otro. El tratamiento de una gran cantidad de imágenes
requiere muchos recursos de memoria y tiempo de cómputo. Un primer paso puede ser
comprimir las imágenes para almacenarlas más fácilmente.

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.

El PFG se ha llevado a cabo de acuerdo con las siguientes fases:

1. Documentación y estudio de las herramientas.


2. Implementación en MATLAB de los distintos algoritmos.
3. Diseño y desarrollo de pruebas.
4. Análisis de resultados y obtención de conclusiones.

8
Herramientas MATLAB para el tratamiento de imágenes

5. Instrucciones y herramientas MATLAB para


el tratamiento de imágenes.

5.1 Instrucciones básicas.

• Leer una imagen:

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:

[nc,nf] = size (A)

Figura 5.1.1: Representación de las imágenes RGB.

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].

• Poner una imagen RGB en escala de grises:

La instrucción de MATLAB rgb2gray convierte una imagen en color a escala de grises.

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

Como resultado se obtiene la Figura 5.1.2:

Figura 5.1.2: Conversión de una imagen en color a escala de grises.

• Transformación del espacio de color:

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.

La instrucción rgb2ycbcr convierte el espacio de color RGB en YCbCr. A continuación, se


muestra un ejemplo (ver Figura 5.1.3)

Resultado:

Figura 5.1.3: Transformación del espacio de color.

11
Ailín Menéndez Martínez

Cuando ejecutamos la instrucción rgb2ycbcr obtenemos 3 matrices diferentes,


correspondiente a cada tono del espacio de color YCbCr (Luminancia (Y), crominancia en azul
(Cb) y crominancia en rojo (Cr)).

Para poder trabajar con cada una de estas 3 matrices por separado podemos usar el siguiente
conjunto de instrucciones:

Y obtendremos cada matriz por separado, para su correspondiente procesamiento.

5.2 Toolbox de procesamiento de imágenes.

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.

Estas apps permiten automatizar los flujos de trabajo habituales de procesamiento de


imágenes. Puede segmentar datos de imagen, comparar técnicas de registro de imágenes y
procesar por lotes conjuntos de datos extensos de forma interactiva. Las apps y las funciones
de visualización le permiten explorar imágenes, volúmenes 3D y vídeos, ajustar el contraste,
crear histogramas y manipular regiones de interés.

5.2.1 Modo HDR: Rango Dinámico alto.

Para adquisición e importación de datos.


Podemos importar videos e imágenes generados por una amplia gama de dispositivos.
En este ejemplo podemos ver cómo mostrar una imagen de alto rango dinámico (HDR).
Para ver una imagen HDR, primero debe convertir los datos a un rango dinámico que pueda
visualizarse correctamente en un ordenador, usando hdrread.

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

Figura 5.2.1: Imagen HDR original con muchas sombras.

La función tonemap convierte la imagen HDR en una imagen RGB de la clase uint8 [5].

Al visualizar la imagen original y la convertida con la función tonemap, obtenemos:

Figura 5.2.2: Imagen HDR original y convertida con la función tonemap.

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.

Veamos un ejemplo con la misma imagen de antes:

Figura 5.2.3: Imagen HDR original y convertida con la función localtonemap.

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.

Diferencia entre resultados de ambas funciones:

Figura 5.2.4: Diferencia de resultado entre función tonemap y localtonemap.

14
Herramientas MATLAB para el tratamiento de imágenes

6. Algoritmos de compresión 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.

Existen dos tipos de compresión, con pérdida y sin pérdida [2] .

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.

6.2 Algoritmo basado en SVD (Descomposición en Valores Singulares).

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.

Sabemos, por conocimientos básicos de Álgebra Lineal, que el producto 𝐴𝑡 𝐴, donde 𝐴𝑡 es la


matriz traspuesta de A, es una matriz cuadrada y simétrica, por lo tanto es diagonalizabe,
todos sus autovalores son mayores o iguales que cero y admite una base ortonormal de
autovectores.

6.2.1 Definición de valores singulares de una matriz: Sean 𝜆1 ≥ 𝜆2 ≥ ⋯ 𝜆𝑛 ≥ 0 los


autovalores de la matriz 𝐴𝑇 𝐴 ordenados de mayor a menor. Entonces σ𝑖 = √𝜆𝑖 es el i-ésimo
valor singular de la matriz 𝐴.

6.2.2 Descomposición en valores singulares de una matriz: Toda matriz A de tamaño


𝑚 × 𝑛 (con 𝑚 ≥ 𝑛) se puede factorizar en la forma 𝐴 = 𝑈 ∑ 𝑉 𝑡 donde U es una matriz
𝑚 × 𝑛, con 𝑈 𝑡 𝑈 = 𝐼𝑛 , donde V es una matriz 𝑛 × 𝑛, ortogonal, con 𝑉 𝑡 𝑉 = 𝐼𝑛 y
∑ = diag( σ1 , σ2 , … σ𝑛 ) es una matriz diagonal, con los valores singulares de la matriz A
escritos de mayor a menor.

Además, el rango de la matriz 𝐴 coincide con la cantidad de valores singulares no nulos.

A la factorización 𝐴 = 𝑈 ∑ 𝑉 𝑡 se le denomina SVD de A. Las columnas {𝑣1 , … . , 𝑣𝑛 } de la matriz


V se llaman vectores singulares.

Si 𝑚 < 𝑛, la descomposición se hace, considerando 𝐴𝑡 .

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.

Los autovalores de la matriz 𝐴𝑇 𝐴 son 𝜆1 = 81 ∧ 𝜆2 = 9, asociados a los autovectores


ortogonales 𝑉1 = [0 1]𝑇 ∧ 𝑉2 = [1 0]𝑇 .

Entonces los valores singulares de A son σ1 = √81 = 9 ∧ σ2 = √9 = 3.

Podemos observar que el número de valores singulares no nulos coincide con el rango de la
matriz.

A continuación, buscamos los vectores 𝑢𝑗 que deberán cumplir 𝐴𝑣𝑗= 𝜎𝑗 𝑢𝑗

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

6.2.3 Utilidad de los valores singulares para comprimir una imagen: Si σ1 , σ2 , … σ𝑟


son los r valores singulares no nulos, ordenados de manera decreciente los vectores 𝑣𝑗 son las
columnas de la matriz V y 𝑢𝑗 denotan las columnas de U, la matriz A puede escribirse como
combinación lineal de matrices de rango 1 tal que:
𝑟

𝐴 = ∑ 𝜎𝑖 𝑢𝑖 𝑣𝑖𝑇
𝑖=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 %.

La Figura 6.1.1 muestra la imagen original. Las imágenes resultantes de la compresión se


pueden ver en las Figuras 6.1.2 y 6.1.3. Además, el código MATLAB puede encontrarse en el
ANEXO 10.1.1.

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.

A continuación, veremos el resultado de la ejecución para una imagen en color y su porcentaje


de ahorro:

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

6.3 Algoritmo JPEG.

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.

El ojo humano es sensible a pequeños cambios de luminancia, pero no de crominancia. De esta


manera, las partes de crominancia pueden perder muchos datos y, por lo tanto, ser altamente
comprimidas sin afectar visualmente la calidad de la imagen en general. Este método funciona
muy bien con imágenes de tonos continuos, donde los pixeles adyacentes tienen un color
similar. Por este motivo para aplicar el algoritmo JPEG a una imagen en color, en primer lugar,
transformaremos el espacio de color y actuaremos de modo diferente con la matriz de
luminancia que con las de crominancia.

La secuencia de operaciones que realiza un compresor JPEG son las siguientes:

• Transformación del espacio de color de RGB a YCbCr.


• División de la imagen en bloques de 8x8 píxeles.
• Aplicación de la transformada discreta del coseno (DCT) a cada bloque.
• Cuantificación.
• Lectura de los bloques en zigzag.

El esquema de la Figura 6.3.1 muestra el funcionamiento del algoritmo:

19
Ailín Menéndez Martínez

Figura 6.3.1: DCT-Based Decoder Processing Steps.

6.3.1 Transformación del espacio de color.

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.

Según los resultados de muchos experimentos, la luminancia es la suma ponderada de los


pesos de los colores rojo, verde y azul, que son respectivamente 77/256, 150/256 y 29/256.

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.

El espacio de color YCbCr se consigue de la siguiente forma:

𝑌 = (77/256)𝑅 + (150/256)𝐺 + (29/256)𝐵

𝐶𝑏 = − (44/256)𝑅 – (87/256)𝐺 + (131/256)𝐵 + 128

𝐶𝑟 = (131/256)𝑅 – (110/256)𝐺 – (21/256)𝐵 + 128

20
Herramientas MATLAB para el tratamiento de imágenes

Figura 6.3.2: Espacio de color RGB transformado a YCbCr.

6.3.2 Transformada discreta del coseno (DCT).

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:

Características útiles para la compresión de imágenes:

• La DCT verifica la igualdad de Parseval (conservación de la energía). Además, tiene una


buena capacidad de compactación de la energía al dominio transformado, es decir,
que la transformada de coseno discreta consigue concentrar la mayor parte de la
información en pocos coeficientes transformados.
• La transformación es independiente de los datos. El algoritmo aplicado no varía con los
datos que recibe, como si sucede en otros algoritmos de compresión.
• Hay implementaciones eficientes para calcular la DCT
• Produce pocos errores en los límites de los bloques imagen. La minimización de los
errores a los bloques imagen permite reducir el efecto de bloque en las imágenes
reconstruidas.

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

1. Tablas de cuantización por defecto. Una tabla para la luminancia (que es la


misma que se utiliza para imágenes en escala de grises) y otra para los
componentes de la crominancia. Donde podemos ver en las Figura 5.3 como los
números aumentan a medida que nos movemos de la esquina superior
izquierda a la inferior derecha.
2. Una simple tabla de cuantización que se calcula basándose en un parámetro R
suministrado por el usuario. Una simple expresión como 𝑄𝑖𝑗 = 1 + (𝑖 + 𝑗 ) 𝑥 𝑅
garantiza que los coeficientes de cuantización empiecen con números pequeños
en la esquina superior izquierda y se hagan más grande hacia la esquina inferior
derecha.

Figura 6.3.3: Cuantificación luminancia Figura 6.3.4 Cuantificación crominancia

En este trabajo hemos utilizado el primer enfoque, pero multiplicando la matriz de


cuantificación por un parámetro de calidad fijo, suministrado por el usuario.
Si la cuantización se realiza correctamente, muy pocos números que no sean ceros quedarán en
el bloque de coeficientes del DCT, y normalmente se concentrarán en la parte superior izquierda.
Estos números son la salida de JPEG, pero se comprimen aún más antes de ser escritos en el
archivo de salida.

6.3.4 Lectura de los bloques en zigzag.


Se recorren los 64 números de la matriz en zigzag (Ver Figura 6.3.5). Esto produce una cadena
de 64 números que comienzan con números distintos de cero y normalmente finalizan con
muchos ceros consecutivos. Todos estos ceros finales serán sustituidos por un único elemento
de final de bloque (EOB: end of block) eliminando gran cantidad de elementos a transmitir o
almacenar.

Figura 6.3.5: Recorrido en zigzag por la matriz cuantificada.

23
Ailín Menéndez Martínez

6.3.5 Ejemplo de compresión de imágenes usando el algoritmo JPEG con MATLAB.

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).

En primer lugar, se decide el parámetro de calidad por el que se va a multiplicar la matriz de


cuantificación. Hay que tener en cuenta que cuanto más cercano al 0 menor es la pérdida y
mayor la calidad de la foto comprimida, y cuanto más grande es el número la calidad
disminuye, pero aumenta el porcentaje de ahorro.

Para una calidad q=3 obtenemos las imágenes de la Figura 6.3.6.


A la izquierda aparece la imagen original en escala de grises y a la derecha la imagen
comprimida, donde podemos apreciar claramente la pérdida de calidad. En este caso el ahorro
ha sido del 94.02 %, que podemos calcularlo con las instrucciones de MATLAB:

Figura 6.3.6: Imagen original y comprimida en escala de grises.

24
Herramientas MATLAB para el tratamiento de imágenes

6.3.6 Ejemplo compresión JPEG para imágenes en color.

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.

De esta manera trabajamos con la matriz A en su totalidad (comprimiéndola con el algoritmo


JPEG), y haciendo un muestreo de las matrices B y C. Podemos consultar el código en el ANEXO
10.3.

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

Figura 6.3.7: Imagen original vs imagen comprimida en color.

Obtenemos un ahorro del 69.32%.

6.4 Compresión wavelet basada en la transformada de Haar.

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.

6.4.1 Promedios y Diferencias.

Vamos a comenzar con un array dimensional de N valores 𝐴 = [𝑎1 … . . 𝑎𝑁 ] en el que N es


potencia de 2.

Primero calculamos los N/2 promedios y después las N/2 diferencias:

26
Herramientas MATLAB para el tratamiento de imágenes

𝑎1 +𝑎2 𝑎3 +𝑎4 𝑎𝑁−1 +𝑎𝑁 𝑎1 −𝑎2 𝑎 −𝑎


𝐴𝑣𝐷𝑖𝑓 (𝐴) = [ , ,… , … . . , 𝑁−1 𝑁 ]
2 2 2 2 2

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.

La complejidad podemos calcularla de la siguiente forma:

𝑛 𝑛
1 − 2𝑛+1
∑ 2 = (∑ 2𝑖 ) − 1 =
𝑖
− 1 = 2𝑛+1 − 2 = 2(2𝑛 − 1) = 2(𝑁 − 1)
1−2
𝑖=1 𝑖=0

Se concluye que la complejidad es O(N).

6.4.2 Definición formal transformada de Haar.

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 𝑓(𝑡).
∞ ∞ ∞

𝑓(𝑡) = ∑ 𝑐𝑘 𝛷 (𝑡 − 𝑘) + ∑ ∑ 𝑑𝑗,𝑘 𝜓(2𝑗 𝑡 − 𝑘)


𝑘=−∞ 𝑘=−∞ 𝑗=0

Donde 𝑐𝑘 y 𝑑𝑗,𝑘 son coeficientes que deben calcularse en cada caso.

La función escalar básica 𝛷(𝑡) es el pulso unitario:

1, 0≤𝑥<1
𝛷(𝑡) = {
0, 𝑒𝑜𝑐

La función 𝛷 (𝑡 − 𝑘) es una copia de 𝛷(𝑡), movido 𝑘 unidades a la derecha. De igual manera,


𝛷(2𝑡 − 𝑘) es una copia de 𝛷(𝑡 − 𝑘) escalado a la mitad el ancho de 𝛷(𝑡 − 𝑘). Las copias a
escala se utilizan para aproximar 𝑓(𝑡) a una resolución más alta.

La función básica Haar wavelet paso a paso es:

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

6.4.3 Extendiéndolo a 2 dimensiones.

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.

Figura 6.4.1: Transformada Wavelet y descomposición.

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

Matriz A Matriz B Matriz C

28
Herramientas MATLAB para el tratamiento de imágenes

La aplicación a una matriz A de este proceso se puede automatizar haciendo C=W*A*W’,


donde W es la matriz de Haar, que para dimensión 8 se define como:

 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.

Si cargamos una imagen, en escala de grises, en MATLAB y le aplicamos el proceso anterior


(ANEXO 10.4) podemos ver cómo la información importante en ¼ de la fotografía.
Con la instrucción imshow(M) la visualizamos:

Figura 6.4.2: Foto antigua completa e información importante acumulada en ¼ de la


fotografía.

29
Ailín Menéndez Martínez

Se puede ver cómo se acumula la información importante de la imagen en la esquina superior


izquierda.
Las partes claras de la foto se aprecian muy quemadas, y además toda la parte oscura tiene
aún tonos blancos ya que los números no son todos ceros.
Para reconstruir la imagen completa, debemos hacer el proceso inverso.
Primero creamos una matriz C toda de ceros, la cual utilizaremos para rellenar las tres cuartas
partes de la matriz que no se han almacenado.
Quedándonos como resultado, la fotografía de la Figura 6.4.3, donde podemos apreciar como
toda la parte negra, es completamente negra, es decir, todo ceros.

Figura 6.4.3: Haciendo ceros en todo menos en el cuarto superior izquierdo.

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%.

Figura 6.4.4: Imagen original Figura 6.4.5: Imagen comprimida

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.

7.1 Función ValSing.

El algoritmo de compresión mediante valores singulares, lo hemos implementado en MATLAB


a través de la función ValSing, cuyo código se puede ver en el ANEXO 10.5 Esta función hace la
descomposición en valores singulares de una matriz, por lo que se puede aplicar directamente
a imágenes en escala de grises. Para imágenes en color habría que aplicarla para las tres
matrices.

En el ejemplo de la sección 6.1 introducíamos el número de valores singulares que queríamos y


comprimíamos una imagen. En este caso, la función ValSing, según el ahorro que queremos,
calcula el número de valores singulares necesarios para conseguirlo.

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.

Internamente, lee la imagen y obtiene la matriz M asociada, calcula el número K de valores


singulares necesarios para conseguir el ahorro deseado, mediante la fórmula:

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.

7.2 Script JPEG_Grises.m.

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).

Definimos la matriz de cuantificación que multiplicaremos por el factor de calidad q.

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.

7.3 Script Transformada de Haar.

Para aplicar la transformada de Haar, en primer lugar se ha definido una función


MatrizHaar(n) (ver ANEXO 10.7) que recibe como parámetro un entero n par y calcula la
matriz de Haar W de dimensión n. Después se ha creado un script llamado HAAR.m (ANEXO
10.8) en el que primeramente, leemos todas las fotografías .tif que tenemos en nuestro
espacio de trabajo MATLAB. Luego vamos leyendo cada imagen con la instrucción ya conocida,
imread(imagen). Después, las convertimos a grises, para quedarnos simplemente con una
sola matriz por imagen
El siguiente paso es ver qué tamaño de filas y columnas tienen las matrices, con la instrucción
size.
Queremos que las fotografías tengan igual número de filas que de columnas, para que queden
cuadradas. Por lo tanto, definimos una variable
n= min(nf,nc) y recortamos la matriz con las dimensiones que hemos dicho
anteriormente. Una vez recortada le aplicamos la trasformación de Haar y hacemos el
producto B= W*M*W’, donde M es la matriz de la imagen recortada y W es la matriz de
Haar de orden n. Después de la multiplicación, tendremos toda la información interesante en
¼ de la matriz.
La matriz B, aún tiene números distintos de cero en todo lo que no es el cuarto importante.
Pero para comprimir se prescinde de estos datos y se almacena solo la submatriz B1 formada
por la esquina superior izquierda.
Para recuperar la imagen completamos con ceros la matriz B1 hasta formar una matriz C de
dimensión n y multiplicamos H=W’*C*W.
Para una iteración el ahorro es 75%.
Se puede hacer una segunda iteración, aplicando la trasformada de Haar de orden n/2 a la
matriz B1, con lo que se consigue un ahorro del 94 %.

33
Ailín Menéndez Martínez

8. Pruebas.

A continuación, vamos a realizar una comparación de los algoritmos de compresión de


imágenes estudiados anteriormente. Con el fin de obtener información sobre los tiempos de
ejecución de cada uno y la calidad con la que se comprimen las imágenes, haciendo una
comparación tanto perceptiva como calculada.

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:

Error cuadrático medio (MSE)

1 2
𝑀𝑆𝐸 = (∑(𝑅𝑖𝑗 − 𝐴𝑖𝑗 ) )
𝑁
𝑖,𝑗

R es la matriz de la imagen de referencia y A es la matriz de la imagen recuperada tras la


compresión, N es el número total de entradas.

Es MSE es siempre mayor o igual que 0 y si es 0, significa que no hay error (A=R)

MATLAB lo tiene implementado en la función immse.

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.

Índice de similitud estructural (SSIM)

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

iluminación, el SSIM mide la estructura de los objetos en la imagen, independientemente de la


luminancia y el contraste [12]:

MATLAB tiene implementado este índice en la función ssim.

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.

La calidad apreciativa se valora como:

• Buena: No notamos a penas diferencia con la fotografía original.


• Regular: Se nota la pérdida en algunas zonas, pero la calidad es buena.
• Mala: La fotografía pierde mucho, y podemos notarlo claramente.

Para calcular el tiempo de ejecución se ha utilizado el temporizador de cronómetro de


MATLAB “tic” y “toc”. Se pone “tic” en el sitio del código donde queremos que empiece a
contar y “toc” cuando queremos que termine de contar.

Las pruebas realizadas han sido:

• 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 siguiente tabla se resumen los resultados de la comparación foto a foto hecha en el


ANEXO 10.9, para cada algoritmo.

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.

Para la calidad apreciativa se recoge el número de imágenes en cada categoría, el porcentaje


de ahorro de SVD y Haar es siempre el mismo, pero para JPEG se han calculado las medias
aritméticas de cada ahorro obtenido.

35
Ailín Menéndez Martínez

Calidad
Algoritmo Parámetros Tiempo Ejecución (MSE) (SSIM) Ahorro
apreciativa

SVD A= 0.1 3.35 𝑠 1.3 ∗ 10−5 0.99 10 buena 10%

2 buena
A= 0.9 2.66 𝑠 −4 0.84 5 mala 90%
9.61 ∗ 10
3 regular

JPEG Q=1 12.47 𝑠 21.01 ∗ 103 5.4 ∗ 10−3 10 buena 92.7%

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.

Para ahorros superiores al 80% en el algoritmo SVD, o un parámetro Q de más de 5 en el


algoritmo JPEG, la pérdida calidad de la imagen comprimida es muy notable. Sin embargo, para
el algoritmo de Haar, la primera iteración la realiza con una buena calidad en la mayoría de los
casos (9 a 1), pero para 2 iteraciones ya se nota la pérdida y la calidad de la imagen es peor,
pero nótese que en este caso el ahorro es del 94% del peso de la imagen.

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

10. Conclusiones y líneas de trabajo futuras.

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.

El tratamiento de imágenes es utilizado continuamente en internet. Los usuarios suben y


publican fotografías que pueden ser vistas por todo el que tenga acceso. Todo esto, tiene una
gran utilidad a la hora de realizar pruebas para la clasificación de imágenes y posibles trabajos
futuros en diversas ramas que utilizarán dichas fotografías. Una pregunta sobre el tratamiento
de estas imágenes y el acceso a ellas, es si están realmente protegidas.

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.

Dentro de la privacidad digital de las imágenes encontramos:

• 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

Además de todo lo anterior, se recomienda hacer copias de seguridad de las fotografías


almacenadas en varios soportes.

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]:.

En resumen, todo el tratamiento de imágenes en general, así como la compresión de éstas,


nos puede servir para trabajos futuros que abren una línea de estudio más allá del simple
hecho de ahorrar espacio. El tiempo de cómputo global, así como la facilidad de trabajar con
bancos enormes de datos si estos están comprimidos, claramente reducen un tiempo que
podremos ganar en investigaciones para futuros experimentos de la ciencia.

39
Ailín Menéndez Martínez

11. Referencias.

Las referencias se han puesto por orden de aparición en la memoria:

[1] MathWorks Incl. “MATLAB. Descripción general”. Accesible en


https://la.mathworks.com/products/matlab.html. Fecha de consulta 30/05/2019.
[2] Salomon, D.S., “Data compression methods”. Springer, 2001.

[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.

[15]: “Imágenes diagnósticas: Conceptos y generalidades”. Accesible en:


http://www.bvs.hn/RFCM/pdf/2014/pdf/RFCMVol11-1-2014-6.pdf
Fecha de consulta: 30/05/2019.

40
Herramientas MATLAB para el tratamiento de imágenes

Referencias a las Figuras:

Figura 1.1.1: http://www.elheraldo.com.ar/noticias/166295_el-sistema-braille-y-el-uso-del-


baston.html

Figura 1.1.2: http://tiflologia.blogspot.com/2005/09/el-sistema-braille-y-su-enseanza-


hoy.html

Figura 5.1.1: Elaboración propia.

Figura 5.1.2: Elaboración propia.

Figura 5.1.3: Elaboración propia.

Figura 5.2.1: Elaboración propia.

Figura 5.2.2: Elaboración propia.

Figura 5.2.3: Elaboración propia.

Figura 5.2.4: Elaboración propia.

Figura 6.1.1: Elaboración propia. Imagen a color original se puede consultar en:
https://www.pinterest.es/pin/611011874417007738/

Figura 6.1.2: Elaboración propia.

Figura 6.1.3: Elaboración propia.

Figura 6.1.4: https://www.pinterest.es/pin/611011874417007738/

Figura 6.1.5: Elaboración propia.

Figura 6.1.6: Elaboración propia.

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.2: https://www.hisour.com/es/ycbcr-color-spaces-26075/

Figura 6.3.3: https://www.researchgate.net/figure/Figure-25-the-Q-matrix-for-luminance-and-


chrominance-components-25_fig2_321732825

Figura 6.3.4: https://www.researchgate.net/figure/Figure-25-the-Q-matrix-for-luminance-and-


chrominance-components-25_fig2_321732825

Figura 6.3.5: https://www.glc.us.es/~jalonso/exercitium/matriz-zigzagueante/

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.1: https://www.semanticscholar.org/paper/A-Survey-on-Lifting-based-Discrete-


Wavelet-Acharya-Chakrabarti/9726fa0c6d4d512adea84ce1adf49dfa7c25478e

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

También podría gustarte