248
UNIVERSIDAD POLIT ´ ECNICA DE MADRID ESCUELA T ´ ECNICA SUPERIOR DE INGENIEROS DE TELECOMUNICACI ´ ON PROYECTO DE FIN DE CARRERA Desarrollo de Algoritmos de Optimizaci´ on Visual en Im´ agenes edicas Rafael Redondo Tejedor Junio 2002

DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Embed Size (px)

Citation preview

Page 1: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

UNIVERSIDAD POLITECNICA DE MADRIDESCUELA TECNICA SUPERIOR DE INGENIEROS

DE TELECOMUNICACION

PROYECTO DE FIN DE CARRERA

Desarrollo de Algoritmos deOptimizacion Visual en Imagenes

Medicas

Rafael Redondo Tejedor

Junio 2002

Page 2: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos
Page 3: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

UNIVERSIDAD POLITECNICA DE MADRID

ESCUELA TECNICA SUPERIOR DE INGENIEROS

DE TELECOMUNICACION

PROYECTO DE FIN DE CARRERA

TITULO : DESARROLLO DE ALGORITMOS DE

OPTIMIZACION VISUAL EN

IMAGENES MEDICAS

AUTOR : RAFAEL REDONDO TEJEDOR

TUTOR : GABRIEL CRISTOBAL PEREZ

TRIBUNAL :

PRESIDENTE : ANDRES DE SANTOS Y LLEO

VOCAL : JAVIER FERREIROS LOPEZ

SECRETARIA : MARIA JESUS LEDESMA CARBAYO

FECHA DE LECTURA :

CALIFICACION :

Departamento de Ingenierıa Electronica (E.T.S.I.T.)

Instituto de Optica “Daza de Valdes” (C.S.I.C.)

Madrid, Junio 2002

Page 4: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos
Page 5: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

1

Resumen :

El objetivo del proyecto es desarrollar un metodo de compresion de imagenes utilizando

los ultimos conocimientos del Sistema Visual Humano. En concreto se usaran modelos

neuronales de la region V1 del Cortex Visual desarrollados por Matthias Keil en el Instituto

de Optica (C.S.I.C.). La idea de utilizar estos metodos, dentro de lo que se viene llamando

metodos perceptuales, es la de aprovechar las caracterısticas de dicho SVH para que los

artefactos derivados de la compresion no sean visibles, o cuanto menos mejor. La formacion

de imagenes retinales se obtiene por la interaccion de las diferentes respuestas de las diferentes

neuronas retinales, esta interaccion es determinante en el tipo de imagenes que se obtienen

y por tanto en la forma de percibir de nuestro cerebro, es decir, lo que ve y no ve y como

lo ve. En base a esto se ha desarrollado un metodo de codificacion de busqueda de cadenas

con codigos Huffman y Aritmeticos justificando la eleccion en las caracterısticas de dichas

imagenes retinales.

Otro gran bloque del proyecto es la implentacion del un Toolbox grafico para Matlab

del nuevo estandar de codificacion de imagenes JPEG2000 desarollado por JPEG (Joint

Photographic Experts Group). La base de este estandar es la transformada Wavelet, la

cual se ha extendido a innumerables campos en los ultimos anos. Se hara una introduccion

a la transformada y una breve explicacion de los aspectos mas relevantes del estandar y

novedosos, como los metodos perceptuales que utiliza y difrenciacion de zonas de mayor

calidad de compresion.

Por ultimo se comparan los metodos en el caso de imagenes medicas, haciendo un repaso

previo del tipo de imagenes medicas y sus principales caracterısticas.

Palabras Clave1:

Compresion de Imagenes, Modelos Perceptuales, codificacion de cadenas, codificacion

Aritmetica, Wavelets.

1A lo largo del texto se utilizan terminos traducidos al castellano con su acronimo ingles entre parentesis.

Page 6: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2

Page 7: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3

AGRADECIMIENTOS

A mis padres por educarme y quererme, no necesariamente en ese orden, y a mi hermano.

A todos los que han estado a mi lado en este tiempo, por aguantar el vendaval.

A la gente del ’Insti’, me robaron un pedazo.

A todos los que alimentaron mi vida.

Page 8: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4

Page 9: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Indice General

1 Introduccion 21

1.1 Estado del Arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

1.2 Objetivos del Proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

1.3 Estructura del Proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2 Codificacion de Imagenes Perceptuales 25

2.1 Introduccion a los Modelos Perceptuales . . . . . . . . . . . . . . . . . . . . 25

2.2 Modelo Neuronal M.Keil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.3 Codificacion Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

2.3.1 Obtencion Progresiva de Codigos . . . . . . . . . . . . . . . . . . . . 38

2.3.2 Codificacion Adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . 39

2.3.3 Precision del Intervalo . . . . . . . . . . . . . . . . . . . . . . . . . . 43

2.3.4 Final de Codificacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

2.4 Codificacion de Imagenes Retinianas . . . . . . . . . . . . . . . . . . . . . . 44

2.4.1 Separacion Bordes-Texturas . . . . . . . . . . . . . . . . . . . . . . . 45

2.4.2 Codificacion de Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . 48

2.4.3 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

2.4.4 Observaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

3 Estandar JPEG2000 81

3.1 Introduccion e Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

3.2 Caracterısticas Principales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

3.2.1 Pre-Tratamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

3.2.2 Transformada Wavelet (WT) . . . . . . . . . . . . . . . . . . . . . . 85

5

Page 10: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

6 INDICE GENERAL

3.2.3 Cuantizacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

3.2.4 Codificacion de Entropıa . . . . . . . . . . . . . . . . . . . . . . . . . 97

3.3 Organizacion de Trama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

3.3.1 Sistema de Coordenadas . . . . . . . . . . . . . . . . . . . . . . . . . 102

3.3.2 Bloques y Precintos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

3.3.3 Capas, Paquetes y Cabeceras . . . . . . . . . . . . . . . . . . . . . . 103

3.3.4 Ordenacion de la trama (Orden de progresion) . . . . . . . . . . . . . 104

3.4 Control de Tasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

3.4.1 Control de Tasa Utilizando Q-Tabla . . . . . . . . . . . . . . . . . . . 107

3.4.2 Control de Tasa Utilizando EBCOT . . . . . . . . . . . . . . . . . . . 107

3.5 Extensiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

3.5.1 Regiones de Interes (ROI) . . . . . . . . . . . . . . . . . . . . . . . . 110

3.5.2 Resistencia al Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

3.5.3 Cuantizacion con Codificacion Trellis . . . . . . . . . . . . . . . . . . 112

3.5.4 Metodos Perceptuales . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

3.5.5 Fragmentacion o Tiling (SSWT) . . . . . . . . . . . . . . . . . . . . . 116

3.5.6 Tratamiento Post-Compresion . . . . . . . . . . . . . . . . . . . . . . 117

3.6 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

3.6.1 Resultados con Perdidas (lossy) . . . . . . . . . . . . . . . . . . . . . 118

3.6.2 Resultados sin Perdidas (lossless) . . . . . . . . . . . . . . . . . . . . 121

3.6.3 Resultados de la Codificacion de Entropıa . . . . . . . . . . . . . . . 122

4 Toolbox JPEG2000 (J2MT) 125

4.1 Introduccion al J2MT c© . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

4.2 Descripcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

4.2.1 Aspectos Tecnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

4.2.2 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

4.2.3 Transformada Wavelet . . . . . . . . . . . . . . . . . . . . . . . . . . 129

4.2.4 Codificacion I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

4.2.5 Codificacion II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

4.2.6 ROI & Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

4.2.7 Tasas y Medidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Page 11: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

INDICE GENERAL 7

4.2.8 Funciones No Implementadas . . . . . . . . . . . . . . . . . . . . . . 136

4.2.9 Diagrama de Flujos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

4.3 Ejemplos con J2MT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

4.4 Observaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

5 Imagenes Medicas 143

5.1 Introduccion a las Imagenes Medicas . . . . . . . . . . . . . . . . . . . . . . 143

5.2 Tipos de Imagenes Medicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

5.2.1 Imagenes de Radiografıa . . . . . . . . . . . . . . . . . . . . . . . . . 144

5.2.2 Imagenes por Ultrasonidos . . . . . . . . . . . . . . . . . . . . . . . . 147

5.2.3 Tomografıa Axial Computerizada . . . . . . . . . . . . . . . . . . . . 148

5.2.4 Medicina Nuclear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

5.2.5 Resonancia Magnetica . . . . . . . . . . . . . . . . . . . . . . . . . . 155

5.2.6 Resumen de Caraterısticas . . . . . . . . . . . . . . . . . . . . . . . . 156

5.3 Compresion de Imagenes Medicas con JPEG2000 . . . . . . . . . . . . . . . 156

5.3.1 Compresion Sin Perdidas . . . . . . . . . . . . . . . . . . . . . . . . . 157

5.3.2 Compresion Con Perdidas y ROI . . . . . . . . . . . . . . . . . . . . 160

6 Conclusiones 165

7 Anexos 173

7.1 Anexo A: Presentacion del J2MT en Genova . . . . . . . . . . . . . . . . . . 173

7.2 Anexo B: Lista de los parametros JPEG2000 . . . . . . . . . . . . . . . . . . 186

7.3 Anexo C: Funciones J2MT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

7.4 Anexo D: Funciones de la Codificacion de Cadenas . . . . . . . . . . . . . . 221

Page 12: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

8 INDICE GENERAL

Page 13: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Indice de Figuras

2.1 Partes de una neurona. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2.2 Representacion del Sistema Visual Humano. . . . . . . . . . . . . . . . . . . 27

2.3 Imagen de Picard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.4 Celulas retinianas ON y OFF. . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.5 Respuestas retinianas. a. Celula ON. b. Celula OFF. . . . . . . . . . . . . . 29

2.6 Ejemplo de obtencion de imagenes retinianas de contraste con imagen test de

escalera de luminancia. a Escalera de luminancia. b. Imagen de contraste

ON, activacion en los incrementos de luminosidad. c. Imagen de contraste

OFF, activacion en los decrementos de luminosidad. . . . . . . . . . . . . . . 30

2.7 Ejemplo de resonstruccion con filtros DOG. . . . . . . . . . . . . . . . . . . 31

2.8 Ejemplo de resonstruccion con filling in de la escalera de luminancia. . . . . 31

2.9 Modulacion de luminancia local con la informacion de contraste. . . . . . . . 32

2.10 Modelo de analisis retiniano propuesto por M. Keil. . . . . . . . . . . . . . . 32

2.11 Ejemplos de deteccion de bordes mediante modelos de simetrıa celular impar.

Informacion para la reconstruccion de superficies. . . . . . . . . . . . . . . . 33

2.12 Ejemplos de deteccion de texturas mediante modelos de simetrıa celular par.

Informacion para la reconstruccion de texturas. . . . . . . . . . . . . . . . . 33

2.13 Ejemplo de reconstruccion con filling in a partir de la informacion de contraste. 34

2.14 Ejemplos de ilusiones opticas. a. Efecto de White. b. Bandas de Mach. . . . 34

2.15 Subdivision de intervalos en la codificacion Aritmetica. . . . . . . . . . . . . 37

2.16 Metodo para obtener progresivamente la codificacion Aritmetica antes del final

de la codificacion. (a) Sin expansion. (b) Expansion en intervalo [0,1/2). (c)

Expansion en intervalo [1/2,1). (d) Expansion en intervalo [1/4,3/2). . . . . 39

2.17 Diagrama de la codificacin de imagenes retinianas. . . . . . . . . . . . . . . . 44

2.18 Imagenes retinianas de Lena (256x256). a. Original. b. ON. c. OFF. . . . . 46

9

Page 14: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

10 INDICE DE FIGURAS

2.19 Mascaras empleadas en la separacion de bordes y texturas para la orientecion

horizontal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

2.20 Resultado de la obtencion de bordes en la imagen retiniana de lena (ON) con

misma cantidad de entropıa (1.5 bpp).a Mascara de 3x3. b Mascara de 5x5.

c Mascara de 7x7. Las imagenes tienen un realce log(1 + x). . . . . . . . . . 47

2.21 Relacion entre la cantidad de informacion de bordes y texturas (bpp) en fun-

cion del umbral utilizado en la deteccion de lıneas. . . . . . . . . . . . . . . . 47

2.22 Separacion entre bordes y texturas con la mascara 5x5 y diferentes umbrales.

a Umbral 0.05%.b Umbral 3%. c Umbral al 8%.d Umbral 20%. e Umbral 50%. 48

2.23 Ejemplo de busqueda de una cadena. . . . . . . . . . . . . . . . . . . . . . . 49

2.24 Formacion de cadenas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

2.25 Esquemas de codificacion DPCM. a Codificador. b Decodificador. . . . . . . 51

2.26 Distribucion Laplaciana (µ = 0,σ = 5). . . . . . . . . . . . . . . . . . . . . . 51

2.27 Distribuciones de las codificaciones DPCM de las amplitudes de las cabezas y

del resto de pıxeles de las cadenas. El trazo negro representa la aproximacion

realizada. a DPCM cabezas σ2 = 273.929. b DPCM cadenas σ2 = 195.569. . 55

2.28 Analisis de las longitudes resultantes de la codificacion aritmetica con bloques

de 32 sımbolos. a Longitudes en bits. b Longitudes diferenciales. . . . . . . . 60

2.29 Movimientos relativos posibles en la codificacion de pıxeles dentro de una

cadena. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

2.30 Distribucion de probabilidades de los movimientos relativos posibles obtenida

con la imagen retiniana de lena (ON) y con un umbral en la separacion de

bordes de 5%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

2.31 Probabilidad de los movimientos dentro de las cadenas con metodo de busqueda

de cadenas totalmente aleatorio. Imagen ’caliente’ de lena. Cuanto mas

proximo es el movimiento a la direccion frontal, movimiento 4, mas caliente o

roja es. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

2.32 Movimientos posibles en la codificacion de las cabezas en funcion de su posi-

cion. a. Borde izquierdo. b. Borde derecho. c. Borde inferior. d. Ninguno

de los anteriores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

2.33 Movimientos posibles en la codificacion de pıxeles dentro de una cadena al

encontrase con el borde de la imagen. Las flechas indican los movimientos

para una determinada aproximacion. Habrıa otras cuatro posibles que son

justamente los pıxeles que indican las flechas. . . . . . . . . . . . . . . . . . 64

Page 15: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

INDICE DE FIGURAS 11

2.34 Codificacion diferencial de la posicion de las cabezas de las cadenas. . . . . . 65

2.35 Distribucion de probabilidades de la diferencia de posiciones entre las cabezas

obtenidas con la imagen retiniana de lena (ON)de 256x256. a Columnas. b

Filas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

2.36 Diagrama de la codificacion de cadenas. . . . . . . . . . . . . . . . . . . . . . 68

2.37 Imagen test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

2.38 Imagenes de prueba con su imagen retiniana de bordes (ON). a. Pimientos.

b. Pimientos Retiniano (ON). c. MIT. d. MIT Retiniano (ON). . . . . . . . 71

2.39 Tasas de compresion de Lena retiniana 256x256 separada en posicion y am-

plitud de las cabezas, movimientos y amplitudes restantes. . . . . . . . . . . 72

2.40 Tasas de compresion de Pimientos retiniano 256x256. . . . . . . . . . . . . . 73

2.41 Tasas de compresion de MIT retiniano 256x256. . . . . . . . . . . . . . . . . 73

2.42 Tasas totales de compresion para distintos tamanos de bloque. a. Lena. b.

Pimientos. c. MIT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

2.43 Tiempo de calculo de la codificacion de cadenas en funcion del tamano de

bloque. Los valores son una media de los valores obtenidos para las imagenes

de 256x256 de Lena, Pimientos y MIT. . . . . . . . . . . . . . . . . . . . . . 74

2.44 Reconstruccion de Lena a 1.9 bpp. a. Original.b. Retiniana. c. JPEG. . . . 76

2.45 Reconstruccion de los Pimientos a 2.55 bpp. a. Original.b. Retiniana. c.

JPEG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

2.46 Reconstruccion de MIT a 3.07 bpp. a. Original.b. Retiniana. c. JPEG. . . 77

2.47 Ampliacion de las imagenes de los Pimientos. a. Original.b. Retiniana. c.

JPEG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

3.1 Diagrama de Bloques JPEG2000. . . . . . . . . . . . . . . . . . . . . . . . . 83

3.2 Ejemplos de filtros ortonormales. (a) Meyer. (b) y (c) Battle-Lemarie. (d)

Haar. (e) y (f) Daubechies.[7]. . . . . . . . . . . . . . . . . . . . . . . . . . . 91

3.3 Esquema de prediccion/actualizacion lifting para filtro (5,3). . . . . . . . . . 93

3.4 Esquema de prediccion/actualizacion lifting para filtro (9,7). . . . . . . . . . 94

3.5 Esquema lifting generico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

3.6 Cuantificador uniforme con zona muerta variable. . . . . . . . . . . . . . . . 96

3.7 Orden de codificacion de los coeficientes. . . . . . . . . . . . . . . . . . . . . 99

3.8 Vecinos involucrados en la codificacion ZC. . . . . . . . . . . . . . . . . . . . 99

Page 16: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

12 INDICE DE FIGURAS

3.9 Sistema de coordenadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

3.10 Ejemplo de descomposicion en bloques y precintos. . . . . . . . . . . . . . . 103

3.11 Cabeceras de los paquetes en la trama de compresion final. . . . . . . . . . . 104

3.12 Ejemplos de ordenacion de paquetes. a. Organizacion en resolucion progresi-

va. b. Organizacion en SNR progresivo. . . . . . . . . . . . . . . . . . . . . . 105

3.13 Ejemplo de Progresion LRCP, 0.125 bpp(izda.) y 0.50 bpp(dcha.) . . . . . . 106

3.14 Ejemplo de Progresion RLCP. . . . . . . . . . . . . . . . . . . . . . . . . . . 106

3.15 Ejemplo de PCRL (4 bloques). . . . . . . . . . . . . . . . . . . . . . . . . . . 107

3.16 Relacion Tasa-Distorsion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

3.17 Solape de Varias ROI en el dominio Wavelet. . . . . . . . . . . . . . . . . . . 111

3.18 Resultado de la correccion de contraste. izq. Funcion de transformacion

Sigmoidal. dech. Cuantizacion No Linear resultante. . . . . . . . . . . . . . 113

3.19 Vecinos significativos ’x’ de una region N=5. . . . . . . . . . . . . . . . . . . 115

3.20 Extension de los coeficientes simetricamente. . . . . . . . . . . . . . . . . . . 116

3.21 Fotos-test (2560x2048) elegidas por el estandar JPEG2000. . . . . . . . . . . 117

3.22 Relacion Tasa-PSNR en funcion del tamano de bloque. . . . . . . . . . . . . 118

3.23 Relacion Tasa-PSNR en funcion de los filtros Reversible (5,3) y No Reversible

(9,7). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

3.24 Relacion Tasa-PSNR en funcion de los Niveles Wavelet. . . . . . . . . . . . . 119

3.25 Relacion Tasa-PSNR en funcion Codificacion Sencilla, Paralela y Sencilla-

Paralela. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

3.26 Relacion Tasa-PSNR en funcion comparando JPEG2000 vs. JPEG. . . . . . 121

3.27 Grafica de progreso en la codificacion de 11 planos de bit. . . . . . . . . . . . 122

3.28 Progresion de tasas y medidas en la codificacion de 11 planos de bit. . . . . . 123

4.1 Detalle del menu Imagen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

4.2 Detalle del menu AyudaJ2MT. . . . . . . . . . . . . . . . . . . . . . . . . . . 129

4.3 Detalle de los parametros para la Transformada Wavelet. . . . . . . . . . . . 130

4.4 Ejemplo de descomposicion waveletde 5 niveles. . . . . . . . . . . . . . . . . 131

4.5 Ejemplo de descomposicion wavelet de 1 nivel. . . . . . . . . . . . . . . . . . 131

4.6 Ejemplos de descomposiciones. a. Mallat.b. Spacl.c. Packet. . . . . . . . . . 132

4.7 Detalles de los parametros en la opcion Codificacion I. . . . . . . . . . . . . 132

Page 17: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

INDICE DE FIGURAS 13

4.8 Detalles de los parametros en la opcion Codificacion II. . . . . . . . . . . . . 133

4.9 Ejemplo de seleccion de una ROI cuadrada. . . . . . . . . . . . . . . . . . . 134

4.10 Detalles de los parametros en la opcion ROI & Color. . . . . . . . . . . . . . 135

4.11 Detalle de las tasas medidas en J2MT. . . . . . . . . . . . . . . . . . . . . . 136

4.12 Diagrama de flujos de la aplicacion J2MT. . . . . . . . . . . . . . . . . . . . 137

4.13 Imagen original con 8 bpp y 256x256 de tamano. . . . . . . . . . . . . . . . . 137

4.14 Compresion a 1.5 bpp. (a) Filtro (9,7) 45.69 dB. (b) Filtro (5,3) 44.32 dB. . 138

4.15 Compresion (9,7). (a) 0.3 bpp 43.46 dB. (b) 0.1 bpp 42.35 dB. . . . . . . . 138

4.16 Compresion a 0.1 bpp. (a) 7 niveles 42.31 dB. (b) 1 nivel 31.69 dB. . . . . . 138

4.17 Compresion a 0.1 bpp. (a) Mallat 42.35 dB.(b) Packet 40.79 dB. . . . . . . 139

4.18 Compresion a 0.1 bpp. (a) Todas la resistencias al error 38.54 dB. (b) Ademas

con paralela, causal y sencilla 40.79 dB. . . . . . . . . . . . . . . . . . . . . . 139

4.19 Codificacion Trellis. (a) 0.1 bpp. (b.) 0.3 bpp. . . . . . . . . . . . . . . . . 140

4.20 Mascara Perceptual: α = 0.7, β = 0.2, bits=5, N = 7 respetando los los

bordes de los bloques. (a) 0.3 bpp 44.08 dB. (b) 0.1 bpp 43.12 dB. . . . . . 140

5.1 Tipos de errores de proyeccion. . . . . . . . . . . . . . . . . . . . . . . . . . 145

5.2 Sistema de rayos X. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

5.3 Ejemplos de Radiografıas. a. Cuello. b. Pelvis. . . . . . . . . . . . . . . . . 146

5.4 Ejemplo de angiografıa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

5.5 Ejemplos de Ecografıas. a. Embarazo. b. Quiste en un ovario. . . . . . . . . 148

5.6 Proyecciones y barrido en la reconstruccion Tomografica. . . . . . . . . . . . 149

5.7 Formacion de voxels en TAC. . . . . . . . . . . . . . . . . . . . . . . . . . . 149

5.8 Ejemplo de reconstruccion Tomografica. . . . . . . . . . . . . . . . . . . . . 150

5.9 Reconstruccion tomografica. a. Inicializacion. b. Valores despues de la

resconstruccion vertical. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

5.10 Reconstruccion tomografica. a.Valores despues de la resconstruccion horizon-

tal. b. y diagonal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

5.11 Metodo de reconstruccion Tomografica mediante Transformadas de Fourier. . 151

5.12 Tomografıa Axial Computerizada. a. Equipo medico de TAC. b. Imagen de

un paciente con ictus cerebral. . . . . . . . . . . . . . . . . . . . . . . . . . . 152

5.13 Ejemplo de una imagen de MN que muestra una atrofia renal. . . . . . . . . 153

5.14 Reconstruccion 3D a partir de la cual se puede obtener cualquier corte. . . . 154

Page 18: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

14 INDICE DE FIGURAS

5.15 Equipo PET. a. Anillo detector PET donde se dectectan coincidencias de

fotones. b. Imagen PET que indica una malignidad, la actividad cerebral,

cardiaca, renal y vesical son fisiologicas. . . . . . . . . . . . . . . . . . . . . . 154

5.16 Resonancia Magnetica. a. Equipo medico de RM. b. Imagen obtenida con

plano sagital de cabeza. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

5.17 Compresion de una CT de 512x512 a 1.6584 bpp (4.82:1). . . . . . . . . . . . 158

5.18 Compresion de una PET de 256x256 a 1.7748 bpp (4.51:1). . . . . . . . . . . 158

5.19 Compresion de una radiografıa de 2550x2100 a 2.7703 bpp (2.89:1). . . . . . 159

5.20 Compresion de una RM de 512x512 a 4.2844 bpp (1.87:1). . . . . . . . . . . 159

5.21 Compresion de las imagenes de las figuras 5.17 y 5.20 con una calidad muy

buena (perdidas inapreciables) a 0.5 bpp (16:1). 512. a Sin pedidas 3.37 bpp

(2.73:1). b Con perdidas y ROI 0.2 bpp (41:1). . . . . . . . . . . . . . . . . . 161

5.22 Compresion de una RM de 256x256 con un tumor en la cabeza. a Sin pedidas

3.37 bpp (2.73:1). b Con perdidas y ROI 0.2 bpp (41:1). . . . . . . . . . . . 161

5.23 Compresion de una CT de 512x512 con un tumor en la rodilla. a Sin pedidas

2.1127 bpp (3.79:1). b Con perdidas y ROI 0.1 bpp (80:1). . . . . . . . . . . 162

Page 19: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

INDICE DE FIGURAS 15

Page 20: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

16 INDICE DE FIGURAS

Page 21: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Indice de Tablas

2.1 Codificacion Aritmetica de la secuencia bbb con la distribucion de probabil-

idades P = {pa = 0.4, pb = 0.5, pfinal = 0.1}. El intervalo final es [0.8125,

0.8250), que en binario es [0.1101000000, 0.1101001100), con lo que la codifi-

cacion final puede quedar 1101000. La probabilidad de ocurrencia de secuen-

cia bbb es (0.5)3 ∗ (0.1) = 0.0125, que en bits se traduce en −log2p ≈ 6.322,

que en la practica son 7 por el redondeo. . . . . . . . . . . . . . . . . . . . . 37

2.2 Ejemplo de codificacion Aritmetica mediante un metodo alternativo que pro-

porciona el codigo de manera progresiva y previa a la codificacion de todos los

sımbolos. Como se ve el resultado es el mismo que para el ejemplo expuesto

en la anterior tabla, 1101000. El bit final transmite la informacion del ultimo

intervalo − log2 0.8 ≈ 0.322 bits. . . . . . . . . . . . . . . . . . . . . . . . . . 40

2.3 Codificacion Aritmetica de la secuencia abacbcba con la distribucion de proba-

bilidades P = {pa = 3/8, pb = 3/8, pc = 2/8}. El intervalo final es [0.001100000111011,0.001100001000000). La longitud es −p log2 0.000173808 ≈ 12.490 bits, con lo

que al final queda 0011000001111, 13 bits. . . . . . . . . . . . . . . . . . . 41

2.4 Codificacion Aritmetica Semi-Adaptativa de la secuencia abacbcba con la dis-

tribucion de probabilidades P = {pa = 3/8, pb = 3/8, pc = 2/8}. El intervalo

final es [0.001001110101000, 0.001001111100011). La longitud es−p log2 0.001785714 ≈9.129 bits, con lo que al final queda 0010011110, 13 bits. . . . . . . . . . . 41

2.5 Codificacion Aritmetica Adaptativa de la secuencia abacbcba con la distribu-

cion de probabilidades P = {pa = 1/3, pb = 1/3, pc = 1/3}. El intervalo

final es [0.00110010101110011101, 0.00110010101111000111). La longitud es

−p log2 0.000039683 ≈ 14.621 bits, 5.492 bits mas que en el ejemplo de la

codificacion Semi-Adaptativa. El codigo final queda 001100101011101, 15

bits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

2.6 Varianzas de distribucion Laplaciana que aseguran una perdida menor de 0.005

bpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

17

Page 22: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

18 INDICE DE TABLAS

2.7 El intervalo final es [Offset,Offset+H), con lo que el codigo en binario es

00001001100001010101100101001001110011010110010000,50 bits, al

cual se le ha extraido el ultimo 1 puesto que es conocido por el decodificador.

Sin compresion se necesitarıan 4 bits/simb x 15 sımb=60 bits y con huffman

regular 56 bits (tabla 2.8). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

2.8 Tabla de asignacion de codigos Huffman para una codificacion DPCM. . . . 61

2.9 Tabla de asignacion de codigos a los movimientos relativos en las cadenas

ordenados segun longitudes. . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

2.10 Comparacion de tasas de compresion sin perdidas. Las imagenes utilizadas

son imagenes retinianas sin texturas de dimensiones 512x512 y 8 bpp. La

codificacion aritmetica esta obtenida con bloques de 32 sımbolos y rango de

8 bits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

3.1 Filtros de analisis y sıntesis Daubechies (9,7). . . . . . . . . . . . . . . . . . 88

3.2 Filtros de analisis y sıntesis entero (5,3). . . . . . . . . . . . . . . . . . . . . 89

3.3 Filtros de analisis Daubechies (6,10). . . . . . . . . . . . . . . . . . . . . . . 89

3.4 Filtros de analisis CRF(13,7). . . . . . . . . . . . . . . . . . . . . . . . . . . 89

3.5 Filtros de analisis SWE(13,7). . . . . . . . . . . . . . . . . . . . . . . . . . . 89

3.6 Filtros de analisis (2,6). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

3.7 Filtros de analisis (2,10). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

3.8 Filtros de analisis Daubechies (10,18). . . . . . . . . . . . . . . . . . . . . . . 90

3.9 Contextos de la operacion SC. . . . . . . . . . . . . . . . . . . . . . . . . . . 101

3.10 Tasa sin perdidas (bpp) con y sin RCT. . . . . . . . . . . . . . . . . . . . . . 121

5.1 Parametros de calidad en imagenes medicas. . . . . . . . . . . . . . . . . . . 157

5.2 Tasas de compresion sin perdidas con diferentes algoritmos. . . . . . . . . . . 160

Page 23: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

GLOSARIO

SVH Sistema Visual HumanoCSF Funcion de Sensibilidad al ContrasteDCT Transformada Discreta del CosenoWT Transformada Waveletsi Sımbolo ipi Probabilidad de ocurrencia del sımbolo i

Phi Probabilidad acumulada con i (∑i

k=1 pk)

Pli Probabilidad acumulada hasta i (∑i−1

k=1 pk)LSS Longitud en bits de la codificacion AritmeticaLSD Longitud en bits de la codificacion Aritmetica Semi-AdaptativaLM Longitud en bits de la codificacion del modelo de codificacionLA Longitud en bits de la codificacion Aritmetica AdaptativaMSB Bit Mas SignificativoLSB Bit Menos SignificativoBI Numero de bits de la imagen originalRI Numero de bits de la imagen transformada waveletRb Rango dinamico de la imagen transformada waveletMb Numero de planos de bitG0 Bits de Guarda∆b Ancho de cuantificacionεb Exponente del ancho de cuantificacionµb Mantisa del ancho de cuantificacionu y v Coordenadas del espacio transformado waveletqi(u, v) Bits cuantizados de cada bloque iXi(u, v) Signo de los coeficientes transformados de cada bloquemi Mi para cada bloquempi (u, v) Profundidad de bit de cada coeficiente

si(u, v) Informacion codificada previa de cada coeficienteσi(u, v) Significancia del coeficiente si(u, v)σi(u, v) Indica si se ha aplicado MRηi(u, v) Indicador de la pasada de codificacion(xb0, yb0) Coordenadas origen de la banda b(xb1, yb1) Coordenadas alto y ancho de la banda b

19

Page 24: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos
Page 25: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 1

Introduccion

La existencia no es algo que se deje pensar de lejos,es preciso que nos invada bruscamente, que se detengasobre nosotros, que pese sobre nuestro corazon comouna gran bestia inmovil; si no, no hay absolutamentenada.

Jean Paul Sartre, La nausea.

Hoy en dıa, practicamente cualquier actividad humana, ya sea que involucre llamadas

por telefono, compras en almacenes, imagenes de satelite, transacciones de tarjeta de credito,

informacion de imagenes medicas, etc., se almacena en una base de datos. Debido a la

creciente necesidad de almacenamiento, ya no es raro encontrar bases de datos de varios

gigabytes e incluso terabytes. Las tecnicas tradicionales de analisis de informacion no han

tenido un desarrollo equiparable y estan mostrando ser insuficientes. La velocidad a la que

se almacenan datos esta siendo muy superior a la velocidad con la que se analizan. Con

los volumenes actuales de informacion es claro que se tienen que crear herramientas mas

sofisticadas con la capacidad de asistir a usuarios en el analisis automatico e inteligente de

grandes volumenes de datos que permita encontrar conocimiento util. Sin estos desarrollos en

analisis, se podrıa dejar de extraer una gran cantidad de informacion. Determinados campos

profesionales, como la medicina o la astronomıa, que trabajan con imagenes digitales, se

caracterizan porque requieren una alta calidad de imagen ocupando un gran volumen, con

lo que necesitan una buena tasa de compresion. El objetivo de este proyecto esta enfocado

a la mejora de las tecnicas actuales empleadas para la compresion de imagenes. Trata de

aportar nuevas vıas para lo que se esta convirtiendo en autenticos cuellos de botella de las

redes de comunicacion y sistemas de almacenamiento actuales. Para tener una mejor idea

de la lınea que guiara este proyecto habra que hacer un breve repaso sobre la evolucion del

estado del arte hasta ahora.

21

Page 26: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

22 Capıtulo 1. Introduccion

1.1 Estado del Arte

Todo algoritmo de compresion trata de eliminar tanto como sea posible el esceso de informa-

cion, o lo que es lo mismo, la redundancia. De la tecnica que se emplee para ello depende su

grado de compresion y la calidad final en el caso de imagenes. La compresion digital, dentro

del procesado digital, y muy especialmente en aplicaciones con imagenes digitales, que es el

caso que nos atane, han predominado basicamente tecnicas matematicas analıticas. Hasta

ahora entre las mas usadas, tanto a nivel particular como profesional, se encuentran las tradi-

cionales tecnicas estadısticas de primera generacion y las basadas en transformaciones, que

se pueden clasificar como segunda generacion. Las primeras estan constituidas por codigos

tan conocidos como los codigos Huffman, codigos aritmeticos, algoritmo de Lempev-Zip, al-

goritmos jerarquicos, piramidales, etc... cuya principal caracterıstica es que estan basadas

en la diferencia de probabilidad de aparicion de los sımbolos, es decir, su frecuencia de apari-

cion. Las transformaciones, entre las que se encuentra como principal exponente la DCT o

ADCT (Adaptive Discrete Cosine Transform), trabajan en otro espacio, el espacio transfor-

mado, caracterizado porque resulta mas facil la identificacion de los sımbolos o coeficientes

redundantes. A este se le denomina el espacio frecuencial. Las tecnicas estadısticas carecen

de perdidas, a cambio ofrecen un grado de compresion menor que las tecnicas basadas en

transformaciones. Estas ultimas constituyen algoritmos muy potentes de compresion, lo que

explica que constituyan el nucleo principal del algoritmo mas extendido en codificacion de

imagenes: el JPEG. A cambio, aunque tambien pueden ser sin perdidas, introducen un alto

grado de deterioro en la imagen reconstruida, con artefactos tıpicos como el conocido efecto

mosaico en la JPEG-DCT que hacen inviable su uso sobre todo en entornos profesionales

donde la calidad de la imagen es un factor crıtico.

La codificacion de imagenes medicas, por las razones anteriormente expuestas, ha supuesto

y sigue suponiendo un gran esfuerzo, tanto en el ambito publico como privado, lo que da

cuenta de los numerosos estandares utilizados en medicina [20]. Tradicionalmente las tecnicas

utilizadas han sido estadısticas o basadas en transformadas con bajas perdidas. Si se quiere

aumentar aun mas la tasa de compresion hay que recurrir a metodos con perdidas, pero si

se quiere conservar la calidad de la imagen no queda mas remedio que desarrollar nuevas

tecnicas: metodos perceptuales basados en el Sistema Visual Humano (SVH). En los ultimos

anos la corriente general se encamina, conforme van aumentando los conocimientos sobre el

SVH, hacia la aplicacion de metodos perceptuales o de simulacion del propio SVH. Muchas

de estas tecnicas, debido a la complejidad del analisis del SVH, estan basadas en test es-

tadısticos de vision como el enmascaramiento de coeficientes o la Funcion de Sensibilidad al

Contraste. Estas tecnicas, a las que muchos autores denominan como tercera generacion,

se basan en eliminar la redundancia de la imagen e introducir perdidas de manera que el

Page 27: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

1.2. Objetivos del Proyecto 23

SVH sea incapaz o menos capaz de apreciarlas. Esto es lo que aprovechan precisamente las

transformadas con filtros Gabor, u ondıculas (wavelets). En esta lınea, caben senalar algunos

trabajos del Instituto de Optica (CSIC) referentes al tema [27, 9].

La via abierta en estos ultimos anos augura buenos resultados en compresion ya que

hasta ahora solo se habıa tenido en cuenta caracterısticas de las propias imagenes y no

caracterısticas de lo que realmente es crucial, el SVH. Esto no implica que se desechen

metodos estadısticos o basados en transformadas, sino que se complementaran unos a otros

para que cada uno actue segun las aplicaciones requeridas. Quedan aun muchas incognitas

por resolver, pero no cabe duda de que el futuro pasa por tener un mejor conocimiento de

nuestras propias capacidades para observar el entorno que nos rodea.

1.2 Objetivos del Proyecto

El proyecto tratara de aplicar estas tecnicas perceptuales junto con nuevos modelos del cor-

tex visual humano desarrollados por M. Keil [16, 17], del Instituto de Optica (CSIC), con

ayuda de los ya mencionados analisis estadısticos. La simulacion del SVH impementada por

M. Keil se basa en la caracterizacion de las celulas neuronales que son estimuladas en el

cortex visual. Su funcionamiento en principio es semejante a lo que serıa un simple detector

de bordes usando gradientes. La ventaja que aporta este metodo es que la deteccion de estas

transiciones, que no es mas que la deteccion de regiones de la misma intensidad, se realiza

de acuerdo a las caracterısticas del SVH. La codificacion se hara mediante diversas transfor-

maciones y codificaciones estadısticas predictivas con posibles mejoras en la codificacion de

imagenes.

Por otro lado se hara un analisis de los ultimos metodos empleados en el reciente estandar

de compresion JPEG2000 para la implementacion de un toolbox de compresion en MATLAB,

uno de los lenguajes de programacion mas extendidos en el ambito cientıfico. El objetivo

de este es facilitar por un lado el manejo del compresor y dar una vision mas clara de los

aspectos mas relevantes del mismo.

Ademas se evaluara la aplicacion de estos metodos a imagenes medicas, un campo muy

especıfico por requerir una calidad de imagen superior a otros campos por ser crıtica para

un buen diagnostico.

1.3 Estructura del Proyecto

En la primera parte del proyecto se introducen caracterısticas y modelos del SVH y posibles

metodos para la compresion de imagenes. Despues se incluye una descripcion del estandar

Page 28: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

24 Capıtulo 1. Introduccion

de compresion JPEG2000 con un analisis de los resultados que proporciona. Por ultimo

se realiza una introduccion a las imagenes medicas con posibles aplicaciones del estandar

JPEG2000. En la parte final del proyecto se encuentran los anexos con la informacion

complemetaria como codigos fuente y otros datos de interes.

Page 29: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 2

Codificacion de ImagenesPerceptuales

El verdadero pintor es aquel que es capaz de pintarescenas extraordinarias en medio de un desierto vacıo.El verdadero pintor es aquel que es capaz de pintarpacientemente un pera rodeado de los tumultos de lahistoria.

Salvador Dalı.

Se ha avanzado mucho en el conocimientos del SVH pero gran parte de este es todavıa un

misterio del que solo se pueden lanzar conjeturas. Cosas tan aparentemente sencillas como

la vision en tres dimensiones, la deteccion de movimiento o el reconocimiento de objetos

entranan una gran complejidad de fondo. El conocimiento de la naturaleza y la imitacion

de sus modelos biologicos se ha revelado como un arma de gran valor para el desarrollo

cientıfico-tecnologico, ası el conocimiento de estos procesos puede ser clave en innumerables

aplicaciones que van desde el tratamiento y compresion de imagenes hasta la vision artificial.

2.1 Introduccion a los Modelos Perceptuales

El SVH esta formado por una gran cantidad de celulas responsables de numerosos procesos

neuronales, tanto a nivel retininano como cerebral, y la mayorıa son procesos no-lineales, lo

cual dificulta en gran medida su conocimiento y simulacion.

Las celulas ganglionares que se encuentran en la retina recogen informacion visual del

mundo, la luz, y la procesan en forma de mensajes quımicos que reciben receptores colocados

en la membrana exterior que envuelve la celula. Estos receptores cogen la informacion

25

Page 30: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

26 Capıtulo 2. Codificacion de Imagenes Perceptuales

quımica, tıpicamente en forma de iones (Cl−,K+ yNa+) y neurotransmisores mas complejos,

y la transforman en informacion electrica en forma de pulsos intracelulares. Esta informacion

pasa por las dendritas al soma, donde se procesa y se transmite por el axon a las siguientes

neuronas. En la figura 2.1 se observan las diferentes partes de una neurona.

Figura 2.1: Partes de una neurona.

Las diferentes celulas estan especializadas en detectar determinadas caracterısticas de las

escena visual, tales como el color, el tamano, la orientacion y la velocidad de movimiento. Las

celulas ganglionares terminan en los diferentes centros visuales cerebrales, segun la funcion

que desempenen, por medio del nervio optico que esta compuesto por mas de un millon de

axones.

Las funciones basicas del SVH son el procesamiento de la imagen, procedente de la

retina, y analizarla segun sus caracterısticas. Entre las funciones basicas se encuentra el

procesamiento del color, el brillo o luminancia, la profundidad, el movimiento o las texturas

de la imagen. Cada una de estas funciones se encuentra localizada en una zona del cortex

visual, en la parte occipital del cerebro. Sus nombres van desde V1 a V5, aunque algunos

autores diferencian hasta V7. Por supuesto todas estas regiones no son independientes, sino

que la senal sufre diferentes realimentaciones de una region a otra. Las regiones se muestran

en la figura 2.2.

Una de las areas del cerebro mas estudiadas y mejor conocidas es la denominada V1, que

recibe como entrada la senal procedente de la retina basicamente normalizada de acuerdo

con un mecanismo de control automatico de ganancia. El procesado realizado hasta V1,

denominado primario, consiste en la codificacion de la imagen retiniana de forma que resulte

util a las etapas posteriores. Concretamente, en el area V1 existen evidencias de conjuntos de

celulas que cubren el campo visual y que estan sintonizadas a distintas frecuencias y orienta-

Page 31: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.1. Introduccion a los Modelos Perceptuales 27

Figura 2.2: Representacion del Sistema Visual Humano.

ciones, por lo que actuan como filtros espacio-temporales. El filtrado temporal impide que

se perciba discontinudad entre estımulos visuales presentados muy seguidos o rapidamente.

Esta caracterıstica es aprovechada en todos los sistemas de vıdeo al presentar un numero

limitado de imagenes por segundo. El filtrado espacial impide distinguir entre dos puntos

muy proximos entre si. Esto tambien es utilizado en todos los sistemas de vıdeo al componer

cada imagen mediante un conjunto de puntos pequenos o pıxeles. Las dos caracterısticas

funcionan a groso modo como filtros paso bajo. En resumen, el area V1 realiza un analisis

conjunto espacio-frecuencial de la senal de entrada, descomponiendola en distintos canales.

Otro area importante es el area MT donde se procesa el movimiento. Sus neuronas estan

sintonizadas a distintas velocidades y direcciones del movimiento.

Este proyecto tratara la simulacion de parte de las caracterısticas del procesado primario,

region V1, por tanto solo se hablara de imagenes de una componente o escala de grises.

El conocimiento del SVH y su simulacion es una herramienta util en compresion de

imagenes puesto que permite hacer una compresion con diferentes calidades en funcion de si

el estımulo de la imagen es muy visible o poco visible. Se trata pues de aumentar la eficiencia

de compresion desechando aquella informacion de la imagen que el SVH no es capaz de ver.

Algunos metodos perceptuales estan muy extendidos y se aplican en casi todos los

metodos de compresion. Es el caso de la correcion gamma que aprovecha la no lineali-

dad de la percepcion de luminancia, es decir, se perciben mucho mejor los incrementos de

luminancia para niveles bajos de brillo que para los altos. Otro metodo es prescindir de las

altas frecuencias espaciales aprovechando la caracterıstica de filtrado espacial del area V1.

En este metodo se hace un analisis espacial y se van eliminado las altas frecuencias hasta

obtener el volumen de informacion deseado. Es el caso de las ya mencionadas transformadas

DCT, Wavelet o Gabor. Un tercer metodo, aunque menos usado, es el enmascaramiento de

Page 32: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

28 Capıtulo 2. Codificacion de Imagenes Perceptuales

coeficientes. Este consiste en dar menos valor a aquellos estımulos de la imagen que estan

cerca de otro muy brillante. Al igual que ocurre con el oıdo los estımulos altos o fuertes hacen

que los bajos o debiles se perciban con menor amplitud. La caracterıstica comun de todos

estos metodos es que tratan de reducir la informacion necesaria para describir la imagen

eliminando la informacion no visible de la imagen. Aunque de todo esto se hablara con mas

detalle en posteriores capıtulos. Se trata, por tanto, de tener mejores modelos biologicos que

simulen estas y otras caracterısticas para mejorar la eficiencia de compresion.

Como ya se comento antes, las imagenes, y en particular las naturales, tienen carac-

terısticas que el SVH procesa por separado. Por un lado estan los bordes que delimitan

superficies de diferente nivel de luminosidad, por otro lado los detalles finos de la imagen

como lıneas finas o puntos llamadas ”texturas”1 y por ultimo incrementos de luminosidad

llamados gradientes. Es sencillo intuir que estas caracterısticas son procesadas por separado

pensando que el SVH es capaz de reconocer objetos independientemente de si las superficies

de este son lisas, tienen textura o tienen gradientes de luminosidad. Por lo general para

reconocer un objeto basta con los bordes del mismo.

Figura 2.3: Imagen de Picard.

A partir de dos tipos de celulas, llamadas X e Y, la retina extrae dos tipos de imagenes de

contraste: incremento de luminosidad (imagen ON) y decremento de luminosidad (imagen

OFF). La primera se obtiene mediante celulas que tienen un centro excitatorio y alrededores

inhibitorios y la segunda con celulas de centro inhibitorio y excitatorio los alrededores. Esto

se muestra en la figura 2.4. Tambien se componen de una zona mas externa de luminancia

1El concepto de textura viene asociado tradicionalmente con el grado de ”rugosidad”y direccionalidad deuna imagen y se encuentra asociado con la informacion de superficies. Aquı sin embargo, el termino texturase asocia con las lıneas finas y puntos, ya que la informacion de superficie se trata separadamente

Page 33: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.1. Introduccion a los Modelos Perceptuales 29

local cuya funcion se vera mas adelante. Ademas en cada tipo aparecen diferentes orienta-

ciones donde la vertical, horizontal y diagonal son las predominantes; lo que hace que el

SVH sea mas sensible a estımulos con alguna de estas disposiciones. Normalmente se suelen

simular entre 3 y 4 orientaciones.

+ -

-

-

-

-

+

+ +

+

modulacion luminancia

centro excitatorio

alrededor inhibitorio

alrededores

ON-centro/OFF-alrededor

modulacionoscuridad

alrededores

OFF-centro/ON-alrededor

ON-contraste

Figura 2.4: Celulas retinianas ON y OFF.

La respuesta a estımulos de cada una de estas celulas se puede modelar como muestra la

figura 2.5. Muchos aproximan estas respuestas como filtros DOG (Difference of Gaussian).

a b

Figura 2.5: Respuestas retinianas. a. Celula ON. b. Celula OFF.

Las celulas ON producen una senal a su salida cuando encuentran un incremento de

luminosidad y las celulas OFF cuando encuetran un decremento. Ası, como resultado de

convolucionar estos con las imagenes estımulos que llegan a la retina se obtienen dos nuevas

imagenes ON y OFF. Cada una tendra informacion de contraste, pero una de ellas contiene la

informacion de los incrementos de luminosidad (ON) y la otra la de los decrementos (OFF).

Para entender mejor esto ver el ejemplo de la figura 2.6 con una escalera de luminancia como

imagen estımulo.

Page 34: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

30 Capıtulo 2. Codificacion de Imagenes Perceptuales

a b c

Figura 2.6: Ejemplo de obtencion de imagenes retinianas de contraste con imagen test deescalera de luminancia. a Escalera de luminancia. b. Imagen de contraste ON, activacion enlos incrementos de luminosidad. c. Imagen de contraste OFF, activacion en los decrementosde luminosidad.

Esta es por tanto la informacion de contraste que procesa el SVH en la que se encuentran

tanto la informacion de superficies como la informacion de texturas y detalles finos. El

problema es como recuperar esta informacion a partir de la informacion de contraste. Las

teorıas mas importantes que han sido propuestas para ello se pueden agrupar en dos clases:

• Modelos clasicos: consideran los procesos retinianos como filtrados paso banda en

diferentes escalas y orientaciones. Entre ellos se pueden incluir los filtros DOG y Gabor.

Estos han sido muy utiles en aplicaciones de eliminacion de ruido y codificacion,[5,

25]. Son mas sencillos puesto que no hacen una distincion explıcita entre contraste

y luminancia, no hacen un analisis de bordes, ası que tratan toda la informacion por

igual. Sin embargo introducen fuertes artefactos en la simulacion de efectos visuales y

usan un filtro paso bajo del que todavıa no se tiene evidencia.

• Modelos de Filling in : reconstruyen la informacion mediante difusion a partir de

la informacion de contraste, donde los bordes son las barreras para estos procesos de

difusion. Son modelos mas fieles a los procesos biologicos encontrados en el SVH.

Simulan mucho mas facil procesos dinamicos por estar construidos mediantes redes

neuronales. Estos modelos explican mas ilusiones visuales que los modelos clasicos.

Pero por contra tienen serios problemas para procesar senales de dos dimensiones, como

es el caso de las imagenes. Ademas suelen necesitar un reajuste de los parametros en

funcion del estımulo de entrada y siguen necesitando un canal paso bajo.

En las figuras 2.7 y 2.8 se muestran ejemplos de como funcionan estas dos clases de

modelos.

Page 35: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.2. Modelo Neuronal M.Keil 31

escala 1 escala 2 escala 3

escala 1 + escala 2 todas las escalas escalas + paso bajo

1,2 + 3 + PB

Figura 2.7: Ejemplo de resonstruccion con filtros DOG.

Figura 2.8: Ejemplo de resonstruccion con filling in de la escalera de luminancia.

2.2 Modelo Neuronal M.Keil

El modelo neuronal que se utilizara en este proyecto es el propuesto por M. Keil, [18]. Este

modelo pertenece a la clase de filling in pero con mejoras sustanciales con los propuestos

hasta ahora. Por un lado incorpora una modulacion de la informacion de contraste con la

informacion de luminancia local, con lo que ya no es necesario un canal paso bajo ni la

defensa de su existencia. Esta modulacion se forma a partir de la informacion obtenida

Page 36: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

32 Capıtulo 2. Codificacion de Imagenes Perceptuales

con los alrededores de las celulas retinianas, ver la figura 2.4. Basicamente lo que hace es

modular la diferencia de amplitud de la informacion de ON y OFF en un escalon en funcion

de la luminancia de este, ver figura 2.9.

Figura 2.9: Modulacion de luminancia local con la informacion de contraste.

Tambien incorpora una difusion no-lineal del filling in homogeneo. Por ultimo es capaz

de reconstruir en dos dimensiones la informacion de superficies a partir de la informacion de

bordes o contraste y la informacion con detalles mas finos como las texturas y los gradientes.

El modelo completo se muestra en la figura 2.10.

Figura 2.10: Modelo de analisis retiniano propuesto por M. Keil.

De la informacion de contraste modulada por la luminancia local se obtienen, como

Page 37: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.2. Modelo Neuronal M.Keil 33

se explico anteriormente, distintos tipos de caracterısticas de la imagen. Por un lado la

informacion de bordes, que servira para la reconstruccion de superficies, utilizando para ello

celulas neuronales de simetrıa impar, se detectan coincidencias ON-OFF que dan lugar a

escalones de luminancia. Estas coincidencias se detectan para las diferentes orientaciones.

Para la detecccion de la informacion de texturas se utilizan celulas con simetrıa par. La

informacion restante sera la informacion de gradientes. El modelo completo utiliza por

tanto tres canales de informacion: bordes, texturas y gradientes.

Para ilustrar esto mejor se muestran los ejemplos de la figura 2.11 y 2.12 que indican

como se detectan los bordes y texturas con las dos configuraciones celulares: par e impar.

Figura 2.11: Ejemplos de deteccion de bordes mediante modelos de simetrıa celular impar.Informacion para la reconstruccion de superficies.

Figura 2.12: Ejemplos de deteccion de texturas mediante modelos de simetrıa celular par.Informacion para la reconstruccion de texturas.

Un ejemplo de reconstruccion filling in se muestra en la figura 2.13 donde se ve el proceso

de difusion de la informacion de contraste, los bordes, hacia las supefıcies.

El modelo predice gran cantidad de artefactos que produce el SVH. Muchos aparecen

cuando dos frentes ON y OFF de difusion chocan en la reconstruccion por filling in. Es el

caso del White’s effect, del contraste simultaneo, las bandas de Mach o la ilusion de Chevreul.

Page 38: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

34 Capıtulo 2. Codificacion de Imagenes Perceptuales

Imformacion de bordes

bordes = barreras de difusion

Figura 2.13: Ejemplo de reconstruccion con filling in a partir de la informacion de contraste.

Algunas de estas se muestran en la figura 2.14. Ademas simula selectividad en orientacion

y procesos adaptativos tıpicos de sistemas neuronales.

a b

Figura 2.14: Ejemplos de ilusiones opticas. a. Efecto de White. b. Bandas de Mach.

Resumiendo, el SVH esta compuesto por numerosos procesos neuronales que hacen que

la imagen percibida sea diferente de lo que realmente es. De la simulacion de estos procesos

se obtienen imagenes perceptuales que dan una idea de lo que el SVH es capaz de procesar

y lo que no, es decir, de lo que ve y lo que no ve. Toda la informacion que no es capaz

de ver es informacion redundante. A raız de esto surgen dos aplicaciones evidentes: o

bien se utiliza esta informacion no visible para introducir informacion util extra o bien

se desecha directamente. En el primer caso se habla de watermarking y en el segundo

Page 39: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.3. Codificacion Aritmetica 35

de compresion, que es el tema principal de este proyecto. Se va a tratar de realizar una

codificacion eficiente de dichas imagenes perceptuales enfocada a la compresion de imagenes.

Estas imagenes contienen grandes regiones vacıas donde los bordes aparecen como largas

cadenas o esqueletos, ver figura 2.13. Dadas estas caracterısticas lo eficiente sera utilizar

un metodo que tenga en cuenta las mismas. En este caso se escogio la codificacion de

cadenas utilizada en otros metodos de compresion de imagenes ,[19]. Como se vera mas

adelante proporciona tasas de compresion muy buenas para este tipo de imagenes. Ademas se

utilizan tecnicas de codificacion Huffman y Aritmeticas, a las que conviene hacer una repaso

para mejor comprension del metodo; sobre todo a las ultimas porque son mas complejas y

desconocidas.

2.3 Codificacion Aritmetica

Cualquier proceso de comunicacion esta formado por tres elementos: un emisor o fuente, un

receptor y la informacion en si. La informacion, ya sean numeros, letras, o cualquier otro

tipo de representacion, se forma mediante un conjunto de sımbolos llamado alfabeto. Para

hacer una representacion digital legible del alfabeto se necesita establecer una relacion entre

sımbolos, es decir, entre un sımbolo y su representacion digital o codigo. En la compresion sin

perdidas es aquı donde se produce el verdadero proceso de compresion. Para ello se juega con

las caracterısticas probabilısticas de los sımbolos que proporciona la fuente de informacion,

de manera que aquellos sımbolos de mayor frecuencia de aparicion se les asignen codigos

de menor longitud. La eficiencia de la compresion vendra dada por la manera en que se

marquen dichas relaciones entre sımbolos y codigos. En el tratamiento digital estos codigos

seran binarios, 0 o 1, llamados bits.

Segun Shannon la mınima cantidad de bits por sımbolo necesaria para codificar sin

perdidas una fuente con una distribucion de probabilidades P = {p1, ..., pn} es:

H(P ) =n∑

i=1

−pi logb pi (2.1)

Donde b es la base, normalmente b = 2 para codigos binarios. H(P ) no es mas que

una medida de la entropıa de la fuente, es decir, a mayor entropıa la tasa de compresion

que se puede obtener es peor. Segun esto, la peor tasa se consigue cuando los sımbolos son

equiprobables, es decir, todos tienen la misma longitud.

Los codigos mas extendidos son los llamados Huffman,[13], que pertenecen a la familia de

los codigos prefijos y consisten en la asignacion de codigos segun las probabilidades de ocur-

rencia con un numero entero de bits. Por ejemplo, en fuente con un alfabeto de 4 sımbolos

Page 40: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

36 Capıtulo 2. Codificacion de Imagenes Perceptuales

S = {s1, s2, s3, s4} la secuencia 14131232111 se puede codificar inicialmente, si los sımbolos

son equiprobables {s1 = 00, s2 = 01, s3 = 10, s4 = 11}, como 0011001000011001000000 (22

bits). Pero si sus probabilidades son {p1 = 0.5, p2 = 0.25, p3 = 0.125, p4 = 0.125}, se pueden

asignar los codigos {s1 = 0, s2 = 10, s3 = 110, s4 = 111}, con lo que la secuencia anterior

queda 0111011001011010000 (19 bits). La secuencia se ha comprimido sin perder informa-

cion, solo se necesita conocer la asignacion de codigos. Esto ilustra como se comportan los

codigos Huffman de una manera sencilla. La eficiencia de estos codigos vendra marcada por

como de buena es la asignacion de los mismos. Golomb y Rice son otros codigos prefijos

tambien muy usados que se basan en el mismo principio, [12]. La longitud de los codigos de

cada sımbolo viene marcada por la ecuacion 2.2:

l(si) = d− log2(pi)e (2.2)

Donde l es la longitud, pi la probabilidad del sımbolo. dxe redondea al entero igual o

mayor que x. Las ventajas que tienen los codigos Huffman es que son codigos muy sencillos

de implementar. El inconveniente es que los codigos deben tener una longitud finita de bits,

un sımbolo no se puede representar con 3 bits y medio. Esto hace que con el redondeo se

pierda eficiencia de compresion. Pero existe otra forma que consigue codificar los sımbolos

con longitudes no enteras. La codificacion Aritmetica.

La codificacion Aritmetica proporciona una eficiencia de compresion mayor que los codigos

Huffman, aunque esto es a priori, ya que hay diferentes tipos de codificacion Aritmetica con

diferentes eficiencias, como tambien ocurre con Huffman. La codificacion Aritmetica tiene el

mismo fin que la codificacion Huffman, representar con menores longitudes aquellos sımbolos

que tienen una mayor frecuencia de ocurrencia, pero de una manera mas eficiente.

A partir de los trabajos de Rissanen y Langdon[30] se puso de relevancia la potencialidad

que tenıan los codigos aritmeticos. Basicamente se puede reducir en los siguientes pasos:

• Construccion de una tabla con la distribucion de probabilidades de los sımbolos.

• Division de un intervalo, representado por [L,H) e inicializado a [0,1), en pequenos

intervalos en relacion con la distribucion de probabilidades de los sımbolos. A mayor

probabilidad mas grande es el intervalo.

• Para codificar un sımbolo se sustituyen los extremos del intervalo actual [L,H) por los

extremos del intervalo que corresponde con el sımbolo a codificar [L’,H’) y se vuelve a

subdividir el intervalo resultante segun la distribucion de probabilidades. Repitiendo

este paso tantas veces como sımbolos a codificar.

Page 41: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.3. Codificacion Aritmetica 37

• Una vez codificados todos los sımbolos se escoge un numero del intervalo final y se

transforma en binario. A partir de este se puede representar toda la sucesion de

sımbolos codificados.

Figura 2.15: Subdivision de intervalos en la codificacion Aritmetica.

l = d− log2(H′ − L′)e = d− log2

(

N∏

j=1

pj

)

e = dN∑

j=1

− log2(pj)e (2.3)

Al final del proceso la longitud media de los codigos resultantes es casi − log2(pi), casi

lımite Shannon (ec. 2.3), donde se redondea la secuencia y no cada sımbolo. Se dice casi por

el redondeo y porque hay que anadir un sımbolo mas de fin de codificacion, con lo que se

pierde eficiencia, ademas de otras cuestiones que se detallaran mas adelante. En figura 2.15

se puede ver el proceso iterativo de la subdivision de los intervalos. La tabla 2.1 muestra un

ejemplo para asentar mas todo esto.

Intervalo Actual Accion a b final Entrada[0.0000,1.0000) Dividir [0.0000,0.4000) [0.4000,0.9000) [0.9000,1.0000) b[0.4000,0.9000) Dividir [0.4000,0.6000) [0.6000,0.8500) [0.8500,0.9000) b[0.6000,0.8500) Dividir [0.6000,0.7000) [0.7000,0.8250) [0.8250,0.8500) b[0.7000,0.8250) Dividir [0.7000,0.7500) [0.7500,0.8125) [0.8125,0.8250) final[0.8125,0.8250)

Tabla 2.1: Codificacion Aritmetica de la secuencia bbb con la distribucion de probabilidadesP = {pa = 0.4, pb = 0.5, pfinal = 0.1}. El intervalo final es [0.8125, 0.8250), que en binarioes [0.1101000000, 0.1101001100), con lo que la codificacion final puede quedar 1101000. Laprobabilidad de ocurrencia de secuencia bbb es (0.5)3 ∗ (0.1) = 0.0125, que en bits se traduceen −log2p ≈ 6.322, que en la practica son 7 por el redondeo.

Como se ve en el ejemplo de la tabla 2.1 lo que hace que esta codificacion sea mas eficiente

es que se trabaja con las probabilidades de ocurrencia de la sucesion de sımbolos y no las

Page 42: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

38 Capıtulo 2. Codificacion de Imagenes Perceptuales

probabilidades de ocurrencia de cada sımbolo por separado. Como resultado la codificacion

de sımbolos puede resultar no ser de longitudes enteras.

Existe una familia de codificadores aritmeticos llamada Codificadores Aritmeticos Bina-

rios en los que historicamente Rissanen y Langdon fueron los primeros en trabajar. Su

principal caracterıstica es que solo admiten dos sımbolos de entrada, de ahı viene el termino

de binarios. Aunque esto les hace limitados son tambien muy sencillos y potentes. El Q-

coder, desarrollado por Rissanen, Mohiuddin, Chevion y Feygin, es uno de ellos y contituye

el nucleo del MQ-coder, base de la codificacion del JPEG2000. Una codificacion que esta

a caballo entre los codigos prefijos y la codificacion Aritmetica es la codificacion Cuasi-

Aritmetica, que es mas eficiente que los primeros y mas sencilla que la segunda, [10], aunque

no se tratara aquı.

La codificacin Aritmetica es mas eficiente que los codigos prefijos, pero trae anadidos una

serie de inconvenientes. El primero y mas evidente es la complejidad. La construccion de los

codigos es mas compleja y por tanto lleva mas tiempo de calculo. Otro problema asociado es

la necesidad de incluir un sımbolo de final de codificacion para no mezclar la informacion con

otras codificaciones u otras informaciones dentro de un mismo archivo. Ademas, no se puede

obtener el codigo hasta que no se hayan codificado todos los sımbolos. Otro problema es la

posible propagacion de errores si se decodifica con error algun sımbolo. Y el problema mas

complejo de todos es la extremada precision que requiere para codificar largas secuencias.

Para estos problemas hay alternativas, pero como siempre a costa de sacrificar eficiencia en

la compresion,[10].

2.3.1 Obtencion Progresiva de Codigos

El hecho de que solo se pueda obtener la codificacion final cuando todos los sımbolos esten

codificados supone un gran inconveniente, sobre todo en aplicaciones que requieren velocidad

como en la compresion de vıdeo para videoconferencia. Las soluciones propuestas han sido

desarrolladas a traves de anos por Pasco [26], Rissanen [30] y Langdon, Rubin [31], Guazzo

[11] y Witten, Neal y Cleary [38] como principales autores a principios de los 80. Ilustrado

en la figura 2.16, se puede esquematizar como sigue:

• Si el nuevo intervalo no esta enteramente dentro de alguno de los intervalos [0,1/2),

[1/4,3/4) o [1/2,1) se termina el proceso con un 0.

• Si el nuevo intervalo esta en [0,1/2) la salida es 0 seguido de tantos 1s como sımbolos

cayeron en el intervalo [1/4,3/4). Despues se expande al doble respecto a 1/4 el inter-

valo hacia la derecha entorno a 1/2.

Page 43: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.3. Codificacion Aritmetica 39

• Si el nuevo intervalo esta en [1/2,1) la salida es 1 seguido de tantos 0s como sımbolos

cayeron en el intervalo [1/4,3/4). Despues se expande al doble respecto a 3/4 el inter-

valo hacia la izquierda entorno a 1/2.

• Si el nuevo intervalo esta en [1/4,3/4) se aumenta el contador y se expande al doble el

intervalo en las dos direcciones respecto a 0.5.

Figura 2.16: Metodo para obtener progresivamente la codificacion Aritmetica antes del finalde la codificacion. (a) Sin expansion. (b) Expansion en intervalo [0,1/2). (c) Expansion enintervalo [1/2,1). (d) Expansion en intervalo [1/4,3/2).

Intuitivamente se puede entender que, a medida que el intervalo actual se va haciendo

mas pequeno con las sucesivas codificaciones, existen decimales que ya no van cambiar, o lo

que es lo mismo, habra bits de la representacion en binario del intervalo que sean fijos. Un

ejemplo de esto se ve en la tabla 2.2. Este metodo elimina en cierta manera las restriciones

de la extremada precision que se necesita, aunque en principio puede resultar suficiente, no

lo es puesto que la longitud de la secuencia del ejemplo es muy corta y ademas el tamano

del alfabeto muy pequeno.

2.3.2 Codificacion Adaptativa

Existen casos en los que la distribucion de probabilidades varıa a lo largo del tiempo o

simplemente no es conocida a priori. Esto puede ocurrir con imagenes de diferentes tipos o

imagenes muy heterogeneas, con regiones muy diferentes. Un solucion es que la distribucion

de probabilidades se vaya adaptando segun avanza la codificacion, es decir, con cada sımbolo

que se codifica se vuelven a calcular las probabilidades.

La longitud de la codificacion sin incluir nigun tipo de informacion extra y asumiendo

que no hay ningun tipo de artefacto de codificacion se puede calcular como,[10]:

Page 44: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

40 Capıtulo 2. Codificacion de Imagenes Perceptuales

Intervalo Actual Accion a b final Entrada[0.00,1.00) Dividir [0.00,0.40) [0.40,0.90) [0.90,1.00) b[0.40,0.90) Dividir [0.40,0.60) [0.60,0.85) [0.85,0.90) b[0.60,0.85) Salida 1

Expandir [1/2,1)[0.20,0.70) Dividir [0.20,0.40) [0.40,0.65) [0.65,0.70) b[0.40,0.65) Seguir

Expandir [1/4,3/4)[0.30,0.80) Dividir [0.30,0.50) [0.50,0.75) [0.75,0.80) final[0.75,0.80) Salida 10

Expandir [1/2,1)[0.50,0.60) Salida 1

Expandir [1/2,1)[0.00,0.20) Salida 0

Expandir [0,1/2)[0.00,0.40) Salida 0

Expandir [0,1/2)[0.00,0.80) Salida 0

Tabla 2.2: Ejemplo de codificacion Aritmetica mediante un metodo alternativo que propor-ciona el codigo de manera progresiva y previa a la codificacion de todos los sımbolos. Comose ve el resultado es el mismo que para el ejemplo expuesto en la anterior tabla, 1101000.El bit final transmite la informacion del ultimo intervalo − log2 0.8 ≈ 0.322 bits.

LSS = − log2

n∏

i=1

(pi/t)ci = t log2 t−

n∑

i=1

pi log2 pi (2.4)

Donde t es la longitud de la informacion original en bytes, ci el numero de ocurrencias

del sımbolo si, y n el numero de sımbolos del alfabeto. Para ilustrar esto vease el ejemplo

de la tabla 2.3.

Si se conocen las probabilidades de ocurrencia de los sımbolos se pueden ir disminuyendo

sus probabilidades a medida que estos se codifican, puesto que la probabilidad de ocurrencia

sera menor. Este metodo, llamado codificacion Semi-Adaptativa, puede llegar a ahorrar bits,

tabla 2.4, pero se necesita conocer la distribucion de probabilidades exacta y a priori. La

longitud para la codificacion Semi-Adaptativa es:

LSD = − log2

((

k∏

i=1

pi!

)

/t!

)

(2.5)

Donde k es el numero de sımbolos diferentes que ocurren en la secuencia.

Page 45: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.3. Codificacion Aritmetica 41

Intervalo Actual pa pb pc Entrada

0.000000000 1.000000000 3/8 3/8 2/80.000000000 0.375000000 3/8 3/8 2/8 a0.140625000 0.281250000 3/8 3/8 2/8 b0.140625000 0.193359375 3/8 3/8 2/8 a0.180175781 0.193359375 3/8 3/8 2/8 c0.185119629 0.190063477 3/8 3/8 2/8 b0.188827515 0.190063477 3/8 3/8 2/8 c0.189291000 0.189754486 3/8 3/8 2/8 b0.189291000 0.189464808 3/8 3/8 2/8 a

Tabla 2.3: Codificacion Aritmetica de la secuencia abacbcba con la distribucion de proba-bilidades P = {pa = 3/8, pb = 3/8, pc = 2/8}. El intervalo final es [0.001100000111011,0.001100001000000). La longitud es −p log2 0.000173808 ≈ 12.490 bits, con lo que al finalqueda 0011000001111, 13 bits.

Intervalo Actual pa pb pc Entrada0.000000000 1.000000000 3/8 3/8 2/80.000000000 0.375000000 2/7 3/7 2/7 a0.140625000 0.281250000 1/6 2/6 2/6 b0.140625000 0.193359375 1/5 2/5 2/5 a0.180175781 0.193359375 1/4 2/4 1/4 c0.185119629 0.190063477 1/3 1/3 1/3 b0.188827515 0.190063477 1/2 1/2 0/2 c0.189291000 0.189754486 1/1 0/1 0/1 b0.189291000 0.189464808 0/0 0/0 0/0 a

Tabla 2.4: Codificacion Aritmetica Semi-Adaptativa de la secuencia abacbcba con la dis-tribucion de probabilidades P = {pa = 3/8, pb = 3/8, pc = 2/8}. El intervalo final es[0.001001110101000, 0.001001111100011). La longitud es −p log2 0.001785714 ≈ 9.129 bits,con lo que al final queda 0010011110, 13 bits.

Para la decodificacion es necesario conocer exactamente la distribucion de probabilidades

de los sımbolos. Para ello es necesario enviar la distribucion al decodificador. La longitud de

bits necesarios para codificar las distribuciones se calcula mediante el numero de distribu-

ciones posibles segun la siguiente formula:

LM = −log2(

t+ n− 1n− 1

)

(2.6)

Para un archivo de 8 bytes (t = 8) y 3 sımbolos de alfabeto (n = 3) LM = log2 45 = 5.492

bits.

Page 46: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

42 Capıtulo 2. Codificacion de Imagenes Perceptuales

El problema que tienen los metodos anteriores es que se necesita conocer a priori la dis-

tribucion de probabilidades y esto puede no ser posible en todos los casos. La codificacion

Adaptativa parte precisamente de este hecho, las probabilidades son desconocidas a priori.

Consiste en asignar un espacio equiprobabilıstico a todos los signos, con lo que ya no es

necesario transmitir la informacion de probabilidades al decodificador. Despues se van re-

calculando, segun el metodo de estimacion que se crea conveniente, con cada entrada de

sımbolo. Un ejemplo se muestra en la tabla 2.5.

Intervalo Actual pa pb pc Entrada0.000000000 1.000000000 1/3 1/3 1/30.000000000 0.333333333 2/4 2/4 1/4 a0.166666667 0.250000000 2/5 2/5 1/5 b0.166666667 0.200000000 3/6 2/6 1/6 a0.194444444 0.200000000 3/7 2/7 2/7 c0.196825397 0.198412698 3/8 3/8 2/8 b0.198015873 0.198412698 3/9 3/9 3/9 c0.198148148 0.198280423 3/10 4/10 3/10 b0.198148148 0.198187831 4/11 4/11 3/11 a

Tabla 2.5: Codificacion Aritmetica Adaptativa de la secuencia abacbcba con la distribu-cion de probabilidades P = {pa = 1/3, pb = 1/3, pc = 1/3}. El intervalo final es[0.00110010101110011101, 0.00110010101111000111). La longitud es −p log2 0.000039683 ≈14.621 bits, 5.492 bits mas que en el ejemplo de la codificacion Semi-Adaptativa. El codigofinal queda 001100101011101, 15 bits.

La longitud del codigo en la codificacion Adaptativa queda:

LA = −log2((

∏ki=1 ci!

)

/nt)

, Sabiendo que

(

t+ n− 1n− 1

)

= nt/t! (2.7)

Segun las ecuaciones 2.5,2.6 y 2.7 es inmediato comprobar que LA = LSD + LM . Es-

to quiere decir que la diferencia de eficiencias entre la codificacion Adaptativa y Semi-

Adaptativa es la informacion extra que hay que enviar en la ultima para que el decodificador

conozca la distribucion de probabilidades. Siendo las eficiencias finales de las dos peores

que si se supiera la distribucion a priori en el codificador y decodificador como en el caso

de la tabla 2.3. La ventaja de los metodos adaptativos es que no se necesitan conocer las

probabilidades de antemano, pero a cambio se reduce la velocidad del algoritmo al aumen-

tar la complejidad y la eficiencia de compresion disminuye. Otra posible complicacion que

puede surgir es la precision de las probabilidades que, conforme se codifican mas sımbolos,

se requiere mas precision. Las soluciones a esto se presentan en la siguiente seccion.

Page 47: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.3. Codificacion Aritmetica 43

2.3.3 Precision del Intervalo

Como se ve en los ejemplos expuestos anteriormente a medida que se avanza en la codifi-

cacion el intervalo resultante es mas y mas pequeno, con lo que la precision requerida para

almacenarlo es cada vez mayor. Esto es un grave problema y muy crıtico en la mayorıa de

los codificadores que utilizan precision finita.

Una primera solucion para facilitar el manejo de los intervalos es la utilizacion de numeros

enteros, teniendo en cuenta que todos los intervalos son menores que 1. Esto evidentemente

tambien tiene sus limitaciones computacionales en cuanto al numero de dıgitos a manejar

en una variable.

Una segunda solucion, que es la adoptada por la mayorıa de los algoritmos, [24], es

terminar la codificacion justo antes de que se produzca el desbordamiento en las variables

que almacenan los extremos del intevalo. Como se puede imaginar esta medida hace que la

eficiencia de la compresion aritmetica sea menor, puesto que las secuencias son menores y

hay que insertar mas sımbolos de final de codificacion.

Otra opcion, mas costosa en computo pero que proporciona mayor eficiencia en compre-

sion es manejar la precision de los extremos de los intervalos con los dıgitos por separado.

Con esto se consigue una precision infinita unicamente limitado por los recursos de memoria

del sistema, pero no de la precision del mismo. Este metodo, como todos, tiene sus ventajas

y sus inconvenientes que se analizaran mas adelante puesto que sera el utilizado.

Un problema asociado a la precision requerida, pero en este caso para las probabilidades,

deriva del uso de codificaciones adaptativas donde a medida que se codifican los sımbolos

se necesita mas precision. Una manera de evitar esto es utilizar escalado. Esta tecnica

consiste en reducir periodicamente las probabilidades, es decir, antes de que alguna de las

probabilidades desborde la capacidad de la variable que la contiene se multiplican todas

por un valor prefijado. El escalado disminuye la eficiencia de compresion aunque no en una

cantidad significativa,[10].

2.3.4 Final de Codificacion

Si la informacion codificada, o comprimida en este caso, tiene a continuacion otro tipo de

datos ajenos a la codificacion en sı, como puede ocurrir en un fichero, se corre el riesgo

de que esta se tome como otros sımbolos codificados puesto que no hay nada que indique

hasta donde llega. Para esto se utiliza un sımbolo que indique el final de la codificacion

que hace que el decodificador termine cuando lo lea. El problema es que se pierde eficiencia

de compresion por introducir un nuevo sımbolo y la distribucion de probabilidades queda

distorsionada. Segun los trabajos de Witten, Neal y Cleary el uso de un sımbolo especial de

Page 48: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

44 Capıtulo 2. Codificacion de Imagenes Perceptuales

fin de codificacion implica un exceso de menos de t/(B ln 2) + log2B + 10 bits, siendo 2B el

numero de sımbolos de la secuencia final y t la longitud de la informacion original en bytes.

El coste adicional suele estar en torno a los 0.01 bits por sımbolo de entrada.

Una alternativa en la que no es necesario utilizar este sımbolo de fin de codificacion es

incluir una cabecera que indique la longitud de la secuencia codificada que hace que no se

pierda eficiencia en la distribucion de las probabilidades, pero a cambio se aumenta la del

volumen de bits por esta cabecera. Sin embargo este metodo tiene una ventaja muy buena

y es que si los sımbolos se van codificando por secuencias o bloques iguales o parecidos,

las longitudes indicadas en las cabeceras se pueden indicar con una codificacion diferencial,

disminuyendo mucho la informacion necesaria para codificarlas. Esta tecnica se utilizara

mas adelante.

Una vez explicadas las caracterısticas de codificacion que se utilizaran, se procede a la

descripcion del algoritmo de codificacion propuesto.

2.4 Codificacion de Imagenes Retinianas

El SVH, retomando la seccion 2.1, analiza las diferentes caracterısticas de las imagenes

percibidas (bordes, texturas y gradientes) con diferentes mecanismos, con lo que se puede

suponer que dichas caracterısticas se procesan por separado; se puede hablar por tanto de

canales de vision. Segun esto es logico pensar que la separacion de las imagenes retinianas en

varios canales de informacion serıa un buen metodo de codificacion perceptual de imagenes.

La figura 2.17 muestra el sistema de codificacion disenado, que se ira detallando en sucesivos

apartados.

Figura 2.17: Diagrama de la codificacin de imagenes retinianas.

El primer paso es hacer un analisis retiniano de la imagen obteniendo dos imagenes

llamadas ON y OFF. Estas dos imagnes contienen la informacion de contraste moduladas

por la luminancia local. Muestran los cambios de luminancia o bordes de la imagen. Las

celulas ON y OFF responden siempre a lados distintos de un escalon, las primeras a los

Page 49: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 45

incrementos de luminosidad y las segundas a los decrementos, de tal manera que el borde

queda en medio de las dos respuestas de las celulas como en la figura 2.6. Saber en que

lugar esta el borde es fundamental para saber en que direccion se debe hacer el filling in. En

principio las dos imagenes, ON y OFF, son igual de importantes para conocer el lugar del

borde, pero en realidad solo es necesario conocer el contraste de una imagen y la modulacion

de luminancia local de otra. Resumiendo, solo es necesario codificar la informacion de

contraste de ON y la luminancia local de OFF. Esto reduce mucho la informacion a codificar

ya que la imagen OFF tendra menos entropıa de la original.

La informacion mas importante para el SVH esta en la informacion de bordes ya que de

ellos depende la reconstruccion de las superficies, basico para tareas tan importantes como

el reconociento de objetos. Los detalles mas finos que terminan de reconstruir la imagen se

procesan por otro lado, esto es, texturas y gradientes de luminancia. El proyecto se centra en

la parte mas importante, la informacion de bordes, que tratara de codificar lo mas eficiente

posible, sin perdidas. En la informacion de texturas, que es menos perceptible, se podran

introducir perdidas con lo que se tratara con mas dureza en terminos de compresion.

Una forma de codificacion de los bordes es recorrerlos mediante algoritmos de busqueda

codificando los movimientos y las amplitudes que se van encontrando con codigos Huffman y

aritmeticos. Debido a la forma que tienen dichos bordes, uniformes y compactos, este metodo

de codificacion se revela muy eficiente. Por otro lado las texturas se pueden codificar con

diferentes metodos con perdidas, pero no se les prestara una especial atencion.

2.4.1 Separacion Bordes-Texturas

Las imagenes retiniano describen el contraste de las imagenes proyectadas por la optica del

ojo en la retina, esto es, describen las cambios de luminosidad. Como resultado del procesado

del cortex visual se observan dos caracterısticas tıpicas: bordes y texturas, es decir, se

pueden diferenciar regiones que describen los contornos de las figuras, grandes transiciones

de luminosidad, y regiones donde se describen los finos detalles de las superficies que mas bien

tienen la forma de ruido. Los primeros, los bordes, son fundamentales para la reconstrucion,

los que contienen el grueso de la informacion. Estas dos caracterısticas permitiran que se

pueda separar la imagen en dos componentes, bordes y texturas. Los primeros se codificaran

sin perdidas, con ciertas puntualizaciones, y las segundas con o sin perdidas. Segun lo severo

que sea el metodo de separacion de los bordes se podra obtener mas o menos texturas,

con lo que se tendra mas o menos perdidas, lo que le da una gran flexibilidad al algoritmo

de compresion. A partir de aquı el centro de atencion estara en los bordes, en tratar de

codificarlos lo mas eficientemente posible ya que las texturas, menos visibles, pueden ser

tratadas con cualquier estrategia de codificacion con perdidas como codificar los coeficientes

Page 50: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

46 Capıtulo 2. Codificacion de Imagenes Perceptuales

mas energeticos, emplear transformadas del coseno o incluso wavelets.

a b c

Figura 2.18: Imagenes retinianas de Lena (256x256). a. Original. b. ON. c. OFF.

Las formas de los bordes son largas lıneas o esqueletos de 2 a 4 pıxeles de ancho, en

funcion de los contornos de los objetos y de la escala empleada en la deteccion de las imagenes

retinianas. La escala viene dada por la dimension de las mascaras que obtienen las imagenes

retinianas, a menor escala bordes mas grueso, con mayor informacion. Para separar los

bordes de las texturas en las imagenes retinianas se utilizan detectores de lınea con mascaras

de 3, 5 y 7 pıxeles. Estas mascaras recorren la imagen pixel a pixel y detectan si el pixel

pertenece a una lınea. Las mascaras se pasan en cuatro orientaciones, horizontal, vertical

y dos diagonales, que son las direcciones predominantes del SVH. Estas se muestran en la

figura 2.19.

Figura 2.19: Mascaras empleadas en la separacion de bordes y texturas para la orientecionhorizontal.

El resultado de la aplicacion de las tres mascaras a la imagen retiniana de Lena (ON)

(figura 2.18) se muestra en la figura 2.20, donde se puede ver que la mascara de ancho 5

tiene mejor comportamiento ya que no introduce tanto ruido como la 3x3 y tiene mejor

sensibilidad que la 7x7.

Page 51: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 47

a b c

Figura 2.20: Resultado de la obtencion de bordes en la imagen retiniana de lena (ON) conmisma cantidad de entropıa (1.5 bpp).a Mascara de 3x3. b Mascara de 5x5. c Mascara de7x7. Las imagenes tienen un realce log(1 + x).

La obtencion de los bordes necesita un umbral para decidir si el coeficiente pertenece a

un borde o bien si es textura. Este umbral permite elegir una calidad de compresion final

decidiendo que cantidad de informacion se codificara en bordes y por tanto sin perdidas.

El umbral se indica en tanto por ciento (%) en funcion del rango dinamico de la imagen

retiniana, lo que no quiere decir que tenga una relacion lineal con la cantidad de informacion

que se separa entre bordes y texturas. La relacion es exponencial como muestra la figura

2.21 donde se ve como se va distribuyendo la cantidad de informacion, medida en bits por

pixel, en informacion de bordes e informacion de texturas. La suma de las dos es poco mayor

que el total teniendo un maximo justo cuando la cantidad de bordes es igual a la cantidad

de texturas.

Figura 2.21: Relacion entre la cantidad de informacion de bordes y texturas (bpp) en funciondel umbral utilizado en la deteccion de lıneas.

En la figura 2.22 se observa como afecta el umbral a la distribucion entre bordes y

Page 52: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

48 Capıtulo 2. Codificacion de Imagenes Perceptuales

texturas.

a b c d e

Figura 2.22: Separacion entre bordes y texturas con la mascara 5x5 y diferentes umbrales.a Umbral 0.05%.b Umbral 3%. c Umbral al 8%.d Umbral 20%. e Umbral 50%.

Esta extraccion de las texturas de las imagenes retinianas tambien se puede llevar a cabo

con modelos neuronales. Como ya se menciono antes se pueden utilizar las celulas par para

detectar texturas. La principal diferencia es que los modelos neuronales interpretan como

textura las lıneas finas de la imagen y estas se codifican con una buena eficiencia si fuesen

bordes.

2.4.2 Codificacion de Cadenas

Una vez obtenidos los bordes propios de las imagenes retinianas se procede a la codificacion

de cadenas que constituye, en la codificacion de imagenes retinianas, un metodo cuanto

menos evidente debido a sus caracterısticas antes mencionadas. En estas hay gran parte

de informacion nula o mas bien coeficientes que no tienen informacion porque son cero. La

codificacion de cadenas sera capaz de ignorar totalmente estos coeficientes, con lo que se

puede comprender la gran capacidad de compresion que deriva de esto y tambien otras de

las razones de porque separar las texturas ya que, ademas de ser menos visibles, empeoran la

eficiencia de compresion. Esto quedara claro mas adelante. Si bien el proceso de codificacion

de bordes es sin perdidas, sı pueden derivarse perdidas controlando el margen dinamico

(resolucion de contraste) y la escala.

El algoritmo, representado en la figura 2.23, se puede esquematizar de la siguiente manera:

• Se recorre la imagen desde la fila superior a la inferior y de izquierda a derecha hasta

que un pixel sea mayor que 0. Este pixel sera la cabeza. Se almacena su amplitud, una

Page 53: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 49

direccion inicial y su posicion respecto a la anterior cabeza. Si es la primera respecto

a una amplitud inicial y respecto a la esquina superior izquierda.

• Se miran los pıxeles vecinos y el primero que se encuentre que sea mayor que 0 se

almacena su amplitud y su direccion o movimiento respecto al anterior pixel y se

repite este punto, teniendo en cuenta los pıxeles ya codificados. Si este pixel no tiene

nigun vecino se inserta el final de cadena.

• Si no se ha llegado al final de la imagen se sigue recorriendo la misma codificando

nuevas cadenas.

• Se calculan las distribuciones estadısticas de las amplitudes y movimientos por separado

y se codifican.

• Se insertan las cabeceras de control al principio de la trama.

Figura 2.23: Ejemplo de busqueda de una cadena.

Figura 2.24: Formacion de cadenas.

La forma que tienen las cadenas almacenadas tienen la forma de la figura 2.24. Pero en el

proceso de codificacion se procesa la informacion por separado por ser mas eficiente, por una

lado estan las amplitudes por otro los movimientos y por otro las posiciones de las cabezas,

ademas de las cabeceras de control. A continuacion se procede a describir las principales

caracterısticas del metodo de codificacion de cadenas desarrollado.

Page 54: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

50 Capıtulo 2. Codificacion de Imagenes Perceptuales

Codificacion de Amplitudes

Como ocurre en imagenes naturales y artificiales en general el valor de amplitud de un

pixel es muy parecido al valor de amplitud de sus vecinos debido a que la imagen no varıa

bruscamente de un valor a otro, es decir, predominan las bajas frecuencias espaciales frente

a las altas. Esto tambien se cumple para las imagenes retinianas.

Teniendo en cuenta esto, se pueden codificar las amplitudes con valores relativos, es decir,

se codifica el incremento de amplitud entre la cabeza actual a codificar y la anteriormente

codificada. El resultado es una codificacion diferencial DPCM (Differential Pulse Code

Modulation),[23].

La codificacion DPCM se puede enmarcar dentro de las codificaciones predictivas en las

cuales estarıa tambien la prediccion de movimiento utilizada en el estandar MPEG, la cual

se sale fuera del ambito de este proyecto. Las tecnicas predictivas se basan en la idea de que

no hace falta enviar informacion si se predice la secuencia de sımbolos a transmitir. Esto

implica un grado de compresion maximo pero evidentemente el predictor deberıa adivinar

todos los sımbolos sin cometer ningun fallo. Se vera que no se llega a este nivel de prediccion

pero si se pueden construir predictores muy buenos que consiguen aumentar mucho la tasa

de compresion.

El rendimiento de un predictor se basa en el buen conocimiento de las caracterısticas

estocaticas de la fuente. Como la prediccion no siempre sera exacta se recurre a enviar el

error de prediccion, por tanto cuanto mejor sea el modelo de prediccion menor sera el error

y por tanto menor la informacion a transmitir. La compresion producida es evidente.

El primer problema que surge con las codificaciones DPCM es el modelado estadıstico

de la fuente. Si es bueno puede conseguir buenas tasa de compresion, pero si es malo puede

incluso introducir redundancia y transmitir mas informacion que la que se pretende enviar

en un principio. El modelo general sera enviar el error o diferencia de la siguiente manera:

d(n) = x(n)− x(n) (2.8)

Donde x(n) es la senal original a transmitir, x(n) es la prediccion y d(n) es la diferencia

en la prediccion. En la figura 2.25 se muestra el esquema general de un codificador predictivo

diferencial DPCM.

Existe una gran aceptacion en el hecho de que el error de prediccion cometido para la

mayorıa de las imagenes se puede aproximar a una distribucion Laplaciana. Esto tambien

se cumple en las imagenes retinianas y por tanto estos modelos se podran utilizar en la

codificacion de las mismas. Esta distribucion Laplaciana tiene la forma:

Page 55: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 51

a b

Figura 2.25: Esquemas de codificacion DPCM. a Codificador. b Decodificador.

fµ,σ2(x) =1√2σ2

exp

(

−√

2

σ2|x− µ|

)

(2.9)

Figura 2.26: Distribucion Laplaciana (µ = 0,σ = 5).

Donde µ y σ2 son la media y la varianza de la distribucion respectivamente. Si µ = 0,

entonces la probabilidad discreta del sımbolo i es:

pσ2(k) =

∫ k− 12

k+ 12

1√2σ2

exp

(

−√

2

σ2|x|)

dx (2.10)

Page 56: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

52 Capıtulo 2. Codificacion de Imagenes Perceptuales

El calculo de entropıa se puede obtener :

H =∑

k

−pσ2(k) log2 pσ2(k) (2.11)

Si la distribucion de probabilidades no es exacta, no esta bien calculada o simplemente

varıa a lo largo del tiempo la eficiencia de compresion sera menor. De tal manera la longitud

media de la secuencia codificada es:

H =∑

k

−pσ22(k) log2 pσ21(k) (2.12)

Siendo σ1 la distribucion utilizada y σ2 la distribucion real, de manera que H ≥ H.

Se denomina Ganancia de Prediccion Gp a la relacion entre la varianza de la fuente (σ2x)

y la varianza de la prediccion (σ2d):

Gp =σ2xσ2d

(2.13)

De la expresion anterior se deduce que cuanto mejor sea la prediccion menor sera la

varianza y por tanto mayor sera la ganancia de prediccion. Si no se produce el proceso de

cuantificacion, como es el caso de senales discretas que se han venido considerando en todo

es trabajo, el error sera nulo, es decir, el codificador no tendra perdidas. Para Gp = 1 no se

produce mejora y para Gp < 1 se empeora.

En el proceso de prediccion se utilizan predictores lineales y no lineales. Los segundos

son mas complejos y no se trataran aquı. La forma general de construccion de los predictores

lineales, si no hay cuantificacion de d(n), se puede representar como:

x(n) =N∑

i=1

αix(n− i) (2.14)

Teniendo esto, un buen diseno es aquel que minimiza la varianza del error de prediccion

d(n):

d(n) = x(n)− x(n) = x(n)−N∑

i=1

αix(n− i) (2.15)

Se trata pues de minimizar:

σ2d = E

(

x(n)−N∑

i=1

αix(n− i)

)2

(2.16)

Page 57: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 53

Se deriva la anterior expresion respecto de los αi igualandola a 0 y como resultado se

obtiene un sistema matricial de ecuaciones que depende, como es logico, de las caracterısticas

de la fuente (σ2x).

La prediccion utilizada es la mas sencilla:

x(n) = α1x(n− 1) (2.17)

La senal diferencia es:

d(n) = x(n)− x(n) = x(n)− α1x(n− 1) (2.18)

La varianza es:

σ2d = E[(x(n)− α1x(n− 1))2]= E[x(n)x(n)]− 2α1E[x(n)x(n− 1)] + α2

1E[x(n− 1)x(n− 1)]= σ2x − 2α1rxx(1) + α2

1σ2x

(2.19)

Donde rxx(1) es la funcion de autocorrelacion definida como 1N

∑N−2n=0 x(n)x(n + 1).

Derivando se obtiene la condicion:

∂σ2d∂α1opt

= 0⇐⇒ α1opt =rxx(1)

σ2x(2.20)

Este valor recibe el nombre de funcion de autocorrelacion de valor cuadratico medio

normalizado. Los valores que adquiere estan en el rango de (-1,1). Si el valor es 1 la

correlacion es maxima, las muestras son iguales. El valor -1 indica amplitudes iguales de

signo contrario y un valor de 0 que la decorrelacion es total. En prediciones en el mismo

cuadro o ’intraframe’, como es el caso, el valor suele estar en torno a 0.96, lo que da una

ganacia de prediccion de:

Gp =σ2xσ2d

=1

1−(

rxx(1)σ2x

)2 =1

1− 0.962> 12dB (2.21)

En la practica se aproxima α1opt ≈ 1 para reducir el numero de operaciones y utilizar

aritmetica de punto fijo.

La prediccion que se utilizara es por tanto una prediccion de primer orden, que por otro

lado proporciona un buen resultado, con α1 = 1. Las predicciones de mas ordenes no dan

una mejora notable, ya que la ganancia de prediccion se satura muy rapidamente, ası que se

descartaron. En concreto se probaron de 2o y 3er orden.

El hecho de que no haya cuantificador evita problemas tıpicos de reconstruccion como la

sobrecarga de pendiente, el ruido granular y la sobreactivacion de bordes.

Page 58: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

54 Capıtulo 2. Codificacion de Imagenes Perceptuales

Ası pues, se van codificando las diferencias entre las amplitudes en funcion de la proba-

bilidad marcada por la distribucion Laplaciana. El problema que surge en la codificacion de

la varianza en la cabecera es la eleccion del numero de bytes utilizados para tener una buena

precision y abarcar un rago suficientemente amplio. Segun Glor, [10], solo se necesitan 37

distribuciones para tener una perdida causada por la codificacion menor de 0.005 bits por

pixel, que es una cantidad bastante pequena. Las varianzas se representan en la tabla 2.6 de

modo que con 6 bits es suficiente para indexar toda la tabla.

Rango Varianza Rango Varianza Rango Varianza

0.005-0.023 0.016 2.882-4.053 3.422 165.814-232.441 195.5690.023-0.043 0.033 4.053-5.693 4.809 232.441-326.578 273.9290.043-0.070 0.056 5.693-7.973 6.747 326.578-459.143 384.7220.070-0.108 0.088 7.973-11.170 9.443 459.143-645.989 540.2250.108-0.162 0.133 11.170-15.627 13.219 645.989-910.442 759.1470.162-0.239 0.198 15.627-21.874 18.488 910.442-1285.348 1068.7520.239-0.348 0.290 21.874-30.635 25.875 1285.34-1816.634 1506.5240.348-0.502 0.419 30.635-42.911 36.235 1816.634-2574.021 2125.4190.502-0.718 0.602 42.911-60.123 50.715 2574.021-3663.589 3007.1330.718-1.023 0.859 60.123-84.237 71.021 3663.589-5224.801 4267.7341.023-1.450 1.221 84.237-118.157 99.506 5224.801-7247.452 6070.9181.450-2.046 1.726 118.157-165.814 139.489 7247.452-10195.99 8550.9342.046-2.882 2.433

Tabla 2.6: Varianzas de distribucion Laplaciana que aseguran una perdida menor de 0.005bpp.

Por ejemplo, si se tiene una distribucion con σ22 = 2, el intervalo al que pertenece es

[1.450,2.046), y la codificacion se hara con σ1 = 1.726. Aplicando las ecuaciones 2.11 y 2.12,

se tiene que H = 2.484 bits por muestra, mientras que H = 2.488 bits por muestra; una

diferencia de 0.004 bits.

Las amplitudes de las cabezas deben tener un valor absoluto a partir del cual codificar

el resto de amplitudes de la cadena. Pero tambien se puede hacer una mejora codificando

DPCM tambien las amplitudes de las cabezas respecto a la cabeza de las primera cadena.

Esto en principio no tiene porque propocionar un buen resultado ya que las cabezas pueden

estar en zonas muy alejadas dentro de la imagen y no tienen porque tener una dependencia

en la amplitud, pero como se ve en la figura 2.27.a tambien tienen una distribucion Lapla-

ciana. Aunque esta distribucion Laplaciana sera mas ruidosa es suficiente, como se vera mas

adelante, para aumentar la eficiencia de compresion. Por tanto por un lado se hara una cod-

ificacion DPCM con las amplitudes de las cabezas y por otro lado otra codificacion DPCM,

totalmente independiente de la primera, con las amplitudes de los pixeles de las cadenas. La

Page 59: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 55

codificacion diferencial de la primera cabeza se hace respecto a la mitad del rango dinamico

de la imagen. Por ejemplo: si la imagen utiliza 8 bits (256) el valor inicial de la codificacion

diferencial sera 28/2 = 128

En la figura 2.27 se muestran las distribuciones de las dos codificaciones DPCM con las

correspondientes aproximaciones segun la tabla 2.6.

a b

Figura 2.27: Distribuciones de las codificaciones DPCM de las amplitudes de las cabezas ydel resto de pıxeles de las cadenas. El trazo negro representa la aproximacion realizada. aDPCM cabezas σ2 = 273.929. b DPCM cadenas σ2 = 195.569.

A la salida del codificador DPCM se produce una nueva codificacion, la codificacion

Aritmetica. Esta codificacion se hara a posteriori, una vez obtenidas todos los valores de

amplitudes de las cadenas, es decir, se hara una codificacion Aritmetica no adaptativa.

La ventaja que tiene este metodo frente a una Aritmetica adaptativa es que se utiliza la

distribucion exacta de las amplitudes, con lo que el proceso de codificacion es mas eficiente;

ademas de ser mas rapido y sencillo de implementar. Por contra no se pueden obtener los

resultados hasta que no finalice el proceso de codificacion, aunque mas adelante se vera como

se puede evitar esto.

El primer problema, y el mas serio, que surge en la construccion de un codificador ar-

itmetico es la extremada precision que necesita. Conforme se van codificando los sımbolos

se necesita mas y mas precision. En la seccion 2.3.3 se comentaron metodos para evitar los

problemas de desbordamientos. Pero estos metodos solo funcionan para alfabetos pequenos y

las imagenes normalmente tienen rangos de [1,256], lo que produce alfabetos de 256 sımbolos

u 8 bits. En caso de codificaciones DPCM se necesita un bit mas, es decir, 9 bits o rangos

de [-255,256]. Segun esto, para representar eficientemente probabilidades con distribuciones

Laplacianas en alfabetos tan grandes se necesita de entrada precisiones mayores de 8 y 10

Page 60: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

56 Capıtulo 2. Codificacion de Imagenes Perceptuales

dıgitos y mucho mas para las sucesivas particiones de los intervalos resultantes de la codifi-

cacion Aritmetica.

Cada numero correspondiente a una probabilidad de un sımbolo o al extremo de un

intervalo se representara mediante un exponente, que puede no costar mas de 8 bits, y los

dıgitos, almacenados uno por uno en arrays con 4 bits para cada uno. Comentar que todos

los intervalos y probabilidades a almacenar siempre seran menores que 1, por tanto el primer

dıgito no es necesario manejarlo puesto que siempre es el mismo y no varıa.

Las funciones del codificador aritmetico estan implementadas en Matlab y manejan las

variables con la representacion y la precision antes comentados. Operan dıgito a dıgito con

control de acarreos y se evitan manejos de ceros tanto por la izquierda como por la derecha

para reducir el numero operaciones logicas. El problema que tienen estas operaciones de

alta precision es que requieren tiempos de calculo elevados. Para solucionarlo se recurre

a la implementacion en lenguaje C de aquellas partes de codigos que mas trabajo lleva

para el procesador, como es el caso de bucles y el manejo de variables que requieren mucha

memoria. Para la implementacion en C de dichas partes se utilizan ficheros mex que sirven

como pasarelas entre los lenguajes Matlab y C. El programa Matlab llama a un programa

C externo compilado y le indica la direccion en memoria de las variables con las que tiene

que operar. Aunque el numero de llamadas se incrementa, el resultado es mucho mas rapido

por ser C un lenguaje de mas bajo nivel con operaciones mas eficientes. De esta manera se

puede reducir el tiempo de calculo hasta un 1%, es decir, de calcular en 1 minuto se pasa a

calcular en 0.6 segundos, la mejora es evidente. Para tener mas detalles consultar el Anexo

D.

Por otro lado el manejo de precisiones altas, aun con la mejora de calculos y lenguajes

mas eficientes no es suficiente, ya que el proceso de calculo se incrementa de manera lineal

con cada sımbolo de entrada. Para evitar esto se recurre a truncar la codificacion aritmetica

cada cierto numero de sımbolos de entrada en bloques, al igual que ocurre con precisiones

mas bajas. La ventaja es que se pueden codificar secuencias de sımbolos mas largas, con

una eficiencia de compresion alta, y bloques de longitud fija, muy util para la decodificacion.

Otras ventajas derivadas de truncar la codificacion son que se reduce la propagacion de

errores y se puede ir obteniendo informacion codificada antes de que termine todo el proceso.

Una vez conocido esto, el proceso para la codificacion aritmetica de las amplitudes difer-

enciales es el siguiente:

• Con la distribucion de amplitudes obtenida se calcula la varianza y se obtiene su

aproximacion de la tabla 2.6.

• Con la varianza obtenida se calculan las probabilidades de los distintos sımbolos o

amplitudes con los formatos de representacion de dıgitos y precision.

Page 61: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 57

• Se reinicializan los intevalos (*).

• Con cada amplitud de entrada se van subdividiendo los intervalos correspondientes a

cada amplitud segun la codificacion aritmetica. Ver seccion 2.3 codificacion aritmetica.

• Una vez codificadas todas las amplitudes correspondientes a un bloque se obtiene su

valor en binario y se inserta delante de este su longitud codificada (esto se vera mas

adelante).

• Se procede con las amplitudes restantes reinicializando los intervalos.

En la representacion de los intervalos de probabilidad de las amplitudes se manejan

principalmente dos numeros: el extremo superior del intervalo y un offset. El calculo de

cada intervalo se realiza de la siguiente manera:

Para cada sımbolo si

H=Phi*H;

L=Pli*H;

H=H-L;

offset=L+offset;

final

Donde la variable H, L y offset se inicializan a 1, 0 y 0 respectivamente. Pli es la

probabilidad acumulada hasta el sımbolo si y Phi es la acumulada incluyendo al sımbolo

si, teniendo en cuenta las igualdades Pli = Phi−1 y Phi = Pli+1 (Ver seccion 2.3). Al final

de la codificacion del bloque el offset representa el extremo inferior del intervalo y la suma

de este con H el extremo superior, quedando el intervalo final [offset, offset + H). Esta

manera de representar el intervalo evita tener que hacer multiplicaciones con numeros de

muchas cifras debido a la funcion del exponente. Esto se vera mas claro en el ejemplo de

la tabla 2.7. Cualquier numero que este dentro de este intervalo puede representarlo, pero

para que sea eficiente no se puede escoger cualquiera.

De este proceso de codificacion de un bloque se obtiene un numero mucho menor que 1

y representado por una serie de dıgitos y un exponente. Este numero es el que representa

a toda la secuencia de amplitudes codificadas y hay que representarlo en binario. Para

obtener el numero con la menor cantidad de bits posible el metodo es ir obteniedo los bits

mas significativos de los dos extremos hasta que estos sean diferentes. Evidentemente cuanto

mas pequeno sea el intervalo mas parecidos son los extremos y mas bits se necesitan para

representar el intervalo.

Page 62: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

58 Capıtulo 2. Codificacion de Imagenes Perceptuales

En la representacion de los intevalos se puede hacer una optimizacion en la compresion

teniendo en cuenta lo siguiente: en el extremo superior el primer bit diferenciador sera 1

siempre y en el inferior sera 0 por ser el extremo superior mayor que el inferior. Aunque sea

obvio, en binario uno sigue siendo mayor que el otro y ademas, si se corta la obtencion del

numero binario en este punto, tomando el 1 como ultima cifra, se obtiene un numero que es

mayor que el extremo inferior y menor o igual que el extremo superior, es decir, un numero

que esta dentro del intervalo a codificar, que es lo que se pretendıa. Si se tiene en cuenta

esto el codificador puede eliminar este ultimo bit en cada codificacion porque se sabe que

siempre sera 1.

Ejemplo: Se tiene un alfabeto de 15 sımbolos si con probabilidad Laplaciana pi =8−|i−8|

64

y con las probabilidades acumuladas Ph = {0.015625,0.046875, 0.09375, 0.15625, 0.234375,0.328125, 0.4375, 0.5625, 0.671875, 0.765625, 0.84375, 0.90625, 0.953125, 0.984375, 1.0}.Para codificar la secuencia s = {2, 10, 5, 8, 7, 11, 12, 8, 9, 9, 7, 6, 5, 10, 8} se necesitan

50 bits frente a 60 bits sin compresion y 56 con Huffman regular (tabla 2.8). El proceso se

ilustra en la tabla 2.7 donde el problema de la precision es evidente.

Otro de los problemas asociados a la codificacion aritmetica es la necesidad de incluir

un sımbolo mas en el alfabeto que indique el final de la codificacion. Como ya se comento

en el apartado 2.3.4 esto implica una perdida de eficiencia de compresion. En este caso la

probabilidad del final de codificacion serıa:

pfinal =Npixeles

Npixeles +Npixeles/B=

1

1 +B≈ 1

B(B >> 1) (2.22)

Donde Npixeles es el numero de pıxeles codificados y B el numero de pıxeles codificados

por bloque.

Asociado a esto hay un problema tecnico y es que en la decodificacion no se sabe donde

termina la informacion codificada y donde empieza el resto de informacion asociada a otro

proceso de codificacion o incluso otro tipo de informacion que nada tiene que ver con la

codificacion aritmetica. Para evitar el uso de este sımbolo especial se puede transmitir la

longitud total de cada secuencia de sımbolos codificados. Con esto ademas se consigue una

optimizacion mayor puesto que si las secuencias de sımbolos son constantes, es decir, los

sımbolos se codifican en bloques del mismo tamano, las longitudes de las codificaciones de

dichos bloques seran muy semejantes, con lo que se puede recurrir de nuevo a una codificacion

DPCM de las longitudes.

Un ejemplo se muestra en la figura 2.28 donde se observa que las longitudes resultantes

de las codificaciones de los sucesivos bloques de sımbolos son muy parecidas y por tanto

su distribucion diferencial esta muy proxima al cero con varianzas muy pequenas, lo que

Page 63: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 59

Offset H Entrada

0 1 -0.015625 0.03125 20.03662109375 0.29296875 ∗ 10−2 100.037078857421875 0.2288818359375 ∗ 10−3 50.03717899322509765625 ... 0.286102294921875 ∗ 10−4 80.03718838095664978027 ... 0.312924385070800781 ... 734375 25 ∗ 10−50.03719077678397297859 ... 0.244472175836563110 ... 1119189453125 3515625 ∗ 10−60.03719098305737134069 ... 0.152795109897851943... 122043304443359375 9697265625 ∗ 10−70.03719098974215739872 ... 0.190993887372314929... 83065853118896484375 962158203125 ∗ 10−80.0371909908164980151 ... 0.208899564313469454 ... 99233733415603637695 ... 64611053466796875 ∗ 10−931250.0371909909340040201 ... 0.228483898467857216 ... 91866390239447355270 ... 019183397293090820 ...3857421875 3125 ∗ 10−100.0371909909415011480 ... 0.249904263949218830 ... 73714046729510300792 ... 020981840789318084...753696441650390625 716796875 ∗ 10−110.0317909909420868611 ... 0.234285247452392653... 65577144892796468411 ... 144670475739985704...6886928677558898925 ... 4219970703125 ∗ 10−12781250.0371909909421234682 ... 0.183035349572781760... 52568588528001853887 ... 269273809171863831...8721301443874835968 ... 579685211181640625 ∗ 10−130175781250.0371909909421357659 ... 0.171595640223920400... 101323526624203663071 ... 252444196098622342...2775036045059096068 ... 105954885482788085...1438446044921875 9375 ∗ 10−140.0371909909421365166 ... 0.214494550279900500... 84416124589378773515 ... 315555245123277927...6132967517805809620 ... 632443606853485107...7678318023681640625 ... 421875 ∗ 10−15

Tabla 2.7: El intervalo final es [Offset,Offset+H), con lo que el codigo en binario es00001001100001010101100101001001110011010110010000,50 bits, al cual se le haextraido el ultimo 1 puesto que es conocido por el decodificador. Sin compresion se necesi-tarıan 4 bits/simb x 15 sımb=60 bits y con huffman regular 56 bits (tabla 2.8).

Page 64: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

60 Capıtulo 2. Codificacion de Imagenes Perceptuales

proporciona buenas tasas de compresion. Ademas ya se observa la compresion derivada de

la codificacion Aritmetica ya que la mayorıa de las longitudes estan por debajo de los 256

bits que es la longitud que tendrıa la secuencia de sımbolos sin compresion de ninguna clase.

a b

Figura 2.28: Analisis de las longitudes resultantes de la codificacion aritmetica con bloquesde 32 sımbolos. a Longitudes en bits. b Longitudes diferenciales.

La primera longitud, como en el caso de la codificacion DPCM de las amplitudes, debe

tener un valor absoluto y ,como con las amplitudes, se envıa la diferencia respecto de una

estimacion. Esta estimacion es el numero de sımbolos por el rango dinamico. Se estima la

primera longitud de la codificacion aritmetica respecto de la longitud que se obtendrıa si no

hubiese compresion. Por ejemplo: si se utilizan bloques de 32 sımbolos y un rango dinamico

de la imagen de 8 bits se estima la primera longitud respecto de 32 x 8 = 256 bits.

Las longitudes se codificaran con codigos Huffman segun la tabla 2.8, aunque tambien se

podıan haber codificado aritmeticamente se adopto Huffman por proporcionar una solucion

mas sencilla.

Estos codigos se forman dividiendo la distribucion Laplaciana en escalas, dentro de las

cuales todos los sımbolos tienen la misma longitud. Es una construccion rapida y eficiente.

La escala se codifica de nuevo con Huffman pero la eleccion de los codigos, en lugar de ser

regular, se agrupa de 3 en 3 escalas, como se puede ver en las longitudes de la tabla 2.8.

Esta eleccion es debido a que proporcionaba mejores tasas de compresion.

Codificacion de Movimientos

Hay 8 posibles movimientos en funcion de los 8 posibles vecinos que rodean a un pixel. Pero

si se realiza una codificacion DPCM en funcion del angulos de giro se puede reducir un

Page 65: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 61

Regular No Regular Diferencia DPCM Bits Adicionales

0 (1) (1) 0 -1 (01) (001) -1,1 0,12 (001) (011) -3,-2,2,3 00,01,10,113 (0001) (010) -7,...,-4,4,...7 000,...,011,100,...,1114 (00001) (00001) -15,...,-8,8,...,15 0000,...,0111,1000,...,11115 (000001) (00011) -31,...,-16,16,...,31 00000,...,01111,10000,...,111116 (0000001) (00010) -63,...,-32,32,...,63 000000,...,011111,100000,...,1111117 (00000001) (0000001) -127,...,-64,64,...,127 0000000,...,0111111,1000000,...,1111111...

......

...16 - 32768 -

Tabla 2.8: Tabla de asignacion de codigos Huffman para una codificacion DPCM.

movimiento. En la codificacion DPCM de los movimientos se codifica la amplitud de los

angulos de giro para saltar al siguiente pixel en relacion con la direccion de avance actual,

segun muestra la figura 2.29. El movimiento que no es posible es el giro de 0o o 360o debido

que supondrıa volver hacia atras y este coeficiente ya estarıa codificado. Conociendo esto no

es necesario utilizar un sımbolo especial de fin de cadena ya que este movimiento marcara el

final de la cadena. Evidentemente el primer movimiento es absoluto y no relativo teniendo

en cuenta las 8 direcciones, aunque con algunas matizaciones que se haran despues. Esta

direccion se inserta en la cabeza de la cadena como el movimiento inicial. El rastreo de los

vecinos es en sentido de las agujas del reloj, sentido levogiro, pero se comienza retrocediendo

3 direcciones antes de la anterior.

Figura 2.29: Movimientos relativos posibles en la codificacion de pıxeles dentro de unacadena.

Por otra parte todos los sımbolos no tienen la misma probabilidad de ocurrencia por lo

que seran susceptibles de compresion como se vera mas adelante. Segun los experimentos

hechos con imagenes naturales y artificiales se mantiene una distribucion de probabilidades

Page 66: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

62 Capıtulo 2. Codificacion de Imagenes Perceptuales

mas o menos semejante, aunque no cuantitativamente, si cualitativamente hablando. El

movimiento mas probable dentro de una cadena es el 4, es decir, lo mas probable es seguir

de frente con la misma direccion. Los siguientes mas probables son el 3 y el 5 por igual,

despues el 8 final de cadena, despues el 2 y el 6 y por ultimo el 1 y el 7. Ahora se entiende

el porque de retrasar 3 direcciones en la busqueda de nuevos vecinos, se mejora la eficiencia.

Esta distribucion se presenta en la figura 2.30.

Figura 2.30: Distribucion de probabilidades de los movimientos relativos posibles obtenidacon la imagen retiniana de lena (ON) y con un umbral en la separacion de bordes de 5%.

Pero yendo mas alla, pudiera pensarse que esta distribucion de probabilidades deriva del

tipo de rastreo escogido para buscar los vecinos. La figura 2.31 muestra que no es ası. Se

escogen las cabezas dentro de una imagen totalmente aleatorias y se rastrean tambien los

vecinos en origen y sentido aleatorio en cada pixel, es decir, se eliminan todas las dependen-

cias respecto al metodo de busqueda. Repitiendo el proceso para un numero alto de veces se

contruye otra imagen donde el movimiento mas frecuente en un pixel se representa con un

color determinado. Los colores calidos representan a los movimientos 3, 4 y 5, en particular

el rojo es el 4; y los colores frıos a giros mayores. Se observa como la imagen 2.31.a es muy

caliente, lo que justifica el codificar con menos bits la direccion mas probable, es decir, la

direccion 4. En esta imagen no se tienen en cuenta los pıxeles aislados puesto que no tiene

sentido asignarles una direccion.

Una vez conocido esto, una buena manera de codificar los movimientos es asignar codigos

mas cortos a aquellos que sean mas probables y codigos mas largos a los que sean menos

probables. Dado que el numero de movimientos posibles es muy pequeno, una c odificacion

Huffman resulta en este caso un metodo muy sencilllo, rapido y eficaz. La asignacion de

codigos es inmediata pero queda notar que debido al metodo de obtencion de codigos algunos

de ellos, aun siendo equiprobables, tienen distinta longitud. Tabla 2.9.

Page 67: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 63

Figura 2.31: Probabilidad de los movimientos dentro de las cadenas con metodo de busquedade cadenas totalmente aleatorio. Imagen ’caliente’ de lena. Cuanto mas proximo es elmovimiento a la direccion frontal, movimiento 4, mas caliente o roja es.

Movimiento Codigo

4 13 0015 0108 0016 00012 000017 0000011 000000

Tabla 2.9: Tabla de asignacion de codigos a los movimientos relativos en las cadenas orde-nados segun longitudes.

En las cabezas, como se comento anteriormente, se incluye un movimiento especial, el

movimiento inicial del que van a partir todas las relaciones de los sucesivos movimientos en

la cadena. Evidentemente esta direccion inicial tiene un caracter absoluto respecto de la im-

agen. El movimiento 8 representa hacia abajo, el 4 hacia arriba y el resto se reconstruye en el

sentido de las agujas del reloj, igual que la figura 2.29. Este movimiento inicial es obligatorio

en todas la cabezas sea cual sea la longitud de la cadena, incluso si es un pixel aislado. En

el caso de que sean pıxeles aislados supondra exceso de informacion o redundancia, ademas

de que habra que anadir un segundo movimiento, el de final de cadena; ya que los pıxeles

aislados no necesitan ningun tipo de informacion de movimiento, pero el codificador no tiene

otra manera de saberlo. Para reducir en lo posible la informacion de movimiento en las

cabezas se hacen unas cuantas mejoras.

Se puede explotar el conocimiento de cierta informacion que puede tener el decodificador

Page 68: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

64 Capıtulo 2. Codificacion de Imagenes Perceptuales

de forma implıcita por el metodo de rastreo. Por dicho metodo se puede saber que, en el

momento que el algoritmo se encuentre una cabeza, al menos todos los pıxeles que esten

en filas superiores y la derecha de la misma fila de dicha cabeza ya han sido codificados.

Ademas si la cabeza se encuentra en algun borde de la imagen los posibles movimientos se

reducen drasticamente. Segun esto se distinguen cuatro casos. En la figura 2.32 ademas se

indican los bits asignados a cada movimiento.

a b c d

Figura 2.32: Movimientos posibles en la codificacion de las cabezas en funcion de su posicion.a. Borde izquierdo. b. Borde derecho. c. Borde inferior. d. Ninguno de los anteriores.

La eficiencia de compresion como se puede comprobar aumenta. La misma estrategia

se podrıa haber seguido con la codificacion del resto de la cadena si el pixel a codificar se

encuentra en el borde de la imagen o en la fila inmediatamente inferior a la de la cabeza de

su cadena. Pero hay que tener en cuenta que, aunque se reduzca el numero de direcciones

posibles, hay 5 posibles aproximaciones al borde que tambien habrıa que codificar, con lo

que el posible aumento de eficiencia no es tal. En la figura 2.33 se muestra esto.

Figura 2.33: Movimientos posibles en la codificacion de pıxeles dentro de una cadena alencontrase con el borde de la imagen. Las flechas indican los movimientos para una determi-nada aproximacion. Habrıa otras cuatro posibles que son justamente los pıxeles que indicanlas flechas.

Page 69: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 65

Posicion de las Cabezas

La posicion de las cadenas se codifica tambien mediante DPCM. Segun el metodo de escaneo

de la imagen es evidente que es mas eficiente que se codifique la posicion de la cabeza respecto

a la cabeza anterior a que se codifiquen todas respecto a un mismo punto. De tal manera

que la primera cabeza se codifica respecto a la esquina superior izquierda, puesto que por

este punto se comienza a rastrear la imagen y en el resto se codifican las diferencias por

columnas y por filas segun muestra la figura 2.34. Otra posible estrategia para codificar las

posiciones de las cabezas es codificar la diferencia de posicion segun el rastreo en la imagen,

sin separar entre filas y columnas, esto es, el numero de pıxeles que se han recorrido hasta

encontrar la siguiente cabeza. Este metodo da el mismo resultado, puesto que el anterior

metodo no es mas que una separacion de variables de este, pero con la difencia de ser mas

complicado puesto que la distribucion de probabilidades no es tan evidente. El metodo

escogido se describe a continuacion.

Figura 2.34: Codificacion diferencial de la posicion de las cabezas de las cadenas.

Diferencia de Columnas: La estrategia para las columnas es codificar, con tantos bits

como los necesarios para abarcar toda el ancho de la imagen (log2(ancho)), la diferencia de

columnas entre las dos cabezas. Si el resultado es negativo, si la cabeza actual esta mas a la

derecha que la anterior, se le suma la dimension del ancho. Ası se consige representar todos

los posibles valores. El decodificador solo tiene que sumar a la columna actual en la que se

encuentre el incremento de columna que se codifique, si la posicion resultante es mayor que

el ancho de la imagen, entonces se le resta el ancho. El ancho lo conoce el decodificador por

Page 70: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

66 Capıtulo 2. Codificacion de Imagenes Perceptuales

las cabeceras de trama. La operacion se resume en:

diferencia = columna cabeza actual-columna cabeza anterior;

Si diferencia menor que 0

Diferencia final = Ancho+diferencia;

Si no

Diferencia final = diferencia;

final;

Segun la distribucion de probabilidad encontrada para la diferencia de columnas, figura

2.35, se puede sugerir tambien el emplear una estrategia de codificacion aritmetica. La forma

de la distribucion se asemeja a la forma K ∗ exp(−αx), donde x es la diferencia de columnas

y K y α constantes, de manera que bastarıa con enviar al decodificador las dos variables

para reconstruir la distribucion de probabilidades. Sin embargo estas distribuciones no han

dado buen resultado debido a su gran varianza y a que su aproximacion no es buena, dando

tasas semejantes y en algunos casos mayores que en el espacio equiprobable.

a b

Figura 2.35: Distribucion de probabilidades de la diferencia de posiciones entre las cabezasobtenidas con la imagen retiniana de lena (ON)de 256x256. a Columnas. b Filas.

Diferencia de filas: La mayorıa de la diferencias entre filas para imagenes naturales se

encuentra que son 0 o 1, es decir, la siguiente cabeza que se encuentra esta en la misma fila

o en la siguiente, bajando drasticamente la probabilidad de no encontrar cabezas antes de

las 3 o 4 filas. Si bien esta distribucion se mantiene en la mayorıa de las imagenes puede

variar en las que sean muy homogegenas, sobre todo en las artificiales, donde la cantidad de

bordes es muy pequena. La estrategia para las filas, dada la probabilidad tan puntiaguda que

Page 71: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 67

muestran, figura 2.35, se prefirio elegir una codificacion Huffman que da muy buen resultado

de manera sencilla.

Cabeceras de la Trama

Las cabeceras de la trama se forman en dos partes. En la primera se conforman los datos

que son inmediatos y que se obtienen de la simple lectura de la imagen y se deja espacio para

la segunda parte. En la segunda se almacenan los datos obtenidos a partir de la codificacion

de cadenas, por eso se obtienen al final de todo el proceso, tales como las distribuciones

empleadas en la codificacion Aritmetica, el numero de cadenas,.. . etc. Ası las cabeceras de

trama quedan con los siguientes datos de control:

• Tamano de la imagen: 11 bits para cada dimension. Desde imagenes de 1x1 hasta

2048x2048.

• Numero de cadenas: log2(

Ancho x Alto4

)

. Esta cantidad se ha elegido por encima de los

valores obtenidos en experimentos. Pero no deja de ser por convencion. Ejemplo: para

256x256 se usan 14 bits, lo que da un maximo de 16384 cadenas. Para dimensiones

que no sean potencias de 2 se redondean los valores.

• Varianzas: 6 bits para cada una de las varianzas de las distribuciones de amplitudes

de las cabezas y el resto de amplitudes de las cadenas. 12 bits en total.

• Resolucion de contraste: con 4 bits se representan los 216 posibles niveles del rango

dinamico de la imagen. Normalmente se trabajara con 256 niveles.

• Tamano de bloque: Los posibles tamanos son Bc = 23+bc con bc ∈ [0, 7], por tanto los

sımbolos se codificaran en secuencias de 8 a 1024. La informacion que se manda al

decodificador es bc, que con 3 bits es suficiente.

• Longitud del bloque final: longitud del ultimo bloque codificado al final de la trama.

No es necesario enviar la longitud pero si el numero de sımbolos que lo componen por

tanto se necesitan bc+ 3 bits.

Por tanto el numero de bits de cabecera no es fijo sino que varıa en funcion de las

necesidades de la imagen. El tamano mınimo y fijo de cabecera es 44 bits, que pueden llegar

hasta los 71 bits. En una imagen media de 512x512 no supone mas de 0.00025 bpp.

Una vez descrito el metodo se resume en el diagrama de la figura 2.36.

Page 72: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

68 Capıtulo 2. Codificacion de Imagenes Perceptuales

BUSQUEDA DE

CABEZAS

INICIALIZACIONAmplitud Inical (128)Posicion Inicial (0,0)

Calculo de Amplitud, Posicion Diferencial yMovimiento inicial

Calculo de Amplitud yMovimientos Diferenciales

Vecinos

VecinosFINAL DE CADENA

SiNo

No Si

CODIFICACION DE AMPLITUDES Y MOVIMIENTOS

CABECERAS DE CONTROL

No

Si

Figura 2.36: Diagrama de la codificacion de cadenas.

Page 73: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 69

Decodificacion de Cadenas

El proceso de decodificacion es el siguiente:

• Se lee la cabecera de la trama. Y se forma una imagen con las dimensiones y la

resolucion leıdas.

• Se articulan las cadenas, decodificando las posiciones relativas de las cabezas y los

movimientos relativos segun la codificacion Huffman hecha.

• Se lee la longitud codificada Huffman de bloque de la codificacion aritmetica de las

amplitudes relativas de las cabezas de las cadenas y se decodifica.

• Se lee la cantidad de bits marcada por la longitud, insertando un 1 al final de la misma,

y se decodifica aritmeticamente segun el numero de bits por bloque y las varianzas

leıdas en la cabecera.

• Se repiten los dos pasos anteriores hasta decodificar el numero de cadenas leıdo en la

cabecera.

• Se hace lo mismo con el resto de resto de amplitudes de las cadenas teniendo en cuenta

que el ultimo bloque no necesita longitud, puesto que es hasta el final de la trama,

pero si el numero de sımbolos del bloque.

• Se hace la decodificacion DPCM de las amplitudes cabezas y del resto de las cadenas

y se reconstruye la imagen.

Para mirar a que intervalo pertenece el numero decodificado se hace una busqueda optima

en el rango de sımbolos del alfabeto. Se divide el rango en dos y se mira en que parte, segun

las probabilidades, esta el numero y se vuelve a subdividir el intervalo en dos hasta llegar a

un solo sımbolo; despues se hace lo mismo con el intervalo de este sımbolo hasta decodificar

todos los de un bloque.

2.4.3 Resultados

Para ver la potencia de este metodo de codificacion se muestra el siguiente ejemplo: Una

imagen de 256x256 de donde sus pıxeles valen:

Imagen(i, j) =

{

255, si (i < 128) y (j < 128)0, resto

(2.23)

Page 74: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

70 Capıtulo 2. Codificacion de Imagenes Perceptuales

El resultado es una imagen con un cuadrado blanco de 128x128 en la parte superior

izquierda como muestra la figura 2.37. En la codificacion de dicha imagen basta una sola

cadena que ira zigzageando hasta llegar a la esquina inferior izquierda del cuadrado blanco.

Figura 2.37: Imagen test.

Se usa una codificacion Huffman regular para codificar las amplitudes diferenciales para

que el calculo sea mas facil, aunque la codificacion aritmetica obtendrıa mejores resultados.

Ası, los bits empleados en codificar con un solo bloque la imagen de la figura 2.37 de 256x256

son:

Cabeceras: 11 + 11 (dimensiones) + 14 (no de cadenas). Las varianzas no son necesarias ni la longitudde bloque final por ser Huffman. Tampoco el tamano de bloque por ser solo un bloque.

Cabeza: 1 (posicion fila) + 8 (posicion columna) + 14 (amplitud diferencial=128) + 1 (mov. 6).

Primera Fila: 127 pix * [1 (movimiento=4) +1 (amplitud diferencial=0)].

Primer giro: 4 +4 (dos movimientos=6) + 1 + 1 (dos amplitudes diferenciales=0).

Resto filas: 127 filas * 126 pix/fila * [1 (movimiento=4) + 1 (amplitud diferencial=0)].

Resto de giros: 126 giros * [4 + 4 (dos movimientos=6) + 1 + 1 (dos amplitudes diferenciales=0)].

Final de cadena: 3 (movimiento=8).

Longitudes: 7 (estimacion amplitudes de cabezas 1 ∗ 8 ⇒ longitud = 14 − 8 = 6). Para el resto no es

necesario por ser un solo bloque.

En total son 33598/2562=0.5127 bpp. Si se hace una calculo de la entropıa de la imagen

se obtiene:

HI(bpp) = −p255 log2(P255)− p0 log2(p0) = −1

4log2(

1

4)− 3

4log2(

3

4) = 0.8113 (2.24)

Por lo que se puede concluir que la codificacion de cadenas consigue tasas sin perdidas

menores que la entropıa de la propia imagen. Esto es debido principalmente a las codifica-

ciones DPCM y Aritmetica.

Se pueden reconocer cuatro partes bien diferenciadas del metodo de codificacion de ca-

denas: por una lado esta la informacion necesaria para codificar las posiciones relaticas de

las cabezas de cada cadena. Por otro la informacion de las amplitudes de dichas cabezas.

Page 75: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 71

a b c d

Figura 2.38: Imagenes de prueba con su imagen retiniana de bordes (ON). a. Pimientos. b.Pimientos Retiniano (ON). c. MIT. d. MIT Retiniano (ON).

Por otro los movimientos, tanto de las cabezas como del resto de pıxeles y por ultimo las

amplitudes del resto de pıxeles. La informacion correspondiente de las cabeceras no se tiene

en cuenta por ser un volumen muy pequeno, por lo que se puede despreciar. Segun esto, con

las imagenes retinianas de Lena, Pimientos, y MIT se obtienen las tasas de las figuras 2.39,

2.40 y 2.41 donde se descompone en distintas tasas como contribuye cada una de las partes

a la tasa final de compresion. En negro se indica la entropıa obtenida segun el limite de

Shannon (ecuacion 2.1) despues de la codificacion DPCM. No se pueden obtener tasas por

debajo de este limite. Tambien indica la tasa obtenida con una codificacion Huffman optima

para todos los sımbolos, posiciones, movimientos y amplitudes. En estas figuras se observa

como la parte que mas peso tiene o que mas informacion necesita para ser codificada son las

amplitudes. Notar que las amplitudes de las cabezas tienen un valor mas bajo simplemente

porque el numero de cabezas es mucho menor que el de pıxeles dentro de las cadenas. Tam-

bien se ve que la eleccion de Huffman para la codificacion de las posiciones de las cabezas

y de los movimientos es una buena eleccion ya que se aproxima mucho al lımite Shannon

y ademas con una implementacion mas sencilla que la aritmetica. Por ultimo se ve que a

medida que aumenta el tamano de bloque aumenta la eficiencia de compresion con tasas por

debajo de la entropıa de la propia imagen retiniana (lınea discontınua), pero siempre sin

rebasar la tasa Shannon.

El tiempo de calculo, como ya se menciono antes, aumenta linealmente con el tamano

de bloque elegido en la codificacion Aritmetica. Se hicieron mejoras de optimizacion de

calculo y codigos en lenguaje C. Aunque evidentemente gran parte del calculo se hace bajo

Matlab. El tiempo de calculo varıa de una imagen a otra en funcion de sus caracterısticas,

por ejemplo del numero de cadenas que encuentre el algoritmo de busqueda de cadenas. Otro

parametro del que depende en gran medida el tiempo de codificacion es el tamano de bloque.

Cuanto mayor es este, mayor precision se requiere y el calculo es mas costoso. En la figura

2.43 se observa como varıa el tiempo en fucion de dicho tamano de bloque para imagenes

Page 76: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

72 Capıtulo 2. Codificacion de Imagenes Perceptuales

Figura 2.39: Tasas de compresion de Lena retiniana 256x256 separada en posicion y amplitudde las cabezas, movimientos y amplitudes restantes.

Page 77: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 73

Figura 2.40: Tasas de compresion de Pimientos retiniano 256x256.

Figura 2.41: Tasas de compresion de MIT retiniano 256x256.

Page 78: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

74 Capıtulo 2. Codificacion de Imagenes Perceptuales

a b c

Figura 2.42: Tasas totales de compresion para distintos tamanos de bloque. a. Lena. b.Pimientos. c. MIT.

naturales. El tiempo de codificacion Huffman es simplemente el tiempo de busqueda de las

cadenas ya que es despreciable frente al aritmetico. En esta misma figura tambien se realiza

una comparacion con el tamano de la imagen donde tambien se observa un comportamiento

lineal. El tiempo de decodificacion viene a ser del doble del de codificacion.

a b

Figura 2.43: Tiempo de calculo de la codificacion de cadenas en funcion del tamano debloque. Los valores son una media de los valores obtenidos para las imagenes de 256x256 deLena, Pimientos y MIT.

Para tener una mejor idea de la eficiencia que se consigue con la codificacion de cadenas

se compara con algunos de los algoritmos de compresion sin perdidas que mejores tasas

obtienen,[20]. Ver tabla 2.10.

El algoritmo CALIC2 (Context Based, Adaptive,Lossles Image Codec) esta basado en

la prediccion adaptativa de contextos, aprendiendo de los errores cometidos tanto en la

2ftp.csd.uwo.ca/pub/from wu/v.arith

Page 79: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 75

Tasa (bpp) JPEG-LS CALIC SPIHT Cod.Cadenas

Lena 1.1810 1.1510 2.4500 1.0565Pimientos 1.2940 1.3263 2.6800 1.2257

MIT 1.6640 1.7524 3.4000 1.5216

Tabla 2.10: Comparacion de tasas de compresion sin perdidas. Las imagenes utilizadas sonimagenes retinianas sin texturas de dimensiones 512x512 y 8 bpp. La codificacion aritmeticaesta obtenida con bloques de 32 sımbolos y rango de 8 bits.

direccion horizontal como vertical. SPIHT3 (Set Partitioning in Hierarchical Trees) utiliza

la transformada wavelet y la codifica aritmeticamente con arboles jerarquicos, donde la

prediccion se realiza a partir de los niveles mas bajos. El nucleo del JPEG-LS4 es el algoritmo

LOCO-I que utiliza un modelo predictivo combinado con codigos Huffman, en particular

con Golomb-Rice,[37]. La prediccion se realiza con un sencillo detector de bordes y en la

codificacion ademas se utiliza RLC.

Por ultimo, pese a que las tasas de compresion sin perdidas de la informacion de su-

perficies, imagen de bordes, es mejor que las que proporcionan los mejores algoritmos de

compresion sin perdidas, la reconstruccion final de la imagen no es tan buena por diferentes

motivos. Por un lado cada imagen retiniana tiene menos entroıa que la imagen original, por

lo que es mas susceptible de ser comprimida, pero el proceso de reconstruccion necesita dos

mapas de contraste, ON y OFF, con lo que se duplica la informacion. En general la suma

de la entropıa de las dos imagenes retinianas es similar a la de la imagen original. Ademas

se necesita de un metodo alternativo para la codificacion de texturas. Por otro lado el pro-

ceso de reconstruccion utilizado mediante filling in, el unico por ahora que procesa en dos

dimensiones, no esta todavıa maduro. Es capaz de simular muchas caracterısticas del SVH

aprovechables para la compresion de imagenes pero sigue introducciendo muchos artefactos

visibles. Por tanto el modelo no puede competir hasta el momento con los algoritmos de

compresion actuales. Un ejemplo de reconstruccion5 se muestra en la figuras 2.44,2.45 y 2.46

que contienen tanto la informacion de superficies como de texturas. La impresion de las

imagenes no tiene el suficiente tamano como para distinguir los diferentes artefactos. En la

figura 2.47 se muestra una ampliacion de los Pimientos y se observa como en la imagen re-

tiniana, siguiendo el comportamiento del SVH, resalta mas los contrastes o contornos. Esto

se puede apreciar en rabo de uno de estos y en los reflejos. Otra caracterıstica diferenci-

adora es que las imagenes retinianas son mas brillantes. Esto es debido principalmente a

la utilizacion de funciones sigmoideas para tratar la luminancia. Sin embargo, las imagenes

3www.cipr.rpi.edu/research/SPIHT/spiht3.html4www.hpl.hp.com/loco5la texturas han sido codificadas con JPEG2000.

Page 80: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

76 Capıtulo 2. Codificacion de Imagenes Perceptuales

comprimidas con JPEG para la tasa utilizada apenas introducen artefactos. Las evaluaciones

de la distorsion como el PSNR no se han tenido en cuenta puesto que la medida debe ser

hecha perceptualmente.

a b c

Figura 2.44: Reconstruccion de Lena a 1.9 bpp. a. Original.b. Retiniana. c. JPEG.

a b c

Figura 2.45: Reconstruccion de los Pimientos a 2.55 bpp. a. Original.b. Retiniana. c.JPEG.

Aun ası, estos modelos perceptuales abren nuevas puertas como por ejemplo herramientas

de watermarking, introducciendo informacion en las zonas no visibles de la imagen, para elim-

inacion de ruido, con el que tienen un buen comportamiento, para realce de imagenes,...etc.

Tambien la codificacion de cadenas puede ser utilizada en tratamiento de imagenes como el

realce de bordes, busqueda y codificacion de estructuras de objetos o incluso codificacion de

imegenes semejantes a las retinianas como lo pueden ser las imagenes de huellas dactilares.

2.4.4 Observaciones

El algoritmo de codificacion de cadenas esta pensado para la compresion sin perdidas de

imagenes retinianas. Es con este tipo de imagenes con las que proporciona tasas de compre-

Page 81: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 77

a b c

Figura 2.46: Reconstruccion de MIT a 3.07 bpp. a. Original.b. Retiniana. c. JPEG.

a b c

Figura 2.47: Ampliacion de las imagenes de los Pimientos. a. Original.b. Retiniana. c.JPEG.

sion altas, incluso mejor que los algoritmos de compresion sin perdidas mas eficientes (tabla

2.10). En el caso de que las imagenes tengan otras caracterısticas, con muchas texturas o

pıxeles aislados, las tasas no pueden competir con las de dichos algoritmos.

Por otro lado el tiempo obtenido en la codificacion de cadenas dificulta su utilizacion

practica, aunque esto nunca fue objetivo del proyecto. Respecto a otros algoritmos sin

perdidas el tiempo empleado es claramente superior. En futuras implementaciones se de-

berıa incidir en la optimizacion de los algoritmos de calculo, tanto de busqueda de cadenas

y codificacion aritmetica, y su desarrollo en C. Estos dos aspectos mejorarıan mucho la

velocidad.

Otro problema que se puede encontrar es la imposibilidad de calcular una distribucion

de probabilidades en el caso de que los pıxeles con valor distintos de 0 sean pocos o bien que

la imagen este formada por grandes regiones homogeneas con lo que las cadenas son muy

largas pero muy pocas. Una posible solucion a esto es elegir Huffman en estos casos.

Page 82: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

78 Capıtulo 2. Codificacion de Imagenes Perceptuales

Otra prosible optimizacion viene de eliminar la correlacion existente entre las imagenes

ON y OFF ya que son muy similares. Esto implicarıa una mejora considerable de la tasa de

compresion final. Tambien se podrıa estudiar como se comporta el modelo para altas tasas

de compresion con muchas perdidas.

Page 83: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

2.4. Codificacion de Imagenes Retinianas 79

Page 84: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

80 Capıtulo 2. Codificacion de Imagenes Perceptuales

Page 85: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 3

Estandar JPEG2000

La mente intuitiva es un regalo sagrado y la menteracional es un fiel sirviente. Nosotros hemos creadouna sociedad que honra al sirviente y se ha olvidado delregalo.

Albert Einstein.

En 1996 el comite JPEG (Joint Photographic Experts Group) comenzo a investigar un

nuevo estandar de codificacion de imagenes con los ultimos avances. A este proyecto se

le llamo JPEG2000, el cual fue dividido en seis partes, posteriormente ampliado a once.

La primera constituye el bloque principal del estandar. El resto lo forman extensiones, apli-

cacion al movimiento, testeo, implementacion de software y formacion del formato de archivo,

seguridad... etc. Las fechas previstas para las seis primeras partes estaban comprendidas

entre el 2000 y 2002, de ahı el nombre adoptado. Esta parte del proyecto se basa en dicha

primera parte para la implemetacion de una apliacion software. Para ello, antes conviene

conocer cuales son las caracterısticas del estandar JPEG2000 en una sencilla pero completa

descripcion.

3.1 Introduccion e Historia

El comite JPEG se formo en 1986 bajo los auspicios de la ISO y la ITU-T1. El primer estandar

que publico fue el ya clasico JPEG que tuvo una gran aceptacion por su sencillez, rapidez y

eficacia, lo cual contribuyo a su amplia difusion, aunque probablemente Internet y su libre

distribucion hayan tenido tambien mucho que ver. Sus principales caracterısticas eran: (i)

1Formalmente conocida como Consultative Committee for International Telephone and Telegraph(CCITT).

81

Page 86: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

82 Capıtulo 3. Estandar JPEG2000

el uso de la Transformada Discreta del Coseno (DCT), basada en codificacion con perdidas

y codigos Huffman con la restriccion de 8 bpp de entrada; (ii) una extension para controlar

diferentes realces de la imagen; y (iii) un modo sin perdidas con codificacion predictiva y

codigos Huffman o aritmeticos.

Pero pronto las cualidades del estandar JPEG serıan insuficientes en cuanto a calidad

de compresion, como los tıpicos artefactos de la DCT, como la flexibilidad, en cuanto a

formacion de la trama final. Con estas premisas no queda mas remedio que abandonar

la DCT por mejores tranformaciones que permitan aplicar mejor los metodos perceptuales

conocidos, como el enmascaramiento de coeficientes, la sensibilidad al contraste (CSF) o la

seleccion de zonas de mejor calidad; y transformadas que permitan mayor flexibilidad en

la organizacion de la trama para poder elegir mejor la tasa final de compresion, introducir

codigos de correcion de errores o simplemente por elegir en que orden se codificara la imagen.

Esto sera fundamental para abarcar un gran numero de aplicaciones. Aplicaciones como

compresion de imagenes medicas, librerıas digitales, multimedia, Internet o telefonos moviles.

Los objetivos tecnicos eran por tanto mejorar la calidad de las imagenes tratadas y aumentar

las posibles aplicaciones. Ası, las caracterısticas se pueden resumir en:

• Eficiencia de compresion.

• Compresion con y sin perdidas.

• Respresentacion con resolucion multiple.

• Decodificacion SNR progresiva y en resolucion.

• Fragmentacion de la imagen.

• Regiones de Interes.

• Proteccion frente a Errores.

• Acceso y procesamiento aleatorio de la trama.

• Tratamiento post-compresion.

• Posibilidad de iteracciones en la codificacion.

• Un formato mas flexible.

Detras de todo esto esta, como con el anterior JPEG, el crear un estandar libre de

distribucion que no suponga un coto privado como ocurre con otros algoritmos, aunque

Page 87: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 83

evidentemente las empresas colaboradoras siempre tendran beneficios directos y/o indirectos

derivados de esta actividad.

En 1997 se propusieron 20 algoritmos y fue la descomposicion Wavelet la que se adopto

como base del nuevo estandar. Actualmente la transformada Wavelet esta extendida a innu-

merables e incluso insospechados campos. El exito de esta derivo entonces del estado del arte

que se tenıa por entonces y de las posibilidades que permitıa. Mas adelante se profundizara

mas sobre este tipo de transformadas. Las sucesivas versiones han ido apareciendo bajo el

nombre de Verification Model (VM). Para este proyecto las pruebas se han hecho con la

version VM 8.5, que esta practicamente terminada.

3.2 Caracterısticas Principales

El diagrama de bloques tıpico del JPEG2000 esta constituido por una etapa de pre-tratamiento

de la imagen, una transformada discreta wavelet, una etapa de cuantizacion, una codificacion

aritmetica (tambien llamada tier-1) y despues la organizacion de trama (tier-2). Posterior-

mente se ira desgranando con mas detalle cada una de las partes. Ver figura 3.1.

ImagenOriginal

ImagenComprimida Pre-

Tratamiento

TransformadaDiscretaWavelet(DWT)

CuantizacionCodificacion Aritmetica Adaptativa

Organizacion de Trama

Figura 3.1: Diagrama de Bloques JPEG2000.

3.2.1 Pre-Tratamiento

Esta etapa constituye la primera toma de contacto entre la imagen y el algoritmo. Este ultimo

examina las caracterısticas de aquella, adaptandose y moldeandola. Las caracterısticas seran

el valor de offset, el rango de la imagen y el numero de componentes. El valor de offset es

un escalado de la forma:

Ie = Io −ODC (3.1)

Donde Ie y Io es la imagen escalada y original respectivamente y ODC viene representado

por:

ODC = 2BI−1 (3.2)

Page 88: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

84 Capıtulo 3. Estandar JPEG2000

Donde BI es el numero de bits de la imagen original. Por tanto la informacion que se

manejara sera una logica de 32 bits de precision con signo. Aunque tambien se pueden

manejar precisiones de 16 bits. Para hacer la transformacion inversa basta con sumar este

valor de offset. El rango dinamico quedara de la forma (−2BI−1, 2BI−1 − 1).

Finalmente si la imagen tiene varias componentes, de color se entiende, se pueden utilizar

dos tipos de transformaciones a partir de las componentes originales Rojo-Verde-Azul RGB :

Una transformacion con perdidas llamada Transformacion Irreversible de Color (ITC), que

como su propio nombre indica, no se puede realizar la transformacion inversa sin asumir

unas perdidas. La transformacion se realiza mediante la multiplicacion matricial:

YCbCr

=

0.299 0.587 0.114−0.16875 −0.33126 0.5000.500 −0.41869 −0.08131

RGB

(3.3)

La tranformacion ITC inversa es:

RGB

=

1.0 0 1.4021.0 −0.34413 0.714141.0 1.772 0

YCbCr

(3.4)

La otra transformacion es la llamada Transformacion Reversible de Color (RTC), que

puede ser usada para casos con o sin pedidas. Esta se define como:

Y = bR+2G+B4

c, U = R−G, V = B −G, (3.5)

Donde bwc es el entero mas alto que es igual o mas pequeno que w. La tranformacion

RTC inversa es:

G = Y − bU+V4c, R = U +G, B = V +G, (3.6)

La base de las dos tranformaciones es obtener un canal de luminancia y dos de diferencia

de color, diferencia de rojo y diferencia de azul, con lo que se trata la imagen con tres canales

por separado con diferentes caracterısticas de codificacion. Evidentemente tanto el valor de

offset como el tipo de transformacion elegida deben ser conocidos por el decodificador. Otra

operacion en la codificacion de color es una reindexacion de la paleta de colores donde los

saltos dentro de la paleta son relativos y los colores mas frecuentes se ponen en zonas mas

cercanas. Para mas informacion consultar [40]. A partir de aquı la descripcion se centrara

en la componente de luminancia ya que el tratamiento para las otras dos es similar.

Page 89: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 85

3.2.2 Transformada Wavelet (WT)

La Transformada Wavelet constituye una de las caracterısticas claves de innumerables al-

goritmos de compresion y en conreto del estandar JPEG2000. La Transformacion Wavelet

(WT) supone un nuevo enfoque en el tratamiento de la senal, y en concreto del tratamien-

to de imagenes. El objetivo de toda transformacion, en cuanto a compresion se refiere, es

representar la informacion en otro espacio de una manera mas eficiente. La base de dicho

espacio sera la clave de su eficacia.

Las ampliamente extendidas Transformada de Fourier (FT) y Transformada del Coseno

(DCT) tienen un caracter global, ocupan todo el espacio, es decir, proporcionan un analisis

frecuencial de toda la senal. Por contra en las WT el analisis es local, lo que permite

conocer la respuesta frecuencial en intervalos de tiempo determinados, o regiones del espacio

como en el caso de imagenes. Cada una de las transformaciones tiene sus ventajas y sus

inconvenientes, sin embargo las WT tienen una serie de caracterısticas que las hace muy

potentes. Se puede decir que su aplicacion se ha extendido, sobre todo, a raız de los trabajos

de Ingrid Daubechies y Stephan Mallat. Las wavelets proporcionan una buena herrramienta

para el tratamiento y analisis de senales transitorias (no estacionarias) que son la mayorıa

de las senales biologicas. Ası, sus aplicaciones abarcan desde analisis de senal, tratamiento

de imagenes, diagnosticos medicos, analisis estadıstico a incluso senales geofısicas.

En otras transformaciones locales, como pueden ser la Transformada de Fourier de Tiem-

po Corto (STFT) o la Distribucion de Wigner, hay que llegar a un compromiso entre la

resolucion espacial y la temporal. Ası, se puede hablar de un principio de incertidumbre

(Heisenberg) tambien en el procesado de la senal, donde a medida que se gana precision en

el tiempo se pierde en frecuencia, y viceversa. De otra manera, cuanto mayor sea la ventana

de observacion menor sera la precision en el tiempo, pero el analisis frecuencial sera mejor.

Esto se puede expresar de la siguiente manera:

Definiendo las varianzas en tiempo y frecuencia de una senal de una dimension x(t) cuya

norma en L2 es ||x|| = 1 como:

σt =(

∫∞−∞(t−mt)

2|x(t)|2dt)1/2

σw =(

∫∞−∞(w −mw)

2|x(w)|2dw)1/2 (3.7)

Donde mt y mw son las medias:

{

mt =∫∞−∞ t|x(t)|2dt

mw =∫∞−∞w|x(w)|2dw

(3.8)

Se tiene segun el principio de incertidumbre que:

Page 90: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

86 Capıtulo 3. Estandar JPEG2000

σtσw ≥1

2(3.9)

El mejor caso se da cuando la desigualdad se convierte en igualdad, cosa que se verifica

cuando x(t) es una funcion gaussiana:

x(t) = 12πα

e−t2

4α , X(w) = e−αw2 (3.10)

Con lo que queda σt =√α y σw = 1/2

√α. Gabor utilizo esta ventana para la definicion

de su Transformada Gabor.

La ventaja respecto a otras transformadas locales es que la WT permite un analisis

multiresolucion a diferentes escalas de senales no estacionarias. Consiste en un conjunto de

funciones base en forma de onda de duracion finita, ondıculas. Estas funciones, y esta es

una caracterıstica tıpica de las wavelets, se forman a partir de una semilla o funcion ’madre’,

como se la suele denominar. La Transformada Wavelet Contınua (CWT) se escribe para

una dimension como sigue:

XCWT (a, b) =

∫ ∞

−∞x(t)

1√aψ

(

t− b

a

)

dt (3.11)

Y la inversa:

x(t) = 1Cψ

∫∞−∞∫∞−∞XCWT (a, b)ψ(a, b)

dadba2, Donde Cψ = 2π

∫∞−∞

|ψ|2|v| dv (3.12)

Donde a es el parametro de dilatacion o escalado y b el parametro de traslacion. Con

la normalizacion 1/√a se consigue que la energıa de la funcion wavelet no dependa de la

traslacion (b) ni del factor de escala (a). La ventana de analisis es ψ(t), que debe cumplir

que su integral desde −∞ a ∞ sea nula, es decir, la funcion wavelet oscila como una onda

corta. Su extension a las dos dimensiones es inmediata.

Propiedades de la WT

Aquı se resumen las propiedades mas importantes de la Transformada Wavelet.

• Linealidad: Dadas dos funciones, x(t) e y(t), y dos constantes, α y β, se tiene que:

z(t) = αx(t) + βy(t)⇒ ZCWT (a, b) = αXCWT (a, b) + βYCWT (a, b).

• Desplazamiento: la CWT es covariante bajo traslacion, esto es:

y(t) = x(t− τ)⇒ YCWT (a, b) = XCWT (a, b− τ)

Page 91: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 87

Es decir, el deplazamiento temporal produce el mismo desplazamiento en la CWT en

el eje del tiempo.

• Escalado: la CWT es covariante bajo escalado o dilatacion, esto es:

y(t) = x(st)⇒ YCWT (a, b) =1√sXCWT (sa, sb)

• Consevacion de la energıa: la energıa se conserva en la transformacion mediante la

relacion:∫∞−∞ |x(t)|2dt = 1

∫∞−∞∫∞−∞ |XCWT (a, b)|2 dadba2

, Donde Cψ =∫∞−∞

ψψvdv <∞

• Localizacion en el tiempo y en frecuencia: la WT es capaz de realizar analisis

en el tiempo para cambios abruptos y analisis frecuenciales como un banco de filtros.

Entre las wavelets ortogonales se encuentran las wavelet de Haar, Meyer, Battle-Lemarie

o Daubechies, entre o otras. En cuanto a las wavelets biortogonales estan las obtenidas

mediante la colaboracion de Cohen, Daubechies y Jean-Christophe Feauvean. Entre las

wavelets spline biortogonales se encuentran las de Charles Chui y Jiauzha que covergen a

funciones Gabor.[7, 22, 4]

Transformada Wavelet Discreta (DWT)

La DWT es la transformada que ha sustituido a la DCT en el nuevo estandar JPEG. Las

caracterısticas que han influido en esta decision, como se comenta en los anteriores parrafos,

son la representacion multirresolucion, la localizacion y la capacidad de realizar una codifi-

cacion sin perdidas con filtros enteros. Por simplicidad a continuacion se tratara la DWT de

una dimension, ya que la extension a las dos dimensiones es inmediata.

La DWT se puede entender como una aplicacion sucesiva de un par de filtros, uno paso

bajo h0(n) y otro paso alto h1(n), seguidos de submuestreo de factor 2. Este par de filtros

es conocido como banco de filtros de analisis. Para aplicar estos filtros se hace una extension

especular de la senal segun se explica en la seccion 3.5.5 Los filtros que se utilizan, elegidos

basicamente por sus buenas propiedades, son el filtro de coeficientes enteros (5,3) para las

transformadas reversibles, codificacion sin perdidas, y el filtro de Daubechies (9,7) para las

transformadas irreversibles, codificacion con perdidas. La numeracion indica el numero de

coeficientes de los filtros h0 y h1 respectivamente. Ademas, como se comenta en la seccion

3.5.1, tambien se utilizan otros filtros. Los mas relevantes se incluyen en las tablas siguientes.

La reconstruccion se hace mediante la insercion de ceros y otro par de filtros g0 y g1, banco

de filtro de sıntesis. El resultado se suma consiguiendo la reconstruccion perfecta si los filtros

cumplen las siguientes propiedades en el espacio transformado Z:

Page 92: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

88 Capıtulo 3. Estandar JPEG2000

{

H0(z)G0(z) +H1(z)G1(z) = 2H0(−z)G0(z) +H1(−z)G1(z) = 0

(3.13)

La ecuacion 3.13 se puede cumplir eligiendo:

G0(z) = −cz−lH1(−z), G1(z) = cz−lH0(−z) (3.14)

Donde l es un numero entero y c el factor de escala. Entonces:

−cz−1H0(z)H1(−z) + cz−1H1(z)H0(−z) = 2 (3.15)

La constante l tiene que ver con el retardo y c afecta a la normalizacion. Los filtros que

cumplen estas propiedades se llaman biortogonales por ser ortogonales dos a dos, h0 y g1

a h1 y g0. El filtro (5,3) es un ejemplo de filtro biortogonal (tabla 3.2), sin embargo el de

Daubechies (9,7) es mas eficiente para compresion (tabla 3.1).

Su extension a dos dimensiones es inmediata teniendo en cuenta que se puede aplicar

de manera sucesiva a cada una de ellas, es decir, la WT es de variables separables. La

descomposicion tıpica de una imagen es descomponer cada nivel en cuatro partes: la banda

LL con filtrado paso bajo en las dos dimensiones, la banda HL con filtrado paso alto para la

direccion horizontal y paso bajo para la vertical, la banda LH con filtrado paso alto para la

direccion vertical y paso bajo para la horizontal y la banda HH con filtrado paso alto para las

dos dimensiones. Evidentemente existen innumerables descomposiciones que se detallaran

mas adelante en el capıtulo 4.

n h0 n h10 +0.602949018236360 -1 +1.115087052457000±1 +0.266864118442875 -2,0 -0.591271763114250±2 -0.078223266528990 -3,1 -0.057543526228500±3 -0.016864118442875 -4,2 +0.091271763114250±4 +0.026748757410810

n g0 n g10 +1.115087052457000 1 +0.602949018236360±1 +0.591271763114250 0,2 -0.266864118442875±2 -0.057543526228500 -1,3 -0.078223266528990±3 -0.091271763114250 -2,4 +0.016864118442875±4 -3,5 +0.026748757410810

Tabla 3.1: Filtros de analisis y sıntesis Daubechies (9,7).

En la figura 3.2 se presentan ejemplos de wavelets.

Page 93: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 89

n h0 n h10 3/4 -1 +1±1 1/4 -2,0 -1/2±2 -1/8

n g0 n g10 +1 1 +3/4±1 +1/2 0,2 -1/4±2 -1,3 -1/8

Tabla 3.2: Filtros de analisis y sıntesis entero (5,3).

n h0 n h10 0.5575435262285 -1 0.869813136679233±1 0.03372823688575 -2,0 -0.188640851913885±2 -0,09127176311425 -3,1 -0.095087384971863

-4,2 -0.009884638967935-5,3 0.02674875741081

Tabla 3.3: Filtros de analisis Daubechies (6,10).

n h0 n h10 164/256 -1 1±1 80/256 -2,0 -9/16±2 -31/256 -3,1 0±3 -16/256 -4,2 1/16±4 14/256 -5,3±5 0 -6,4±6 -1/256 -7,5

Tabla 3.4: Filtros de analisis CRF(13,7).

n h0 n h10 348/512 -1 1±1 144/512 -2,0 -9/16±2 -63/512 -3,1 0±3 -16/512 -4,2 1/16±4 18/512 -5,3±5 0 -6,4±6 -1/512 -7,5

Tabla 3.5: Filtros de analisis SWE(13,7).

Page 94: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

90 Capıtulo 3. Estandar JPEG2000

n h0 n h10 1/2 -1 1±1 -2,0 -1/128±2 -3,1 -1/128

Tabla 3.6: Filtros de analisis (2,6).

n h0 n h10 1/2 -1 1±1 -2,0 -22/128±2 -3,1 -22/128±3 -4,2 3/128±4 -5,3 3/128

Tabla 3.7: Filtros de analisis (2,10).

n h0 n h10 0.536628801791641 -1 0.440781829293449±1 0.054299075394283 -2,0 -0.115519002860397±2 -0.111388018824611 -3,1 -0.060571607153814±3 0.000058297264620 -4,2 0.009733420188029±4 0.020401844374067 -5,3 0.021802742673181±5 -6,4 0.001787592313644±6 -7,5 -0.006683900685050±7 -8,6 0.000001928418995±8 -9,7 0.000674873932507

Tabla 3.8: Filtros de analisis Daubechies (10,18).

Page 95: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 91

Figura 3.2: Ejemplos de filtros ortonormales. (a) Meyer. (b) y (c) Battle-Lemarie. (d) Haar.(e) y (f) Daubechies.[7].

Page 96: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

92 Capıtulo 3. Estandar JPEG2000

Normalizacion de los Filtros

La normalizacion de los filtros generalmente puede ser arbitrariamente grande o pequena

como luego corrija la transformada inversa. En este caso la relacion vendra dada por la

constante c de la ecuacion 3.14, es decir, el valor de normalizacion de los filtros de analisis,

h0 y h1, estara relacionado directamente con el valor de normalizacion de los filtros de sıntesis,

g0 y g1. La normalizacion se suele expresar en terminos de ganancia de continua para h0 y

ganancia Nyquist para h1. Estas vienen definidas como:

GDC = |∑n h(n)|, GNyquist = |∑

n (−1)nh(n)| (3.16)

La normalizacion adoptada por el estandar para los filtros (9,7) y (5,3) es de GDC = 1

y GNyquist = 2, tambien llamada (1,2). Otras normalizaciones aparecidas en la literatura

son (√2,√2) y (1, 1). La normalizacion inversa se obtiene inmediatamente invirtiendo el

orden y multiplicando por la constante c. En el estandar JPEG la transformada ortonormal

del coseno (DCT) tenıa la propiedad de que la suma de cuadrados de los coeficientes de la

imagen coincidıa con la suma de cuadrados de los coeficientes transformados (Teorema de

Parseval). Esta propiedad daba una relacion directa entre el Error Cuadratico Medio (MSE)

de la transformacion y la reconstruccion, es decir, es el mismo. Desafortunadamente esta

propiedad no se mantiene para la Transformada Wavelet debido a que en general no es una

transformada del todo ortogonal. Sin embargo, bajo ciertas suposiciones de ruido se puede

hacer una aproximacion del MSE en funcion de la energıa de los filtros para cada banda de

la familia de filtros wavelet, Woods y Naveen [39].

La normalizacion afecta sobre el rango dinamico de la imagen transformada. Esto se

traduce en un cambio de la profundidad de bit de cada banda. Debido a la normalizacion (1,2)

elegida, si la imagen original tiene un rango de RI , para cualquier nivel de descomposicion,

la banda LL tendra RI bits, la HL y LH RI + 1 y la HH RI + 2. Por tanto la normalizacion

sera cuatro veces menor para la banda HH que para la LL y dos veces menor que para HL

y LH. Para evitar desbordamientos se tiene en cuenta, ademas de la profundidad de bit, los

bits de guarda G0, parametro que podra ser elegido a la hora de codificar la imagen. En

principio, por lo que se ha visto, con un valor de G0 = 2 serıa suficiente, con lo que el rango

final queda (−2RI−G0−1, 2RI−G0−1 − 1).

Convolucion y lifting

Una de las cuestiones a las que se le ha dado una especial importancia es la de implementar

un codificacdor y decodificador que sea flexible, a la vez que rapido y sencillo. En el antiguo

JPEG el tamano del buffer venıa fijado por el tamano de las celdas de 8x8 pixels en las que

Page 97: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 93

se realizaba la DCT. Esto tambien fijaba la rapidez con la que se podıa operar.

En el estandar JPEG2000 el tiling o fragmentacion de la imagen esta pensado para reducir

las necesidades de memoria y ganar en velocidad al operar en paralelo varias transformadas

simultaneamente, por contra se pierde eficiencia en la compresion. Ver seccion 3.5.5

Otra de las optimizaciones en la misma lınea es la operacion de lifting para calcular la

DWT aprovechando sus propiedades para ahorrar en memoria y complejidad de calculo. La

operacion de lifting fue propuesta como alternativa a la convolucion tıpica por Daubechies

y Sweldens [8, 35]. La potencia de este calculo radica en su forma recursiva, donde los

coeficientes se van sobreescribiendo y dando el mismo resultado final que con una convolu-

cion. Viene a ser como con la Transformada Rapida de Fourier (FFT). Primero se calcula

una transformada wavelet trivial, tambien llamada sencilla (lazy), que posteriormente se va

modificando con sucesivas aproximaciones hasta obtener el valor final de la DWT. Un ejem-

plo del esquema para el filtro (5,3) se puede ver en la figura 3.3. Las secuencias s0i y d0i son

las secuencias par e impar respectivamente de la transformada wavelet sencilla.

Figura 3.3: Esquema de prediccion/actualizacion lifting para filtro (5,3).

Las predicciones en el caso impar se obtienen del propio valor de la muestra impar y las

muestras pares actual y posterior. En el caso par la actualizacion se hace con la muestra par

y las prediciones del caso impar para las muestras actual y posterior. Esto queda reflajado

en la ecuacion de mas abajo, de tal manera que la secuencia par es la salida del filtro paso

bajo y la secuencia impar la salida del filtro paso alto.

{

d1i = d0i − 12(s0i + s0i+1)

s1i = s0i +14(d1i−1 + d1i )

(3.17)

Este proceso se repite con N iteracciones y con diferentes pesos para cada iteraccion. Se

puede resumir como sigue en la siguiente ecuacion:

Page 98: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

94 Capıtulo 3. Estandar JPEG2000

{

dni = dn−1i +∑

k Pn(k)sn−1k , n ∈ [1, 2, ..., N ]

sni = sn−1i +∑

k Un(k)dnk , n ∈ [1, 2, ..., N ]

(3.18)

Donde Pn(k) y Un(k) son los pesos de las predicciones y las actualizaciones respectiva-

mente para la nesima iteraccion. Para el caso del filtro (5,3) basta con N = 1, mientras que

para el (9,7) es necesario N = 2. Las salidas de los filtros seran las secuencias par e impar

multiplicadas por las constantesK0 yK1 respectivamente para normalizar. Para el filtro (5,3)

K0 = K1 = 1 y para (9,7) viene indicado en la figura 3.4, donde la relacion es K0 = 1/K1.

Tambien se pueden apreciar los dos niveles de recursividad. Un esquema general vendrıa

dado por la figura 3.5, donde se puede entender mejor el papel de los pesos de prediccion y

de actualizacion.

Figura 3.4: Esquema de prediccion/actualizacion lifting para filtro (9,7).

Ademas el calculo de la transformada inversa tambien se puede realizar mediante este

proceso, basta con utilizar los coeficientes transformados como entrada y deshacer el escalado

por 1/K0 y 1/K1.

Tranformacion sin Perdidas

Uno de los problemas que surgen con los filtros reversibles o enteros deriva de la precision de

los coeficientes de la transformacion. Aunque estos sean enteros en la imagen original, dejan

de serlo en el espacio transformado y la precision requerida aumenta de manera incontrolada

Page 99: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 95

Figura 3.5: Esquema lifting generico.

a medida que el nivel de descomposicion es mayor. Esto imposibilita la apliacion de dichos

filtros a menos que se asuman perdidas. La ventaja que tiene la implementacion lifting es

la posibilidad de realizar transformaciones sin perdidas, entero a entero, de la DWT, [3].

Ası se tendra una reconstruccion perfecta de la imagen transformada aunque por contra la

compresion que se consiga sera menor. La eleccion de filtros con o sin perdidas vendra dada

por el tipo de aplicacion requerida.

La tranformacion wavelet sin perdidas se puede conseguir de manera sencilla insertando

cuantificadores despues de cada prediccion y actualizacion de la figura 3.5. El cuantificador,

que puede ser diferente para la prediccion y para la actualizacion, trunca o redondea al

entero mas cercano. Si los coeficientes K0 y K1 son aproximadamente numeros racionales el

proceso se puede invertir aunque haya habido un proceso de cuantizacion.

3.2.3 Cuantizacion

El antiguo estandar JPEG utilizaba un cuantificador uniforme con una reconstruccion en

la mitad del intervalo. El ancho de cuantificacion era variable en funcion de la sensibilidad

para adaptar la percepcion al SVH y despues se aplica una mapa de pesos de dimensiones

8x8 y 1 byte por cada uno.

Una importante diferencia es la presencia de una zona muerta en el cuantificador. La

razon de incluir esta zona see debe a que el cuantificador optimo para una senal contınua con

distribucion Laplaciana, como es el caso de la DCT y DWT, es precisamente el que incluye

dicha zona muerta, [34]. El tamano de la zona disminuye a medida que la varianza de la dis-

tribucion Laplaciana aumenta. Este tamano suele ser menos que 2 anchos de cuantificacion,

∆b, y tıpicamente alrededor de 1.

La ventaja de un cuantificador con zona muerta del doble de ∆b es que el resultado de

la codificacion es el mismo tanto si se trunca el valor de un cuantificador de Mb bits en el

bit Nb como si se cuantifica el mismo valor con un cuantificador con un ancho ∆b = 2Mb−Nb .

Page 100: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

96 Capıtulo 3. Estandar JPEG2000

Esto implica que la recontruccion va a ser correcta si se truncan los valores obtenidos, lo

que permite alcanzar las tasas deseadas sin necesidad de hacer varias iteraciones como era

el caso de JPEG.

Los parametros a elegir en el cuantificador seran el ancho de cuantificacion y la zona

muerta en relacion con el anterior donde la eleccion puede ser en base a consideraciones

perceptuales o simplemente en base a la tasa de compresion final.

La cuantificacion viene dada por:

qb(u, v) = sign(Ib(u, v))b |Ib(u,v)|+nz∗∆b∆bc, nz ∈ (−1, 1) (3.19)

Siendo Ib la banda correspondiente de la imagen transformada y u y v sus coordenadas.

Segun esto la zona muerta valdra 2(1 − nz)∆b, con rango desde 0 a 4. El caso general se

obtiene para nz = 0 con una zona muerta de 2.

El ancho de cuantificacion viene dado por:

∆b = 2Rb−εb(1 +µb211

) (3.20)

∆b

(1-nz)∆b

Figura 3.6: Cuantificador uniforme con zona muerta variable.

Donde Rb son los bits que representan el rango dinamico de la subbanda b, como lo

explicado en la seccion 3.2.2-Normalizacion de los Filtros. Anadiendo los bits de guarda se

tiene que Rb = RI −G0. Ademas εb sera el exponente y µb la mantisa. Ası cuanto mayor sea

el exponente, mas pequeno sera el ancho de cuantificacion. Ver figura 3.6. Si se asume que

el numero de bits necesarios para manejar la informacion vendra dado por el rango dinamico

de la imagen transformada dividido por el ancho de cuantificacion segun la siguiente relacion

se obtiene un valor directo del numero de planos de bit, ver seccion 3.2.4

Page 101: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 97

Mb = | log22RI−1

∆b

| = G0 + εb − 1 (3.21)

Los unicos parametros que debe conocer el decodificador son el exponente y la mantisa.

Para ello hay dos maneras: con el valor (εb, µb) para cada subbanda, o bien con el valor

(ε0, µ0) de la banda LL y el resto se obtiene mediante la relacion:

(εb, µb) = (ε0 −NL + nb, µ0) (3.22)

Donde Nl es el nivel de descomposicion y nb la subbanda, que esta en relacion con la

normalizacion (1,2) de la seccion 3.2.2 para conseguir una aproximacion a la contribucion

MSE de cada banda.

El proceso de reconstruccion es inmediato. Solo queda anadir que la reconstruccion de

las muestras se hace en el medio del intervalo, aunque tambien existen reconstrucciones a

37.5% del intervalo.

Como es logico, la cuantificacion solo tendra sentido cuando se utilicen filtros no re-

versibles (9,7), o lo que es lo mismo, para filtros reversibles (5,3) el ancho de cuantificacion

sera ∆b = 1 con εb = Rb y µb = 0.

3.2.4 Codificacion de Entropıa

Una vez pre-procesada, transformada y cuantificada la imagen se pasa a la etapa de codifi-

cacion propiamente dicha, donde tiene lugar la compresion y se forma la trama de bits. La

codificacion de entropıa ya se utilizaba en anteriores y muy conocidos algoritmos de com-

presion, como EZW [33] o SPIHT [32], que aprovechaban la correlacion entre las distintas

bandas de la transformada wavelet. Si se explota esta propiedad de la transformada, puesto

que no es mas que redundancia, se limita la flexibilidad de ordenacion de la trama y ademas

se disminuye la resistencia al error, puesto que puede haber propagacion de errores. Estas

son dos caracterısticas importantes en el estandar JPEG2000 para aplicaciones de trans-

mision de datos. Evidentemente los algoritmos anteriores son muy potentes si lo unico que

se pretende es almacenar y no transmitir. Por tanto el JPEG2000 tratara cada subbanda

por independiente, que no por separado.

El algoritmo de compresion, otro de los nucleos del estandar junto a la transformada

wavelet, es el EBCOT (Embebbed Block Coding with Optimized Truncation), ver [36]. El

algoritmo EBCOT consiste en fragmentar la distintas subbandas en bloques de tamano arbi-

trario y realizar una codificacion por planos de bit. Como se menciono antes la codificacion

de bloques independientes tiene como ventajas el poder tener un acceso aleatorio a la im-

agen, el poder codificar en paralelo reduciendo el tiempo de calculo, poder cortar y rotar

Page 102: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

98 Capıtulo 3. Estandar JPEG2000

la imagen una vez procesada, control de tasas, variacion del orden e introducir codigos de

resistencia al error. Por contra, aunque se aumenta la flexibilidad y con ello el numero de

posibles aplicaciones, la eficiencia de compresion va a ser menor debido a que no se explota

dicha correlacion entre bandas, pero es asumible.

Notacion y Sımbolos

Tomando u y v como coordenadas del espacio transformado wavelet se define para cada

bloque i de cada subbanda b, con una ancho de cuantificacion ∆i que sera el mismo para

cada bloque de cada banda y qi(u, v) como coeficiente cuantizado. El valor profundidad de

bit mpi (u, v) y el numero de planos de bit mi(u, v) para la magnitud Mb, donde 0 ≤ p ≤Mb.

El signo, Xi(u, v), indica 0 si positivo y 1 si negativo. La significacia, σi(u, v), que se pone

a uno cuando se codifica el primer bit mas significativo (MSB) distinto de cero. Ademas

se guarda una informacion de la anterior codificacion del coeficiente, si(u, v), junto con una

relacion de los vecinos.

Tipos de Operaciones

La secuencia de codificacion va desde el plano de bit p del MSB al LSB de cuatro en cu-

atro coeficientes de izquierda a derecha, como indica la figura 3.7, con cuatro operaciones

basicas. Si la muestra2 no es todavıa significante, σi(u, v) = 0, se utiliza una combinacion de

Codificacion Cero (ZC) y Codificacion de Longitud de Recorrido (RLC) dependiendo de si

mpi (u, v) = 1. Si es ası, se invoca a la Codificacion de Signo (SC), Xi(u, v). Si la muestra ya

era significativa se invoca al Refinamiento de Magnitud (MR). En todos los casos se utiliza

una codificacion Aritmetica donde se tiene en cuenta el valor de los vecinos que constituye

el contexto donde explotar el calculo de probabilidades para esta codificacion Aritmetica.

La potencia de la codificacion Aritmetica radica en como de buena es la distribucion de

probabilidades de los distintos sımbolos a codificar, pudiendo asociar longitudes no enteras

para codificar estos sımbolos. El estandar JPEG2000 realiza estimaciones de las probabili-

dades basandose en contextos referentes a los vecinos. El manejo de estos contextos no es

puramente estadıstico, sino que tambien se tuvo en cuenta su implementacion en hardware,

es decir, hay un numero reducido de contextos para cada tipo decodificacion. En funcion del

contexto, por tanto, se tratara de predecir o estimar el sımbolo con mayor probabilidad. El

resultado es una codificacion Aritmetica, el codificador-MQ, ver [14]. En las siguientes sec-

ciones se explicara con mas detalle el proceso de codificacion que sigue el estandar JPEG2000.

Para ver mas sobre este apartado consultar [21].

2Se utilizara indistintamente los nombres de coeficiente o muestra.

Page 103: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 99

Figura 3.7: Orden de codificacion de los coeficientes.

Codificacion Cero (ZC): Si la significancia σi(u, v) = 0 se codifica mpi (u, v) en funcion

de 10 contextos que dependen de la significancia de los vecinos. Hay tres clases de vecinos:

• Horizontales: 0 ≤ h ≤ 2 segun el numero de significantes.

• Verticales: 0 ≤ v ≤ 2 segun el numero de significantes.

• Diagonales: 0 ≤ d ≤ 4 segun el numero de significantes.

Figura 3.8: Vecinos involucrados en la codificacion ZC.

En total hay 8 vecinos, segun muestra la figura 3.8. El contexto vendra marcado segun el

valor de las variables h, v, d y de la subbanda donde pertenezca el bloque (HH, HL, LH, LL).

Como se dijo antes, la relacion entre variables y estados es un compromiso entre condiciones

estadısticas, propiedades de la transformada wavelet, y caracterısticas hardware.

Page 104: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

100 Capıtulo 3. Estandar JPEG2000

Codificacion de Longitud de Recorrido (RLC): Esta codificacion se usa junto con ZC

para reducir el numero de sımbolos a codificar, sobre todo en las primeras pasadas cuando

las muestras todavıa no son significativas. Este algoritmo es invocado cuando se cumplen

las siguientes condiciones:

• Cuatro muestras consecutivas no sean significativas, σi(u, v) = 0.

• Todas deben tener los vecinos a cero, h = 0, v = 0 y d = 0.

• Las cuatro muestras deben estar alineadas, es decir, los grupos deben empezar en la

posicion 1a, 5a,...4n+ 1 con n ∈ N , o lo que es lo mismo, columna por columna.

La tercera condicion esta forzada por codiciones de eficiencia tanto en software como

en hardware. Si un grupo de cuatro cumple estas condiciones se codifica como una sola

muestra. Si algun coeficiente es significativo, mpi (u, v) = 1, se codifica con el codificador

MQ, que utiliza una codificacion Aritmetica adaptativa.

Codificacion de Signo (SC): La codificacion de signo es utilizada al menos una vez por

cada muestra. Se invoca cuando σi(u, v) = 0 y mpi (u, v) = 1, σi(u, v) se pone a 1 y se codifica

el signo correspondiente, Xi(u, v), en funcion de 5 contextos diferentes obtenidos segun los

vecinos horizontales y verticales. Ahora los valores de h y v ∈ [−1, 0, 1] segun:

{

h = min {1,max {−1, σi(u, v − 1) ∗ (1− 2 ∗ Xi(u, v − 1)) + σi(u, v + 1) ∗ (1− 2 ∗ Xi(u, v + 1))}}v = min {1,max {−1, σi(u− 1, v) ∗ (1− 2 ∗ Xi(u− 1, v)) + σi(u+ 1, v) ∗ (1− 2 ∗ Xi(u+ 1, v))}} (3.23)

Los valores que se obtienen estan reflejados en la tabla 3.9 en relacion con el signo predicho

X .

Refinamiento de Magnitud (MR): Se invoca si σi(u, v) = 1. Se codifica mpi (u, v) con

tres contextos dependiendo de los vecinos horizontales y verticales y si es o no el primer

plano de bit donde se aplica MR, controlado por otra variable, σi(u, v). El valor de h y

v es el mismo que para ZC. Con esto se construye otra tabla como 3.9, pero con solo tres

contextos dependientes de h, v y σi(u, v). La tabla es emajante a 3.9, consultar [21].

Ası las variables crıticas que tendra que almacenar y manejar el codificador, y por

supuesto el decodificador, son: σi(u, v), σi(u, v), Xi(u, v), mpi (u, v) y η(u, v), que se explica

en el siguiente parrafo.

Page 105: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.2. Caracterısticas Principales 101

h v X Contexto

1 1 0 41 0 0 31 -1 0 20 1 0 10 0 0 00 -1 1 1-1 1 1 2-1 0 1 3-1 -1 1 4

Tabla 3.9: Contextos de la operacion SC.

Codificacion de los Planos de Bit

Cada plano de bit se codifica mediante distintas pasadas en funcion de las operaciones antes

descritas. Teniendo en cuenta que p va desde 0 a Mi − 1, se obtienen tres diferentes pases

para cada bloque (P plano,pasoi ) de tal manera que la trama obtenida sera: PMi−1,1

i , PMi−1,2i ,

PMi−2,3i , PMi−2,1

i , PMi−2,2i , ... , P 0,1

i , P 0,2i , P 0,3

i . Puede ocurrir, y es frecuente, que alguno

de los planos o alguna de las pasadas esten vacıos. Aquı viene la funcion de la variable

ηi(u, v). Esta tiene el valor de 0 cuando las tres pasadas han terminado para un bloque de

un determinado plano y 1 en cualquier otro momento de la codificacion. Los tres tipos de

pasadas son:

• Pasada de Propagacion de Significancia (P p,1i ): Durante esta pasada se solo se

tienen en cuenta las muestras que no son significantes, σi(u, v) = 0, y que tienen al

menos algun vecino que es significante. A estas se le aplican la operacion ZC y si son

significantes en este plano se invoca el SC y se les coloca ηi(u, v) = 1.

• Pasada de Refinamiento de Magnitud (P p,2i ): Ahora las muestras que se tienen

en cuenta son las significantes, σ(u, v) = 1, y cuya informacion no ha sido codificada en

este plano, ηi(u, v) = 0, con la operacion MR. No hace falta modificar ηi(u, v) puesto

que la proxima pasada ignora esta variable y la restablece a 0.

• Pasada de Normalizacion (P p,3i ): Aquı las muestras a codificar son el resto de las

no significantes que se ignoraron en la primera pasada. Estas se codifican con una

combinacion de las operaciones ZC y RLC y si es necesario SC. Al final se restablece

la variable ηi(u, v) a 0.

El orden de codificacion de los coeficientes es el mismo que el mostrado en la figura 3.7

a lo largo de todo el bloque.

Page 106: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

102 Capıtulo 3. Estandar JPEG2000

3.3 Organizacion de Trama

El estandar trata de realizar un algoritmo versatil en dos sentidos: en compresion (de-

scomposicion en subbandas, niveles, filtros,...), que se ha visto a lo largo de las secciones

anteriores, y en descompresion, que se vera en esta seccion. Todos los elementos menciona-

dos hasta aquı, como los bloques, planos, niveles, bandas,... y algunos que se introduciran

mas adelante) estan en relacion directa con la forma de organizar la trama final. Aquı se

hablara de un nivel superior, donde la codificacion de varios planos, de los bloques y de los

precintos, se agrupan en paquetes, los cuales daran una idea de la capacidad de flexibilidad

en la organizacion de la trama. Conceptos como estos se explican en las siguientes secciones,

aunque antes conviene introducir el concepto de sistema de coordenadas.

3.3.1 Sistema de Coordenadas

La posicion de cada uno de los coeficientes y las bandas de la imagen transformada se toma

en relacion a un origen de coordenadas. Las coordenadas constan de: dos coordendas para la

distancia entre la esquina superior izquierda de la banda al origen y otras dos para el alto y

ancho con respecto a la esquina superior izquierda. Esto se puede ver mas claro en la imagen

3.9. Este sistema de referencia sera util para operaciones de descodificacion y tratamiento

post-procesado como giros, cortes, inversiones,...

Figura 3.9: Sistema de coordenadas.

De tal manera que las coordenadas en cada banda se obtienen:

(xb0, yb0) =

(

dXOsiz−2nb−12nb

e, dY Osiz2nb

e)

para nbHL(

dXOsiz2nb

e, dY Osiz−2nb−12nb

e)

para nbLH(

dXOsiz−2nb−12nb

e, dY Osiz−2nb−12nb

e)

para nbHH

(3.24)

Donde nb es el nivel de descomposicion de la banda. Para (xb1, yb1) basta con sustituir

XOsiz y Y Osiz por Xsiz y Y siz. La banda nbLL es directamente la reconstruccion del

Page 107: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.3. Organizacion de Trama 103

nivel inferior.

3.3.2 Bloques y Precintos

En cada nivel de resolucion ademas se definen regiones que engloban a los bloques, sobre

los que se realiza la codificacion propiamente dicha. Ası cada borde de precinto corresponde

con un borde de bloque, pero de no al reves. El tamano de los bloques, aun siendo igual

para todos los niveles, corresponden a tamanos de regiones de la imagen distintas, puesto que

tienen diferentes resoluciones. La razon de los precintos es, como se menciono anteriormente,

el manejar la informacion comprimida con un nivel superior al de los bloques evitando la

dependencia del tamano de la region y los bloques con el nivel de resolucion.

Para resumir todo esto, el siguiente ejemplo. La figura 3.10 representa una imagen de 768

columnas y 512 filas donde si (XOsiz, Y Osiz) = (7, 9) entonces (Xsiz, Y siz) = (775, 521).

El primer nivel se extiende desde (2, 3) a (193, 130) mientras que la subbanda 3HL lo hace

desde (1, 2) a (96, 65). En este caso los bloques de 64x64 corresponden a regiones de la imagen

de tamano 128x128, 256x256 y 512x512 en las bandas 1LL, 2LL y 3LL respectivamente. Los

tamanos de los precintos son, de mayor a menor nivel, 32x32, 32x32, 64x64 y 128x128. Notar

que en el nivel 3 los bloques deben ser de 32x32.

Figura 3.10: Ejemplo de descomposicion en bloques y precintos.

3.3.3 Capas, Paquetes y Cabeceras

Los bloques comprimidos son agrupados en una o varias capas. Estas, por tanto, contienen

un determinado numero de pasadas de codificacion de los bloques. El numero de pasadas

Page 108: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

104 Capıtulo 3. Estandar JPEG2000

que contienen varıa de un bloque a otro y viene determinado por la estimacion de la tasa de

compresion que se explicara mas adelante, seccion 3.4 Ası la informacion de una componente,

resolucion, capa y posicion es incluida en un paquete. La posicion de los bloques viene dada

por los numero dentro de los bloques en la figura 3.10.

A cada paquete se le anade un cabecera que incluye informacion sobre el mismo. El

primer bit indica si el paquete esta o no vacıo, puesto que puede haber capas que no tengan

informacion. Despues, si el paquete no esta vacıo, se indica con un bit tambien si hay infor-

macion del bloque en el paquete anterior, si no es ası se marca con el tag-tree correspondiente

del precinto. Un tag-tree es una estructura jerarquica que explota la redundancia espacial,

ver [21]. A continuacion se incluye el numero de pasadas de codificacion de los bloques y la

longitud de la informacion comprimida. Tambien se incluye informacion de donde pertenece

el bloque (nivel, precinto,...). Ademas se incluye informacion sobre el tipo de codificacion

de error que se describe en 3.5.2 La inclusion de cabeceras, ademas de permitir la decodi-

ficacion, permite que los bloques puedan ser ordenados de cualquier modo sin aumentar la

complejidad ni deshacer la compresion aritmetica. Por contra esto puede tener ineficiencias

para posibles aplicaciones de vıdeo, en lo que ya esta trabajando el estandar.

Figura 3.11: Cabeceras de los paquetes en la trama de compresion final.

Se anade en la trama una cabecera con la informacion de control de la imagen. El resto

de marcadores y cabeceras corresponden a codigos de correccion de errores. Para ver mas

sobre esto ir a la seccion 3.5.2. En la figura 3.11 se incluyen tambien las cabeceras para las

distintas fragmentaciones de las imagen que permite JPEG2000 tambien llamado tiling. A

esto se dedica una breve explicacion en la seccion 3.5.5

3.3.4 Ordenacion de la trama (Orden de progresion)

La trama se reordena en funcion de las necesidades de la aplicacion. Aunque el resultado

final es el mismo, este orden sera clave si la imagen va a ser transmitida o si simplemente

va a ser almacenada. Dos ordenaciones tıpicas son resolucion progresiva y SNR progresivo.

La primera aumenta la resolucion o tamano de la imagen a medida que se va decodificando

la informacion, la segunda aumenta la calidad de la imagen cuanta mas informacion se

decodifique. Para que el codificador pueda hacer cualquier ordenacion y el decodificador

sepa cual a sido, basta con incluir cuatro parametros en las cabeceras de los paquetes.

Page 109: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.3. Organizacion de Trama 105

a b

Figura 3.12: Ejemplos de ordenacion de paquetes. a. Organizacion en resolucion progresiva.b. Organizacion en SNR progresivo.

Estos parametros son: componente, resolucion, capa y posicion en el precinto. Elegir una

ordenacion determinada no es mas que variar el orden de los bucles que se encargan de

rastrear la imagen. Esto queda mas claro en los siguientes parrafos donde se muestran los

tipos de ordenaciones posibles.

Progresion Capa-Resolucion-Componente-Posicion (LRCP)

Teniendo c para componente, r para resolucion, l para capa y p para posicion en el ejemplo

de la figura 3.10, esta ordenacion se obtiene mediante los bucles:

for l = 0, 1

for r = 0, 1, 2, 3

for c = 0, 1, 2

for p = 0, 1, 2, 3, 4, 5

paquete(c, r, l, p)

Este modo puede ser util para la busqueda en una base de imagenes donde no es necesario

decodificar toda la imagen para reconocerla. Este modo tiene una funcionalidad parecida a

la que proporciona el anterior JPEG con modo progresion secuencial.

Progresion Resolucion-Capa-Componente-Posicion (RLCP)

Este modo de operacion puede resultar util para aplicaciones cliente-servidor. Es semejante

al modo progresion jerarquica del JPEG.

Page 110: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

106 Capıtulo 3. Estandar JPEG2000

Progresion Resolucion-Posicion-Componente-Capa (RPCL)

Esta progresion se utiliza cuando se necesita escalabilidad en resolucion pero que los paquetes

aparecan juntos en la trama.

Progresion Posicion-Componente-Resolucion-Capa (PCRL)

Puede ser util cuando se quiere conseguir calidad de la imagen en una localizacion espacial

determinada.

Progresion Componente-Posicion-Resolucion-Capa (CPRL)

Es usada cuando se quiere calidad en una zona determinada para una determinada compo-

nente.

Figura 3.13: Ejemplo de Progresion LRCP, 0.125 bpp(izda.) y 0.50 bpp(dcha.)

Figura 3.14: Ejemplo de Progresion RLCP.

3.4 Control de Tasa

En el estandar JPEG2000 muchos de los aspectos de codificacion han sido tomados para

obtener una eficiencia en la consecucion de una tasa deseada sin sacrificar demasiado en la

capacidad de compresion. Una eleccion semejante a esta es la de sacrificar dicha capacidad

de compresion al no explotar la correlacion entre bandas a cambio de conseguir una mayor

Page 111: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.4. Control de Tasa 107

Figura 3.15: Ejemplo de PCRL (4 bloques).

flexibilidad. En este caso es la eleccion de codificacion por planos de bit y un buen algoritmo

de truncado, permitido por el tipo de cuantificador, lo que permitira alcanzar una tasa de

compresion fiel a la esperada.

En el estandar JPEG el metodo era controlar la cuantizacion y las tablas Huffman,

que no era un buen metodo para alcanzar la tasa deseada. El metodo era ir variando las

tablas de cuantizacion, variando el escalado, hasta aproximar la tasa deseada. Sin embargo el

JPEG2000 permite una estimacion a priori de la realacion Tasa-Distorsion (R-D) que da una

aproximacion muy fina. Para conseguir esta tasa se pueden utilizar los siguientes metodos.

3.4.1 Control de Tasa Utilizando Q-Tabla

Este metodo consiste en variar los anchos de cuantificacion para cada subbanda hasta con-

seguir la tasa requerida e incluir los anchos en las cabeceras. Como se menciono antes este

metodo necesita varias iteraciones para conseguir la tasa deseada.

Sin embargo este metodo puede ser muy bueno para aprovechar las caracterısticas del

SVH, que responde de diferente modo a distintas frecuencias segun la Funcion de Sensibilidad

al Contraste (CSF), en este caso a distintas bandas. Aunque este metodo puede tener

inconvenientes con el truncado como se vera en el apartado 3.5.4

3.4.2 Control de Tasa Utilizando EBCOT

El algoritmo EBCOT, propuesto por Taubman en [36], consigue alcanzar la tasa deseada

en una sola iteracion y con la mınima distorsion posible. A continuacion se hace una breve

descripcion del metodo. Para conocer mas detalles consultar [21, 36].

El metodo comienza con el ancho de cuantificacion mas pequeno posible y realiza la

Page 112: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

108 Capıtulo 3. Estandar JPEG2000

codificacion de entropıa de los bloques. Despues mediante el algoritmo de calculo de Tasa

Lagrangiana (Lagragian Rate Allocation) se obtiene el numero de pasadas para cada bloque

para obtener la tasa deseada y con la mınima distorsion posible. Esto se repite para cada

capa.

Para que el algoritmo funcione eficientemente se necesita que, al truncar la codificacion,

la construccion de las capas sea eficiente. Lo que se pretende es truncar la codificacion con

la mınima distorsion posible, es decir, la maxima calidad visual posible. Esta propiedad solo

puede ser conseguida con el orden LRCP de la seccion 3.3.4 porque el ultimo parametro

que se recorre son las capas. El problema es que el truncado puede no ser optimo si no cae

al final de la formacion de un capa y algunos paquetes pueden ser decartados. Por esto es

mejor utilizar un numero alto de capas, entorno a 50, para conseguir una eficiente tasa de

compresion. Aunque el impacto en el PSNR final es pequeno.

Consecucion de Tasa Lagrangiana (LRA)

La trama final comprimida tiene muchos puntos de truncado potenciales que ocurren en

cada pasada de codificacion de los planos de bit. Si no se trunca la trama, la codificacion

resultante tiene una profundidad de Mb bits en la banda b. Si se trunca la profundidad

quedara con Nb donde Mb > Nb, que es lo mismo que cuantificar con anchos de ∆b2Mb−Nb .

En cada plano de bit se aumenta la tasa y se disminuye la distorsion, ası que se trata de

obtener una relacion entre lo que aumenta la tasa y disminuye la distorsion con cada plano

de bit y sus puntos de truncado.

La densidad de probabilidad para cada banda se estima mediante funciones de Densidad

Gaussiana Generalizada (GGD) de la forma:

p(x) =α

2αΓ(1/α)

Γ(3/α)

Γ(1/α)exp

{

−(√

Γ(3/α)

Γ(1/α)

|x|σ

)α}

(3.25)

Donde para α = 1.0 la densidad es Laplaciana y para α = 2.0 es Gaussiana. Calculando

α para cada subbanda se obtiene la varianza σi y se aplica la funcion Lagragiana:

J =∑

i

βiγiσ2i di(Ri) + λ

i

βiRi (3.26)

Aquı βi es la fraccion de todos los coeficientes contenidos en la banda i, γi es la energıa de

la banda (normalizacion), di(Ri) es la distorsion MSE y λ es el multiplicador de Lagrange.

La distorsion se suele medir con el error MSE, que tambien puede ser ponderado por pesos

visuales. Esto es interesante para explotar las caracterısticas del SVH, al igual que en el

metodo Q-Tabla anterior. Ver seccion 3.5.4 El resultado serıa equivalente si se conoce la

Page 113: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.5. Extensiones 109

relacion entre utilizar anchos de cuantificacion en el metodo Q-Tabla y los pesos para cada

subbanda en este metodo. La distorsion se puede expresar como:

Dti = γ2b

u,v

wi(u, v)[Ii(u, v)− I ti (u, v)]2 (3.27)

Resolviendo esta ecuacion bajo ciertas suposiciones y aproximaciones se puede obtener

una relacion directa entre Tasa y Distorsion (R-D) correspondiente, di(Ri), para cada banda

y por tanto para cada bloque, segun muestra la figura 3.16. La forma de la grafica varıa en

funcion de la banda y de la codificacion.

Figura 3.16: Relacion Tasa-Distorsion.

Donde t es el punto de truncado, i es el numero de bloque, Ii(u, v) es el coeficiente

transformado, I ti (u, v) es el coeficiente transformado truncado, wi(u, v) es el peso visual y

γb el coeficiente de normalizacion de la subbanda. El algoritmo EBCOT encuentra el punto

de truncado, a partir de la di(Ri) estimada con LRA, donde se minimiza la distorsion D de

todos los bloques Di, es decir, se trata de minimizar D =∑

iDti teniendo en cuenta que la

tasa total es la contribucion de las tasas truncadas de todos los bloques, R ≥∑iRti.

3.5 Extensiones

Hasta aquı se han descrito a rasgos generales las caracterısticas principales del estandar

JPEG2000. A medida que se han ido consolidando las bases, se han anadido nuevas carac-

terısticas que, aunque ya no son basicas, le han dado una mayor potencia en aplicaciones:

como la introduccion de codigos de correccion de errores para aplicaciones de transmision,

regiones de interes para mayor eficiencia de almacenamiento o mejor calidad solo en de-

terminadas regiones, como la fragmentacion de la imagen para tratamiento por separado

Page 114: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

110 Capıtulo 3. Estandar JPEG2000

en maquinas de poca capacidad,...etc. En las siguientes secciones se hace una revision de

algunas de las mas importantes.

3.5.1 Regiones de Interes (ROI)

Las Regiones de Interes (ROI) son regiones de la imagen que van a sufrir un mejor trato

por parte del codificador. Basicamente consisten en un realce de los coeficientes de regiones

cuadradas o circulares de manera que el codificador no pueda eliminarlos cuando tenga que

truncar las capas,[1].

Las regiones son sencillas para que se puedan describir con pocos parametros. Una region

esta decrita por cuatro parametros en el caso de ser rectangular, dos para las coordendas de

una esquina y otras dos para el ancho y el alto, y tres si es circular, dos para las coordenadas

del centro y una para el radio. Las regiones por tanto seran rectangulares, circulares y

combinaciones de estas. Las coordenadas estan normalizadas a las dimensiones de la imagen

y para el caso del radio a la dimension mas grande.

Region Rectangular: (xi ≤ x ≤ xi + hi), (yi ≤ y ≤ yi + wi)Region Circular: (x− xi)

2 + (y − yi)2 ≤ (ri + 0.5)2

(3.28)

Donde hi y wi son las dimensiones del la region rectangular i y ri el radio. Estas cood-

enadas son enviadas al decodificador junto con el realce y este no tiene mas que decodificar

y deshacer el realce en la ROI. Realzar una muestra es multiplicar por 2u, es decir, una

operacion de desplazamiento de la muestra. Hay tres tipos de realce:

• Generica: En este caso se codifican las coordenadas de la region, cuatro si rectangular

y tres si circular, y el realce para cada una de ellas.

• Igualado por Bloques: Ahora el realce de todas las muestras se aproxima al maximo

de todo el grupo. Con este metodo solo hace falta almecenar un realce. En cambio da

menos libertad de elegir y puede dar problemas de saturacion de las muestras.

• Particion Implıcita: Este metodo es la que JPEG2000 utiliza por defecto. Consiste

en elegir un determinado realce de manera que el coeficiente de menor valor de la ROI

sea mayor que cualquiera del resto de los coeficientes que no esten en la ROI. Con

este metodo el decodificador no necesita conocer las coordenadas de la ROI puesto que

basta con saber el umbral a partir del cual el coeficiente es de la region.

Otras consideraciones a tener en cuenta es la forma que tienen las ROI en cada nivel.

Estas seran diferentes en funcion del tipo de filtro utilizado. Para el calculo de las ROI en

sucesivos niveles se utilizan filtros de Daubechies (9,7) y (5,3), CRF(13,7), SWE(13,7), (2,6),

Page 115: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.5. Extensiones 111

(2,10) y (10,18). En el caso de que se definan varias regiones de interes es posible que las

ROI se solapen en los niveles de baja resolucion. En los casos en los que esto suceda se tiene

en cuenta el realce que sea mayor.

Dominio Imagen Dominio Wavelet

Figura 3.17: Solape de Varias ROI en el dominio Wavelet.

Los inconvenientes son que las ROI pueden perjudicar la flexibilidad de la organizacion

de la trama y que para 16-bit no se pueden implementar ROI puesto que el realce se puede

saturar.

3.5.2 Resistencia al Error

El estandar JPEG2000 es capaz de introducir redundancias en la imagen comprimida, o mejor

dicho, codigos de error como cabeceras de trama, para poder descomprimir la imagen aun con

perdidas de informacion. Esta extension solo tiene sentido en entornos de comunicaciones

y aplicaciones cliente-servidor donde es muy probable tener perdidas de informacion. Ya

se estan sugiriendo extensiones para aplicaciones sin cables, wireless, dentro del estandar.

Evidentemente, si su uso es para almacenar en bases de datos, solo supondrıa un exceso de

informacion. Las tecnicas utilizadas para deteccion de errores estan implementedas a nivel

de codificacion de entropıa y a nivel de paquetes.

Como se discutio antes, el hecho de tratar con divisiones en bloques independientes

de otras bandas hace que sea mas sencillo introduccir codigos de proteccion dentro de los

mismos bloques. Un ejemplo a nivel de codificacion viene dado por los restablecimientos

de los contextos de probabilidad al final de cada pasada de los planos de bit, lo que evita

que el error se propague en las siguientes etapas, aunque por contra se pierde eficiencia en

la compresion. Ademas tambien se pueden introducir sımbolos al final de la codificacion

aritmetica de cada plano, P p,3i , como la marca ’1010’, que indica que la decodificacion se

esta haciendo correctamente. Si esta marca no aparece se descartan los siguientes planos del

bloque. Este proceso constituye un ejemplo de deteccion de errores.

Page 116: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

112 Capıtulo 3. Estandar JPEG2000

A nivel de paquete se introducen cabeceras y colas en cada uno de ellos para deteccion

de errores. La forma se puede ver en la figura 3.11.

Como resumen, las clases de deteccion de errores implementadas son:

A nivel de paquete:

• Cabeceras: inclusion de cabeceras en los paquetes para proteccion y correcion de er-

rores.

• Colas: tienen la misma mision que las cabeceras.

A nivel de bloque:

• Marcadores de segmento: marcas al final de la codificacion de cada plano de bit.

• Terminacion para resistencia al error: se introduce una terminacion especial al finalizar

cada pasada en la codificacion aritmetica.

• Codificacion causal: elimina la dependencia de los contextos en relacion a las codifica-

ciones de los planos de bit anteriores.

• Codificacion paralela: restablece los contextos probabilısticos de la codificacion ar-

itmetica. Esto permite en cierta forma una codificacion paralela de cada plano.

• Codificacion sencilla (lazy): consiste en no marcar todos los planos ni hacer una ter-

minacion especial en la codificacion aritmetica, con lo que el proceso es mas sencillo y

rapido a cambio de perder eficiencia en la deteccion de errores.

Todas las combinaciones son posibles aunque no tiene mucho sentido el utilizar, por

ejemplo, la codificacion sencilla con marcadores de segmento puesto que tienen funciones

diferentes.

3.5.3 Cuantizacion con Codificacion Trellis

La Cuantizacion de la Codificacion Trellis (TCQ) es una forma de cuantizacion escalar de

varianza espacial con decision de codificacion retardada. Los coeficientes son rastreados de

la misma manera que la figura 3.7. El arbol Trellis tiene ocho estados donde se elige la

secuencia optima, tıpicamente mediante un algoritmo de Viterbi,[15]. El resultado es que

se obtiene una mejor calidad en zonas con texturas, es decir, altas frecuencias. Para mas

detalles consultar [21].

Page 117: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.5. Extensiones 113

3.5.4 Metodos Perceptuales

Como se ha descrito anteriormente, el SVH tiene una serie de caracterısticas muy peculiares

de las que todavıa queda mucho por conocer. Algunas de ellas son muy bien conocidas y son

utilizadas para aumentar la eficiencia de compresion. La idea es aprovechar que el SVH no

es capaz de percibir por igual los diferentes estımulos que llegan al ojo, con lo que se puede

hacer una codificacion selectiva codificando peor aquello que el SVH no percibe bien y con

mejor calidad lo que percibe bien.

El modelado o procesamiento de estas caracterısticas se hace despues de la transformada

wavelet y antes de la cuantificacion. Teniendo en cuenta esto, el estandar JPEG2000 explota

tres caracterısticas del SVH [6].

La primera, y la mas comun, es que la percepcion de intensidad lumınica no es lineal

sino exponencial, caracterizado aproximadamente por y = α√x. Como resultado de esto

la cuantificacion no sera uniforme, aunque el cuantificador utilizado sea uniforme. En el

proceso de cuantificacion basta con conocer α y aplicar la funcion inversa, x = yα. La forma

de la funcion se puede ver en la figura 3.18. Este metodo es llamado autoenmascaramiento

o mas comunmente correccion gamma.

Figura 3.18: Resultado de la correccion de contraste. izq. Funcion de transformacionSigmoidal. dech. Cuantizacion No Linear resultante.

La segunda caracterıstica es la diferente respuesta del SVH a la frecuencia espacial.

A groso modo el SVH tiene una menor sensibilidad a medida que aumenta la frecuencia.

Es decir percibe mejor las bajas frecuencias que las altas. Basicamente es una aplicacion

directa de la CSF. En el anterior JPEG se modelaba con diferentes pesos en la tabla de

normalizacion o cuantizacion en funcion de la frecuencia. Pero esto era difıcil de aplicar

puesto que en la DCT no hay una correspondencia directa entre coeficiente y frecuencia, ası

que cada fabricante utilizaba su propia tabla. En el caso de la transformada wavelet se da

Page 118: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

114 Capıtulo 3. Estandar JPEG2000

un determinado peso a cada banda que corresponde con unas determinadas frecuencias, con

lo que la relacion es mas directa. Otro metodo serıa utilizar distintos anchos de cuantizacion

en cada banda. Esto se vera con detalle mas adelante.

La ultima caracterıstica utilizada va mas alla y no es tan comunmente utilizada como

las anteriores. Esta aprovecha los procesos de enmascaramiento que se producen en el SVH

cuando existen zonas de alta intensidad lumınica. Los pıxeles que tengan valores muy altos,

muy energeticos, pueden llegar a enmascarar a sus vecinos. Esta propiedad es muy difıcil de

explotar con la DCT puesto que se pierde informacion espacial pero no con wavelet ya que

conserva la informacion espacial.

La correccion gamma y el enmascaramiento de los vecinos se modela con la funcion:

yi = sign(xi)|xi|α

(

1 + a∑

Ki

|xk|βφi

) (3.29)

Donde xi e yi son los coeficientes wavelet y wavelet corregido respectivamente, α ∈ (0, 1)

es la correcion gamma (por defecto 0.7), φi es el tamano de los vecinos, a el coeficiente de

normalizacion (1000/2profbit−1)β, xi son los coeficientes vecinos cuantizados y β ∈ (0, 1) el

coeficiente de enmascaramiento de los vecinos (por defecto 0.2). El tamano de la region

de influencia de los vecinos, N , y el valor de β son fundamentales para diferenciar si el

coeficiente es parte de un borde o parte de una textura, ya que se pretende preservar a los

primeros frente a los segundos puesto que el enmascaramiento no es tan fuerte. Otro aspecto

es que el decodificador no puede tener a la vez todos los vecinos de un coeficiente debido a la

secuencia de codificacion, de tal manera que en el enmascaramiento solo se tienen en cuenta

los coeficientes ya codificados como muestra la figura 3.19. Ası para una region de N = 5 el

numero de vecinos sera φ = 12. Aun ası, estos coeficientes sufriran perdidas en el proceso

de codificacion, con lo que es posible elegir el numero de bits que seran representativos en

el enmascaramiento. Tambien se elige si se respetan los bordes de los bloques y a partir de

que nivel la mascara sera efectiva.

A pesar de que se consigue mejorar la calidad visual de la imagen, debido a las aprox-

imaciones de los metodos, no dejan de ser puramente matematicos, se producen ciertos

artefactos, sobre todo para tasas bajas. En la banda diagonal se encuentran orientaciones

de 45 y -45 grados y el SVH no es capaz de enmascarar coeficientes de una orientacion en las

cercanıas de coeficientes de la otra orientacion, cosa que el metodo propuesto si que hace.

El resultado es que se producen artefactos visibles. Una solucion es desactivar el enmas-

caramiento en las bandas diagonales. En las bandas horizontales y verticales el problema

se produce en el enmascaramiento de coeficientes con direccion diagonal. Otros problemas

derivan del cruce por cero en los que puede haber perdidas de fase.

Page 119: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.5. Extensiones 115

Figura 3.19: Vecinos significativos ’x’ de una region N=5.

En el caso de la segunda caracterıstica antes mencionada, en relacion con la sensibilidad

del SVH a la frecuencia, se pueden seguir tres estrategias teniendo en cuenta lo contado en

el apartado de cuantizacion (sec. 3.2.4) y el de control de tasa (sec. 3.4)

Pesos Visuales Fijos

Hay dos maneras:

• Pesos Visuales Fijos: consiste en hacer una estimacion de la tasa de distorsion Di

de cada subbanda ponderada por el coeficiente wi de manera que las bandas de mayor

sensibilidad son codificadas con mas pasadas. En muchas ocasiones este metodo es

aplicado por determinadas condiciones de luminancia en la visualizacion. Estos pesos

tienen que ser transmitidos al decodificador para deshacer la ponderacion.

• Variar Anchos de Cuantizacion: Este procedimiento es semejante al anterior,

la diferencia es que se actua directamente sobre los anchos de cuantificacion. Mas

pequenos para las bandas de mayor sensibilidad. Los anchos tambien tienen que ser

transmitidos.

Pesos Visuales Progresivos

Debido al proceso de truncado de los planos de bit en la codificacion, que se desconoce en

principio, es posible que los pesos visuales introducidos no tengan un buen comportamiento.

Este metodo permite que los pesos visuales vayan cambiando eficientemente a medida que

avanza la codificacion. Por contra habra que mandar mas informacion ya que el decodificador

debe conocer todos los pesos utilizados en el proceso.

Page 120: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

116 Capıtulo 3. Estandar JPEG2000

3.5.5 Fragmentacion o Tiling (SSWT)

El fragmentacion o tiling de la imagen solo tiene sentido en sistemas que tienen poca ca-

pacidad de memoria, de manera que no es necesario almacenar una transformada wavelet

de toda la imagen, o bien para aplicaciones en que se necesite rapidez, donde la maquina

puede procesar partes de la imagen en paralelo. Esto tiene interes para sistemas pequenos

como telefonos moviles o pequenas agendas, pero hay que tener en cuenta que el proceso de

fragmentacion implica informacion en exceso puesto que se aumenta el numero de cabeceras.

Otra aplicacion que se podrıa aprovechar es la de tener un mecanismo para comprimir con

distitas calidades en zonas diferentes de la imagen, pero para esto ya estan las ROI.

El metodo de fragmentacion es llamado Segmentacion Espacial de la Transformada Wavelet

(SSWT). Uno de los primeros inconvenientes de realizar la transformacion wavelet con dis-

tintos fragmentos de la imagen, ademas del exceso de informacion, es la distorsion en los

bordes. Esto es debido a que las primeras frecuencias que se pierden son las altas, puesto

que son las menos sensibles para el SVH, y en las zonas de los bordes de la imagen, donde

predominan estas, se producen molestos artefactos. Para reducir este efecto se pueden sola-

par los fragmentos o cuadros que componen la imagen, aunque esto tambien produce exceso

de informacion en funcion de cuanto se solapan los cuadros. En el caso de que una ROI este

contenida en varios cuadros se procesa por separado. El solape utilizado en el JPEG2000

es de un pixel por dos caras de cada cuadro de manera que el solape final es de un solo

pixel. Viene a ser como Solape de una Sola Muestra en la Transformada Wavelet (SSOWT).

Una alternativa es el metodo Extension de Punto Simetrico Sin Solape (Non-Overlapped

SSWT with the Point-Symmetric Extension). Consiste en hacer una reflexion especular de

las muestras en torno a los bordes de los fragmentos como muestra la figura 3.20. Despues

se aplica la transformada wavelet sobre la secuencia obtenida en la reflexion y se codifica en

funcion de si la secuencia es par o impar. El resultado es que los coeficientes wavelet de los

bordes ya no son los mismos pero la recontruccion es perfecta, [21]

Figura 3.20: Extension de los coeficientes simetricamente.

Page 121: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.6. Resultados 117

3.5.6 Tratamiento Post-Compresion

El estandar JPEG2000 permite hacer ciertas manipulaciones sobre la imagen sin tener que

hacer la decodificacion de entopıa. Una primera solucion serıa decodificar la imagen, hacer

la transformada inversa y despues hacer la manipulacion para volver a hacer el proceso

contrario. Una segunda opcion, que es la adoptada por eficiencia de computo, es el hacer

las manipulaciones directamente en el espacio wavelet, ası solo se tendrıa que realizar la

decodificacion. Las operaciones basicas son rotaciones de 90, 180 y 270 grados, voltear

horizontal y verticalmente y combinaciones de las anteriores. Para que el decodificador

sepa cual de las manipulaciones se ha hecho, se incluyen tres bits que cubren todas las

combinaciones posibles, teniendo en cuenta que algunas son equivalentes.

3.6 Resultados

Conviene, para una mejor comprension de las caracterısticas hasta ahora expuestas del

estandar JPEG2000, hacer un pequeno analisis de como varıan las tasas de compresion

y calidades de las imagenes en funcion de los distintos parametros. En la evaluacion de

la calidad de la imagen en los experimentos hechos se ha utilizado el PSNR como medida

evaluadora:

PSNR = 10 log10

(

K2

MSE

)

, MSE = 1NxNy

∑Nxi=1

∑Nyj=1(Io(x, y)− Ii(x, y))

2 (3.30)

Figura 3.21: Fotos-test (2560x2048) elegidas por el estandar JPEG2000.

Donde Io y Ii son la imagen comprimida y original respectivamente, y K es l constante

de normalizacion, generalmente K = 255. Aquı solo se presentaran datos cualitativos y

Page 122: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

118 Capıtulo 3. Estandar JPEG2000

cuantitativos mediante graficas, para datos mas precisos consultar el artıculo de Rabbani y

Joshi,[29]. Los valores son una media de los valores obtenidos con tres imagenes diferentes,

figura 3.21.

3.6.1 Resultados con Perdidas (lossy)

Tamano de Bloque

Segun la grafica 3.22 se observa como tamanos de bloque por debajo de 32x32 no son efi-

cientes, sobre todo para tasas altas donde la diferencia es mayor. Esto es debido a que el

aumento de la informacion de cabeceras esta en relacion con el numero de bloques. Otra

razon es que la reinicializacion de los codigos aritmeticos es mucho mas frecuente. Por tanto

para una misma tasa se obtienen peores calidades a medida que se disminuye el tamano de

bloque.

Figura 3.22: Relacion Tasa-PSNR en funcion del tamano de bloque.

Filtros DWT (9,7) y (5,3)

Como ya se intuıa, el filtro no reversible es el que tiene mas calidad de imagen frente a una

misma tasa debido a la precision de punto flotante (9,7) frente a la precision entera (5,3).

En cambio el filtro (5,3) permitira la implementacion sin perdidas, cosa que no es posible

con el otro.

Page 123: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.6. Resultados 119

Figura 3.23: Relacion Tasa-PSNR en funcion de los filtros Reversible (5,3) y No Reversible(9,7).

Niveles de Descomposicion Wavelet

Figura 3.24: Relacion Tasa-PSNR en funcion de los Niveles Wavelet.

El numero de niveles afecta a la eficiencia de la codificacion en cuanto al numero de

niveles de resolucion que se representan. Los experimentos muestran como mas alla de los

cinco niveles, hasta los ocho, los valores son muy parecidos. Segun se muestra en la grafica

Page 124: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

120 Capıtulo 3. Estandar JPEG2000

3.24 las perdidas son mas significativas para el caso de un solo nivel.

Codificacion Sencilla, Paralela y Ambas

El estandar JPEG2000 implementa muchos tipos de codificacion para aumentar la velocidad

de procesamiento, mediante codificaciones en paralelo o simplemente codificaciones menos

severas. Por contra esto implica perdida de la potencia de compresion, como se observa en

la figura 3.25, por no explotar toda la dependencia probabilıstica espacial y entre planos,

aunque las perdidas son muy pequenas, entre 0.001 y 0.3 dB dependiendo de la tasa de

compresion.

Figura 3.25: Relacion Tasa-PSNR en funcion Codificacion Sencilla, Paralela y Sencilla-Paralela.

Comparacion JPEG2000 vs. JPEG

Para tasas bajas el anterior JPEG no es capaz de llegar con q-tablas. La comparacion se ha

hecho con parametros optimos del nuevo algoritmo con el filtro de (9,7). Como muestra la

grafica 3.26, el anterior JPEG esta entre 2 y 4 dB por debajo, lo cual es mucho.

Page 125: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.6. Resultados 121

Figura 3.26: Relacion Tasa-PSNR en funcion comparando JPEG2000 vs. JPEG.

3.6.2 Resultados sin Perdidas (lossless)

Transformada Reversible de Color (RCT)

Es bien conocido que decorrelar la imagen mediante un transformada de color representa

mas eficientemente la informacion y por tanto mejor sera su procesamiento posterior. Esto

se muestra en la tabla 3.10 para distintas imagenes donde para la RCT se pueden ganar de

0.16 a 2.39 bpp, que es mucho para codificacion sin perdidas.

Imagen Sin RCT Con RCT

Lena 13.789 13.622Mandril 18.759 18.103Bicicleta 13.937 11.962Mujer 13.892 11.502

Tabla 3.10: Tasa sin perdidas (bpp) con y sin RCT.

Otras Opciones

Al igual que en caso sin perdidas a medida que aumenta el numero de niveles aumenta la

eficiencia de representacion y por tanto la tasa sin perdidas que se puede obtener. Mas

alla de 8 niveles no se observa mucha mejorıa. Para el tamano de bloque ocurre lo mismo,

perdiendo eficiencia con tamanos menores de 32x32. Lo mismo con las codificaciones sencilla

Page 126: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

122 Capıtulo 3. Estandar JPEG2000

y paralela. Para el caso del numero de capas, a medida que aumentan, se mejora la eficiencia

del truncado pero se aumenta el exceso de informacion en las cabeceras; aunque muy poco,

en torno a 0.01 bpp. Lo mismo que sucede con perdidas.

Comparando JPEG2000 Sin Perdidas y JPEG-LS3 los valores son muy dispares entre

las dos tecnicas. Se encuentran casos donde JPEG2000 es mejor y casos donde es peor.

Pero teniendo en cuenta que JPEG-LS es uno de los algoritmos sin perdidas que consiguen

mejores tasas de compresiom se puede decir que JPEG2000 puede competir con la mayorıa

de algoritmos sin perdidas.

3.6.3 Resultados de la Codificacion de Entropıa

Para ver mejor el proceso de codificacion paso por paso se presentan las siguientes graficas

que representan los progresos del codificador en las distintas etapas con la imagen de ’Lena’.

Los parametros elegidos son los optimos en relacion con los experimentos anteriormente

mecionados.

Figura 3.27: Grafica de progreso en la codificacion de 11 planos de bit.

Como se ve, la progresion es exponencial dada su linealidad con un eje logarıtmico. Notar

que para las pasadas de ’Significancia’ y ’Refinamiento’ el valor en el primer plano es 0 bytes,

con lo que tendrıan un valor de −∞. Notar tambien que la relacion entre ellos permanece

practicamente constante excepto en el ultimo plano para la pasada de ’Normalizacion’, ya

3En el capıtulo 5, seccion refsec:medjp2, se hara una breve explicacion del algoritmo JPEG-LS y otrosmetodos sin perdidas con una comparacion de los mismos.

Page 127: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

3.6. Resultados 123

que casi todos los pıxeles son codificados en las anteriores pasadas. Una curiosidad es que

el numero bytes utilizados en un plano es siempre superior a la suma de todos los utilizados

en los anteriores planos (excepto en el plano 11).

Figura 3.28: Progresion de tasas y medidas en la codificacion de 11 planos de bit.

En la figura 3.28 se representa por un lado el PSNR en dB en funcion de los planos de bit

y por otro lado los porcentajes del numero de pıxeles que en el plano codificado estan en la

pasada de refinamiento, son significantes, e insignificantes. La lınea discontınua representa

el porcentaje de bpp en relacion con el maximo, 8 bpp.

Page 128: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

124 Capıtulo 3. Estandar JPEG2000

Page 129: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 4

Toolbox JPEG2000 (J2MT)

Por la noche, cuando las calles de vuestras ciudadesesten silenciosas y creais que estan desiertas, estaranatestadas de la multitud que antano las lleno y queregresa, y que todavıa ama esta hermosa tierra. Elhombre blanco nunca estara solo... La vista de vuestrasciudades hiere los ojos de mi gente. Quiza porque el”Piel Roja”es un salvaje y no lo comprende. No haysilencio alguno en las ciudades de los blancos, no hayningn lugar donde se pueda oır crecer las hojas enprimavera y el zumbido de los insectos. No hay unsolo sitio tranquilo en las ciudades del hombre blanco.Ningun lugar desde el que poder escuchar en primaverael brote de las hojas o el revolotear de un insecto. Talvez sea porque soy lo que llamais un ”salvaje”y nocomprenda algunas cosas... Consideramos la posibilidadde que el hombre blanco nos compre nuestra tierra. Peromi pueblo pregunta: Como se puede comprar el Cielo,o el calor de la tierra, o la velocidad del antılope?.Como vamos a vender todo esto y como vais a podercomprarlo?.

Jefe Seattle , Extracto de carta dirigidaal Presidente Washington, 1855.

4.1 Introduccion al J2MT c©

La union de este proyecto con el estandar JPEG2000 comienza realmente aquı. La intencion

es desarrollar una herramienta que permita explotar las caracterısticas del JPEG2000 de una

125

Page 130: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

126 Capıtulo 4. Toolbox JPEG2000 (J2MT)

manera sencilla e intuitiva. El problema de un estandar tan complejo es que la cantidad de

parametros utilizados se hace inmanejable. Ademas, gran cantidad de gente ha trabajado en

el y numerosas versiones se han ido sucediendo y siguen sucediendose, con lo que el numero

de opciones hace que el manejo del codificador no sea una tarea facil. A esto hay que sumarle

uno de los objetivos comentados, y repetido en muchas ocasiones, la flexibilidad. El que sea

un algoritmo flexible aumenta en gran medida el numero de aplicaciones que puede tener,

pero tambien contribuye en gran medida a complicar su manejo, sobre todo para alguien

que no conozca a fondo el estandar, y mucho menos para alguien que no este relacionado

con temas de tratamiento de la senal.

El ambito de aplicacion del JPEG2000 MATLAB TOOLBOX (J2MT) sera un entorno

donde se permita que el usuario maneje, de una manera facil e intuitiva, todas las caracterısticas

que el JPEG2000 proporciona, esto es, sera un entorno grafico. El entorno grafico permite

que el usuario acceda a las opciones de codificacion de manera rapida y de un simple vistazo

puede conocer todas las posibles variables. Hasta ahora las versiones del codificador y decod-

ificador, llamadas Verification Model, funcionan como simples ejecutables, programados en

C, que solo permiten el uso de las opciones de codificacion a traves de la lınea de comandos.

Ahora se puede entender el porque la necesidad de un entorno grafico que, ademas de ser

mas sencillo, limita el campo de actuacion del usuario, lo que reduce el numero de errores

que se puedan cometer en la eleccion de dichos parametros.

El entorno grafico desarrollado pretende dar una vision amplia y completa, o practicamente

completa, de las posibilidades que ofrece el nuevo estandar. En este punto quedan descarta-

dos, por tanto, aquellos usuarios que no tengan conocimientos del tratamiento de la senal o

campos similares, puesto que se necesitan conocimientos previos para el uso del programa y

sin ellos podrıa resultar un tanto agreste.

El lenguaje utilizado es MATLAB, aunque se podrıa haber utilizado cualquier otro, se

eligio este por ser uno de los lenguajes de ambito academico y de investigacion mas extendidos

y que a la vez permite una implementacion sencilla y rapida.

4.2 Descripcion

Las siguientes secciones estan elegidas segun resulta de la seleccion de parametros en la apli-

cacion J2MT. La eleccion en este se baso en dos criterios: una agrupacion de los parametros

del codificador segun la relacion con la parte del codificador en la que actuan y una opti-

mizacion de las zonas permitidas para el despliegue de los botones dentro del entorno grafico.

De tal manera, las secciones quedan como siguen a continuacion, pero antes una descripcion

de los detalles tecnicos mas importantes.

Page 131: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.2. Descripcion 127

4.2.1 Aspectos Tecnicos

Como se comento en la introduccion el nuevo estandar actualmente solo provee una version

del decodificador en la cual unicamente se puede acceder a traves de la lınea de comandos.

La herramienta J2MT en lenguaje Matlab se encarga de traducir las opciones elegidas por

el usuario y renombrarlas en forma de flags. Ejemplo:

% vm8 compress -i lena.pgm -o lena.jp2 -Flev 4 -Fguard bits 2

En este caso se comprime la imagen lena.pgm en la trama lena.jp2 con 4 niveles de

descomposicion y 2 bits de guarda. Evidentemente a medida que se aumentan los parametros

su uso se hace impracticable. Para recuperar la imagen:

% vm8 expand -i lena.jp2 -o lena r.pgm

Las ventajas de utilizar un entorno Matlab, como se comento anteriormente, es que es

un entorno muy difundido en el ambito academico y de investigacion, constituyendo una

herramienta muy potente y sencilla. Ademas, el J2MT es portable para sistemas Unix y

Windows, ya que actua en el sistema operativo segun detecte un caso u otro, aunque no ası

la version del VM. El inconveniente es que se pierde velocidad calculo en relacion con otros

lenguajes que manejen objetos de mas bajo nivel, como C++ o Java.

Como descripcion basica de las tecnicas de programacion se puede citar:

• El entorno grafico se desarrollo bajo la guıa de usuario GUIDE de Matlab.

• Se utiliza una librerıa externa para la lectura de imagenes PGM.

• Se utiliza un sistema de numeracion de los objetos para una facilitar su busqueda y

ordenacion.

• Se utilizan campos ocultos en los objetos para almacenar posibles variables de estado

y opciones de codificacion.

• Crea una string con las opciones introducidas por el usuario y la ejecuta en la lınea de

comandos.

• Utiliza funciones especıficas que controlan los parametros visibles en cada momento.

• El J2MT chequea los datos selecionados en cuanto son introducidos. Chequea lımites,

tipos de datos posibles, incompatibilidades con otras opciones,... etc.

• Utiliza mensajes de error y advertencia para avisar y guiar al usuario.

Page 132: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

128 Capıtulo 4. Toolbox JPEG2000 (J2MT)

• Maneja copias temporales de las imagenes para compresion descompresion y tratamien-

to de las mismas. Ademas guarda informacion de los procesos de compresion y de-

scompresion en archivos temporales de texto. Estos son borrados cuando se cierra la

aplicacion.

• Permite no solo comprimir, sino descomprimir imagenes ya en formato JPEG2000.

Otra caracterıstica del codificador es que, por ahora, solo es capaz de leer imagenes con

formato PGM con lo que sera necesario utilizar funciones Matlab de lectura de imagenes con

este formato. En este caso se han utilizado librerıas ya implementadas.

Tambien se ha hecho otra version traduccida al ingles del J2MT para mejorar su difusion

y presentacion internacional. Ver 4.4.

4.2.2 Menus

Los menus implementados con los correspondientes submenus son:

Imagen

En Imagen se encuentran los submenus que se muestran en la figura 4.1. Se detallan a

continuacion.

Figura 4.1: Detalle del menu Imagen.

• Nueva Imagen: abre una imagen PGM y la muestra en pantalla.

• Cargar *.jp2: abre una imagen comprimida con el estandar JPEG2000.

• Guardar Imagen: guarda la imagen comprimida o descomprimida, segun se elija.

Page 133: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.2. Descripcion 129

• Ruta VM...: abre una ventana para indicar la ruta del codificador (Verification Model).

• Expandir menu: Oculta/Muestra los menus por defecto que utilizan todas las figuras

de Matlab.

• Manipular: redimensiona las imagenes Original, Wavelet, Reconstruida o Error en su

verdadera dimension y permite su manipulacion. A esta opcion tambien se accede en

el entorno grafico encima de las figuras.

• Salir: cierra J2MT. Esta opcion tambien esta accesoble mediante un boton en el entorno

grafico.

Los menus apareceran desabilitados si todavıa no se ha cargado ninguna imagen.

Ayuda J2MT

En Ayuda J2MT aparece una breve descripcion para el usuario de cada una de las partes

que consta el J2MT, semejante a lo que aquı se esta contando. Las partes de pueden ver en

la figura 4.2.

Figura 4.2: Detalle del menu AyudaJ2MT.

4.2.3 Transformada Wavelet

Aquı se pueden elegir todos los aspectos relacionados con la Transformacion Wavelet que

hace el codificador.

Se puede elegir el tipo de filtro: reversible (5,3) e irreversible (9,7). Como se comento en

el anterior capıtulo el segundo tiene mayor capacidad de compresion, pero el segundo permite

compresion sin perdidas. Tambien es posible utilizar filtros propios mediante la definicion de

Page 134: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

130 Capıtulo 4. Toolbox JPEG2000 (J2MT)

los coeficientes en un archivo externo. El nombre del archivo debe ser de la forma kernel-xxx,

donde xxx es el numero del filtro que se pide introducir. Ademas, se debe indicar la ruta

de acceso al archivo excepto el anterior directorio que lo incluye, siendo este int lifting si es

reversible o float lifting si no lo es. Por defecto se escoge el filtro (9,7).

Tambien se elige si la operecion de transformacion se realiza mediante convolucion o

lifting, siendo la primera solo posible para transformaciones irreversibles. Lifting por defecto.

En la figura 4.3 se detalla lo contado.

En cuanto a la descomposicion se puede elegir el numero de niveles que se quiera, si bien

el programa solo permite de 0 a 8, ya que mas de 8 no tienen utilidad. Por defecto son 5 los

niveles.

Figura 4.3: Detalle de los parametros para la Transformada Wavelet.

El JPEG2000 permite cualquier tipo de descomposicion. Para controlar la descomposi-

cion aparecen una serie de botones con los que se elige la forma en cada nivel de resolucion.

Solo se permiten dos recursividades por cada nivel, ası que, por un lado se controla la de-

scomposicion de la primera iteracion y por otro la segunda. Se ve mas claro en la figura 4.3.

Para elegir la descomposicion se indica mediante una determinada numeracion y secuencia el

tipo de descomposicion para cada banda. Por un lado esta el numero de descomposiciones de

cada nivel, con -Fdecomp, 1 para una decomposicion, 2 para la primera iteracion y 3 para la

segunda. Si el numero de niveles es mayor se escoge el ultimo para el resto de niveles. El tipo

de descomposicion se indica con -Fgen decomp, con 0 para no seguir descomponiendo, 1 para

una descomposicion horizontal y vertical, en cuatro bandas tıpicas, 2 para descomposicion

horizontal y 3 para vertical. La secuencia de recorrido es LL, HL, LH y HH. Si alguna banda

se descompone en mas se indica a continuacion de esta. La aplicacion se encarga de formar

Page 135: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.2. Descripcion 131

la sucesion de numeros correspondiente a la eleccion del usuario y la reprenta un boceto

grafico en pantalla. Para que quede mas claro se presentan los ejemplos de las figuras 4.4 y

4.5:

Figura 4.4: Ejemplo de descomposicion waveletde 5 niveles.

Figura 4.5: Ejemplo de descomposicion wavelet de 1 nivel.

Por otro lado tambien se permiten descomposiciones predefinidas del espacio transforma-

do. A saber: Mallat, Spacl, Packet. La primera es la descomposicion wavelet tıpica donde

cada nivel contiene una banda LL, HL, LH y HH con LL como base de la descomposicion

del siguiente nivel. La forma Spacl es igual que la Mallat pero las bandas HL, LH y HH

del primer nivel se descomponenen de nuevo en otras cuatro LL, HL, LH, HH. La forma

Packet descompone de nuevo cada banda obtenida en el primer nivel y ademas descompone

el segundo una vez. Los tres tipos se pueden ver en la figura 4.6.En funcion de la aplicacion

requerida se usara una descomposicion u otra, por ejemplo, para analisis de huellas digitales

el FBI suele utilizar una descomposicion Packet excepto en las bandas HH y para compresion

de imagenes suele proporcionar buenos resultados la descomposicion Mallat .

Page 136: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

132 Capıtulo 4. Toolbox JPEG2000 (J2MT)

a b c

Figura 4.6: Ejemplos de descomposiciones. a. Mallat.b. Spacl.c. Packet.

4.2.4 Codificacion I

En este conjunto de botones se puede elegir lo que sigue:

El tamano de los bloques sobre los que se realiza realmente la codificacion aritmetica.

Por defecto el tamano es 64x64.

El tamano de los precintos que englobaran a los bloques.

El orden de codificacion: LRCP, RLCP, RPCL, PCRL o CPRL. Codificacion sencilla,

paralela y causal. Tambien si se respetan los precintos en los bordes de la imagen, el numero

de capas y si estas se truncan o no. Las opciones por defecto son una ordenacion LRCP, no

respetar bordes, 50 capas con truncado y ninguna opcion de codificacion.

Figura 4.7: Detalles de los parametros en la opcion Codificacion I.

Page 137: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.2. Descripcion 133

Por otro lado, aquı tambien se accede a las opciones de resistencia al error contadas en

la seccion 3.5.2.

Por ultimo tambien se pueden obtener informes sobre el consumo de tiempo y memoria

de los procesos de compresion y descompresion.

4.2.5 Codificacion II

Las opciones que se eligen en este caso son:

La tasa final en bpp que se quiere obtener como resultado de la compresion, ademas de

las tolerancias maxima (0 por defecto) y mınima (0.005 por defecto) de dicha tasa. Tambien

es posible elegir el metodo de consecucion de la tasa, mediante una estimacion, la opcion

por defecto, o el metodo LRA contado en el anterior capıtulo. El segundo tiene la ventaja

de alcanzar la tasa en una sola iteracion y con mayor precision.

Figura 4.8: Detalles de los parametros en la opcion Codificacion II.

Tambien esta la zona muerta del cuantificador uniforme o bien utilizar una codificacion

Trellis.

Por otro lado se encuentran las opciones perceptuales. Se incluyen los distintos metodos:

pesos y anchos de cuantificacion diferentes en cada banda, ası como los Pesos Visuales

Progresivos. Tambien esta implementado el uso de una mascara sencilla y una mas compleja

segun se detalla en 3.5.4 del anterior capıtulo. Los pesos y los anchos se introducen mediante

un archivo externo de la misma forma. Ver mas detalles en [21]. Ademas se incluye la

codificacion implıcita que consiste en reducir en 2 el ancho de cuantificacion a medida que

disminuye la resolucion de la banda. Esta opcion, como es evidente, no se puede utilizar a

Page 138: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

134 Capıtulo 4. Toolbox JPEG2000 (J2MT)

la vez con la opcion de variar los anchos de cuantificacion. El programa ya se encarga de

que no se escojan a la vez desabilitando los botones.

4.2.6 ROI & Color

Aquı se escojeran los parametros referentes a las Regiones de Interes, las transformaciones

de color y los ultimos parametros que hayan podido quedar descolgados. Se pueden elegir,

com se menciono anteriormente, dos formas de ROI: cuadradas o circulares. La aplicacion

J2MT permite la eleccion de la coordenadas de manera grafica mediante el raton, mucho

mas comodo que si fuera por teclado. La seleccion de la ROI se hace de forma dinamica

donde el usuario puede desplazar el cursor hasta conseguir la zona deseada. Se puede ver un

ejemplo en la figura 4.9.

Figura 4.9: Ejemplo de seleccion de una ROI cuadrada.

Tambien se pueden definir varias ROI y escoger el tipo: generica, igualada o implıcita.

La ROI por defecto es implıcita. Las dimensiones de la ROI se normalizan en funcion de las

dimensiones de la imagen. En el caso de una ROI circular el radio se normaliza en relacion

a la dimension mayor. En lo referente a las transformaciones de color se pueden elegir dos,

una reversible y otra irreversible segun lo ya contado en la seccion 3.2.1 del anterior capıtulo.

En este ultimo grupo de parametros se encuentran dos opciones que deberıan aparecer

mucho antes, puesto que forman parte del pretratamiento, pero que se han ido descolgando

por no tener mucha relacion con las anteriores. Estas son: los bits de guarda y el valor de

offset, tambien comentados en la seccion 3.2.1 Por defecto son 2 bits de guarda y un valor

de offset de 128.

La larga lista de parametros de codificacion del JPEG2000 implementados en el J2MT

se termina con la opcion de introducir parametros de la manera que el usuario quiera o bien

anadirlos a los ya seleccionados.

Page 139: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.2. Descripcion 135

Figura 4.10: Detalles de los parametros en la opcion ROI & Color.

4.2.7 Tasas y Medidas

La figura 4.11 presenta las tasas y medidas de la calidad de compresion. Se han implementado

la medidas mas utilizadas. Se presenta el tamano de la imagen original y una medidad de

la compresion en bits por pixel (bpp) y relacion x:1 debajo de la imagen comprimida. El

numero de bpp viene dado mediante la relacion del numero de bits de imagen comprimida

dividido entre el numero bits que tiene la imagen, ası:

Tasa(bpp) =Tamano Archivo(Imagen) Comprimido

Numero de P ixeles(4.1)

La relacion (x:1), teniendo en cuenta los 8 bpp tıpico del formato PGM, es la relacion

entre el tamano de la imagen original y la imagen comprimida de la forma:

Tasa(x : 1) =Numero de P ixeles x 8

Tamano Archivo(Imagen) Comprimido(4.2)

Ademas se evalua la calidad de la imagen comprimida mediante el PSNR definido en

la ecuacion 3.30 y una medida del Error Cuadratico Medio (MSE) junto con la Media del

Error. Cuando la reconstruccion es perfecta no se presenta ningun dato de error salvo el

PSNR, que es infinito.

Hasta aquı supone una breve descripcion de las funciones que realiza el J2MT. Para

tener una mejor vision se aconseja manejar el propio programa. Si lo que se desea es obtener

detalles mas especıficos, se aconseja consultar la lista de parametros del JPEG2000 en el

Anexo B y hacer un repaso del codigo incluido en el Anexo C.

Page 140: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

136 Capıtulo 4. Toolbox JPEG2000 (J2MT)

Figura 4.11: Detalle de las tasas medidas en J2MT.

4.2.8 Funciones No Implementadas

La funcion que no ha sido implementada es la fragmentacion de la imagen o tiling. Esto

es debido a que suponıa una grave complicacion en la seleccion del resto de los parametros

sin realmente contribuir demasiado a la vision que la aplicacion J2MT pretende dar. Solo

supone seleccionar nuevos parametros para cada fragmento de la imagen.

Otros elementos no considerados, por utilizarse poco, o mas bien nada, es la posibilidad

que da el codificador, por ejemplo, de definir distintos tamanos de bloque y precintos en

funcion del nivel de decomposicion.

Si bien todos estos aspectos no son tratados directamente en J2MT, si se deja la posibil-

idad, como se comento anteriormente, de que el usuario pueda anadirlos a los ya elegidos en

la lınea de comandos.

4.2.9 Diagrama de Flujos

La relacion entre las distintas partes o funciones de J2MT se puede representar mediante el

diagrama de flujos de la figura 4.12:

4.3 Ejemplos con J2MT

A continuacion se presenta una serie de imagenes obtenidas con la herramienta J2MT para

mostrar como afectan las diferentes opciones de codificacion. Las opciones de codificacion

elegidas en cada figura son las que tiene JPEG2000 por defecto, excepto las que se indican

explıcitamente en cada una.

Page 141: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.3. Ejemplos con J2MT 137

Figura 4.12: Diagrama de flujos de la aplicacion J2MT.

Figura 4.13: Imagen original con 8 bpp y 256x256 de tamano.

Page 142: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

138 Capıtulo 4. Toolbox JPEG2000 (J2MT)

a b

Figura 4.14: Compresion a 1.5 bpp. (a) Filtro (9,7) 45.69 dB. (b) Filtro (5,3) 44.32 dB.

a b

Figura 4.15: Compresion (9,7). (a) 0.3 bpp 43.46 dB. (b) 0.1 bpp 42.35 dB.

a b

Figura 4.16: Compresion a 0.1 bpp. (a) 7 niveles 42.31 dB. (b) 1 nivel 31.69 dB.

Page 143: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.3. Ejemplos con J2MT 139

a b

Figura 4.17: Compresion a 0.1 bpp. (a) Mallat 42.35 dB.(b) Packet 40.79 dB.

a b

Figura 4.18: Compresion a 0.1 bpp. (a) Todas la resistencias al error 38.54 dB. (b) Ademascon paralela, causal y sencilla 40.79 dB.

Page 144: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

140 Capıtulo 4. Toolbox JPEG2000 (J2MT)

a b

Figura 4.19: Codificacion Trellis. (a) 0.1 bpp. (b.) 0.3 bpp.

a b

Figura 4.20: Mascara Perceptual: α = 0.7, β = 0.2, bits=5, N = 7 respetando los los bordesde los bloques. (a) 0.3 bpp 44.08 dB. (b) 0.1 bpp 43.12 dB.

Page 145: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

4.4. Observaciones 141

4.4 Observaciones

Es muy probable que el estandar JPEG2000 tenga una amplia difusion y buena acogida, tanto

por los resultados que obtiene como por la influencia de la gente que lo ha desarrollado.

Lo que es seguro es que desbancara al ya antiguo JPEG, que ya es mucho. Aunque en

un principio la distribucion del nucleo principal del estandar sera de distribucion libre, la

sucesivas extensiones que se han ido anadiendo no lo seran, desmarcandose de la filosofıa con

la que partio el proyecto.

Segun se conto en el apartado 4.1 de este capıtulo, la aplicacion grafica desarrollada va

dirigida a aquellos usuarios que tengan conocimientos previos de teorıa de la senal, y por

supuesto de manejo de software. Esto hace que uno de los principales objetivos sea su apli-

cacion en la ensenanza, y mas concretamente para alumnos de universidad; aunque tambien

puede ser util para difundir el estandar en entornos empresariales que tengan un contac-

to directo con imagenes digitales como centros medicos, centros aeroespaciales o empresas

vinculadas con este sector.

Esta aplicacion se presento en la 26a¯ reunion del JPEG en Genova (Italia) del 18 al 22 de

Marzo de 2002, tuviendo buena acogida, como se observa en la seccion de agradecimientos del

acta de la reunion. El documento de presentacion se adjunta en los anexos de la parte final

del proyecto. Ademas han surgido colaboraciones con AENOR para su difusion y futuras

reuniones del comite en Espana ademas del interes de algunos medios de comunicacion en

artıculos y notas de prensa.

Page 146: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

142 Capıtulo 4. Toolbox JPEG2000 (J2MT)

Page 147: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 5

Imagenes Medicas

A fin de realizarse en la plenitud de su ser, el hombredebe reconocerse, y nunca se reconocera de una manerareal y cabal mientras no haya reconocido la naturalezaque lo abarca y de la que el es fruto... El hombre no sehace realmente hombre, sino cuando ha logrado romperlas cadenas de la esclavitud que la naturaleza exteriordescarga sobre todos los seres vivos.

Miguel Bakunin, Oeuvres.

5.1 Introduccion a las Imagenes Medicas

La informacion en forma de imagenes es muy importante en diversos campos cientıficos

y profesionales, entre los que destaca de forma especial la medicina. En las ultimas dos

decadas han aparecido diversas modalidades de imagenes medicas que ofrecen a los medicos

y profesionales sanitarios informacion muy importante, y en ocasiones imprescindible, para

el diagnostico de patologıas y seguimiento de pacientes, y en los ultimos anos la planifi-

cacion quirurgica. Se puede destacar de forma especial las imagenes medicas de tomografıa

axial computerizada (TAC) y la resonancia magnetica nuclear (RMN). Las herramientas in-

formaticas y los metodos de tratamiento digitales son necesarios tanto para la adquisicion de

las imagenes medicas digitales como para su tratamiento y analisis. Asimismo, aplicaciones

de visualizacion son de gran utilidad en medicina para facilitar y permitir un aprovechamien-

to adecuado de la enorme cantidad de informacion disponible sobre los pacientes.

Las obtencion de una imagen medica consiste en el estudio de la interaccion de un deter-

minado tipo de radiacion cuando atraviesa el tejido humano, y la obtencion de informacion

clınica de interes a partir de dicha interaccion. Ası una imagen medica serıa la representacion

143

Page 148: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

144 Capıtulo 5. Imagenes Medicas

espacial en forma de imagen de una o mas propiedades fısicas dentro del cuerpo de un ser

vivo, en general humano.

El importante avance en medicina en el siglo XX, en concreto a partir de la segunda

mitad, vino acompanado, en gran medida, de los avances cientıficos de la fısica y los avances

tecnicos de la ingenierıa. Se han ido sucediendo metodos cada vez mas complejos en respuesta

a conocimientos y necesidades cada vez mas complejas. Se puede decir que el campo de las

imagenes medicas surge a raız de los estudios de W.C. Rontgen en 18951 de los rayos X.

En 1923 aparece la angiografıa para resaltar el contraste mediante sustancias radioopacas.

En 1950 surgen experientos con ultrasonidos debido a los avances del Sonar en la II Guerra

Mundial. En 1970 se inventa la Tomografıa Axial Computerizada mediante calculos de

proyecciones desarrollados en 1917 (Radon). Hounsfield2 construye el primer tomografo

comercial. En 1980 es el turno de la Tomografıa de emision de fotones unicos (SPECT:

Single Photon Emission Computed Tomography) y Tomografıa por emision de positrones

(PET: Positron Emission Tomography). Tambien en este ano se inventa la Resonancia

Magnetica (RM) de gran resolucion de contraste que permite hacer estudios funcionales.

Aquı se resumen las caracterısticas de los tipos de imagenes medicas mas importantes.

5.2 Tipos de Imagenes Medicas

Existen dos tipos de imagenes medicas: las que se obtienen por proyeccion y por reconstruc-

cion. Las primeras surgen de la obtencion directa de la interaccion entre radiacion y tejido.

En este tipo esta la radiologıa convencional y digital, la medicina nuclear y los ultrasonidos

(US). Las segundas son una extension de las primeras mediante diferentes proyecciones y su

posterior recontruccion. A este grupo pertenece la TAC, SPECT y PET, MR e imagenes en

3D. Aunque SPECT y PET tambien son imagenes de medicina nuclear [2].

5.2.1 Imagenes de Radiografıa

Los rayos X fueron descubiertos por Rontgen en 1895 cuando experimentaba con gases. Para

producirlos se necesita un catodo y un anodo con una diferencia de potencial muy alta, en

torno a las decenas de Kvoltios. La naturaleza de los Rayos X es electromagnetica y son

radiaciones ionizantes, capaces de separar electrones de sus nucleos.

Los rayos X tienen una capacidad de penetracion muy alta, con lo que la capacidad de

resolucion de las radiografıas no es muy buena, en comparaion con otros metodos. Para

obtener la imagen de un objeto se interpone este entre emisor y detector. Al detector llegara

1Premio Nobel de fısica en 19012Premio Nobel de Medicina a Cormack y Hounsfield en 1979

Page 149: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.2. Tipos de Imagenes Medicas 145

distinta intensidad en funcion de por donde haya pasado la radiacion, de tal manera que

la imagen formada es una imagen con diferentes tonos de grises, negro para las zonas mas

radiadas y blanco para las menos. Los estudios en torno a este tipo de imagen estan enfocados

a reducir la radiacion para el paciente y mejorar la calidad, en general el contraste, de la

imagen.

Los problemas tıpicos en la formacion de la imagen de radiografıa es la dispersion y errores

en la proyeccion. La dispersion ocurre cuando los rayos atraviesan un objeto perdiendo

concentracion de energıa. Las maneras de evitarlo son utilizando colimadores, parrillas

antidifusoras o bien separando el objeto del detector ya que los rayos que sufren difusion

han sido mas atenuados y afectaran menos. Los problemas de proyeccion pueden ser de tres

tipos: (a) si la fuente no es puntual los contornos del objeto aparecen difuminados, (b) si

el haz no es perpendicular al detector habra una deformacion en la imagen y (c) si hay dos

objetos separados que no estan en el centro del haz entonces puede que sus dos proyecciones

se solapen. Esto se muestra en la figura 5.1.

Figura 5.1: Tipos de errores de proyeccion.

La figura 5.2 muestras un posible sistema de rayos x para la formacion de radiografıas:

Este tipo de imagen constituye el 80% del volumen de imagenes medicas actual, aunque

cada vez mas se tiende a su digitalizacion.

Para obtener radiografıas digitales se pueden digitalizar con un escaner, serıa un obtencion

indirecta. Una forma directa es irradiar sobre una placa luminiscente (fluorobromo de bario)

capaz de almacenar la informacion y despues leer la informacion mediante un laser He-Ne

rojo de 633nm. A este ultimo metodo se le llama radiografıa digital por luminiscencia. Una

Page 150: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

146 Capıtulo 5. Imagenes Medicas

Figura 5.2: Sistema de rayos X.

ventaja, aparte de ser un metodo mas directo, es que con un 10% de la radiacion anterior se

obtiene la misma calidad, y esto es una ventaja muy a tener en cuenta. La desventaja es que

la adquisicion es mas lenta, entorno a 2 o 3 veces menor. Una tercera forma es obtener la

imagen mediante vıdeo con un CCD sensible a los rayos X puesto en el lugar de las placas.

a b

Figura 5.3: Ejemplos de Radiografıas. a. Cuello. b. Pelvis.

Dado que la capacidad de penetracion de los rayos X en el tejido es muy grande se utilizan

sustancias radioopacas inyectadas en la zona que se quiere resaltar, esto es la angiografia. La

imagen se forma mediante sustraccion de dos imagenes, la imagen con la sustancia radioopaca

y la imagen sin ella. En el ejemplo de la figura 5.4 se puede ver como los vasos sanguıneos,

de color blanco, se pueden ver mucho mas claro que con una radiografıa convencional.

Page 151: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.2. Tipos de Imagenes Medicas 147

Figura 5.4: Ejemplo de angiografıa.

5.2.2 Imagenes por Ultrasonidos

Los avances tecnologicos con US comenzaron a desarrollarse seriamente en los anos 50 a

raiz de las investigaciones militares de la II Guerra Mundial. Su aplicacion para fines mas

pacıficos, la medicina, supuso la aparicion de sistemas de diagnostico muy versatiles, baratos

y portables. Actualmente las maquinas con esta tecnologıa tienen tamanos muy reducidos

y se aplican en numerosos campos como el diagnostico cardiologico, en ginecologıa, en cura

de lesiones y cada vez mas en cirugıa.

Los US son ondas acusticas que estan por encima de espectro audible, por encima de

20 khz. En medicina van desde 1 a 20 Mhz. Las ondas acusticas son ondas de presion que

deforman el medio en funcion de su elasticidad, o mas bien son esta deformacion. Evidente-

mente en el vacıo no se pueden propagar. Se propagan muy bien los lıquidos y se refleja en

las estructuras en funcion de su densidad. La imagen de US se forma a partir de los ecos,

de ahı su nombre de ecografıa, recibidos al chocar contra un objeto. La formacion se basa

en tres principios:

• La amplitud de las ondas recibidas depende de la densidad del objeto contra el que ha

chocado la onda.

• Sabiendo la velocidad de propagacion de las ondas en el medio se puede conocer la

distancia a la que se encuentra el obstaculo.

Page 152: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

148 Capıtulo 5. Imagenes Medicas

• La variacion en frecuencia de la onda recibida depende de la velocidad a la que se este

moviendo el objeto (efecto Doppler).

Las imagenes resultantes tienen una resoluciones y definiciones muy bajas que no pueden

competir con otras tecnicas como las TAC. Pero tienen las ventajas de aportar informacion

funcional, cosa que no se puede obtener con TAC, ademas se pueden implementar en equipos

portatiles y baratos, muy utiles para zonas rurales. Ejemplos de ecografıas se pueden ver en

la figura 5.5.

a b

Figura 5.5: Ejemplos de Ecografıas. a. Embarazo. b. Quiste en un ovario.

5.2.3 Tomografıa Axial Computerizada

La TAC fue descrita y puesta en practica por el Dr. Godfrey Hounsfield en 1972, quien

advirtio que los rayos X que pasaban a traves del cuerpo humano contenıan informacion

de todos los constituyentes del cuerpo en el camino del haz de rayos, que, a pesar de estar

presente, no se recogıa en el estudio convencional con placas radiograficas, debido a su

facilidad de penetracion.

El problema que tienen las radiografıas es que los rayos X tienen un gran capacidad de

penetracion, con lo que se pierde capacidad para diferenciar objetos, sobre todo cuando estos

son tejidos blandos. El TAC se basa en la reconstruccion de la informacion radiologica en

varios planos de radiacion, alrededor del paciente, en forma de secciones o rodajas, con lo

que se puede obtener una reconstruccion volumetrica con mucho mayor contraste.

Un sistema TAC consta de una fuente de rayos X colimada con un haz muy fino que

permite espesores de solo unos pocos milımetros. Un detector de radiacion sensible a la

energıa recibida. El sistema mecanico que permita manejar y sincronizar todo esto y el

sistema reconstructor que permita reconstruir la imagen a patir de las proyecciones.

Page 153: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.2. Tipos de Imagenes Medicas 149

Figura 5.6: Proyecciones y barrido en la reconstruccion Tomografica.

La interseccion de las proyecciones dan como resultado pequenas regiones llamadas voxels,

figura 5.7.

Figura 5.7: Formacion de voxels en TAC.

El valor de cada una se puede hallar mediante la combinacion lineal mediada de to-

das las proyecciones con sistema de ecuaciones matricial o bien directamente mediante la

Transformada de Fourier

TAC Mediante Metodo Algebraico

Suponiendo que se tienen 3 proyecciones, una horizontal, una vertical y otra diagonal segun

muestra la figura 5.8.

Se comienza con los valores a cero de la figura 5.9 (a) y se obtienen los valores de (b)

despues de la recontruccion vertical segun:

Page 154: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

150 Capıtulo 5. Imagenes Medicas

Figura 5.8: Ejemplo de reconstruccion Tomografica.

f 11 = f 13 = 0 + 11−02

= 5.5; f 12 = f 14 = 0 + 9−02

= 4.5 (5.1)

a b

Figura 5.9: Reconstruccion tomografica. a. Inicializacion. b. Valores despues de la rescon-struccion vertical.

Lo mismo con la proyeccion horizontal, figura 5.10 (a), y diagonal (b).

horizontal

{

f 11 = 5.5 + 12−102

= 6.5; f 12 = 4.5 + 12−102

= 5.5f 13 = 5.5 + 8−10

2= 4.5; f 14 = 4.5 + 8−10

2= 3.5

(5.2)

diagonal

{

f 11 = 6.5 + 7−102

= 5; f 12 = 5.5 + 13−102

= 7f 13 = 4.5 + 13−10

2= 6; f 14 = 3.5 + 7−10

2= 2

(5.3)

A pesar de ser un metodo muy sencillo el tiempo de calculo es muy elevado, ademas es

posible que no se alcance la convegencia en caso de que halla ruido.

Page 155: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.2. Tipos de Imagenes Medicas 151

a b

Figura 5.10: Reconstruccion tomografica. a.Valores despues de la resconstruccion horizontal.b. y diagonal.

TAC Mediante Transformada de Fourier

Por resumir, esta tecnica consiste realizar las transformadas de Fourier de las proyecciones

y realizar una composicion teniendo en cuenta que estas coinciden con cada eje, segun la

orientacion, de la transformada de Fourier de la tomografıa. De otra manera, si se realizara

la TF de la tomografıa que se quiere obtener, se encuentra que cada eje que se tome en una

determinada orientacion coincide con la TF de cada proyeccion, representado en la figura

5.11 El inconveniente de esta tecnica es que tambien es muy lenta de calcular, con lo que se

emplean otras como la retroproyeccion filtrada.

Figura 5.11: Metodo de reconstruccion Tomografica mediante Transformadas de Fourier.

Page 156: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

152 Capıtulo 5. Imagenes Medicas

El sistema TAC es uno de los primeros en lograr imagenes en 3D con una alta resolucion

espacial y de contraste. Aunque posteriormente fue mejorado por la resonancia magnetica.

Como la mayorıa de los metodos los nuevos avances y mejoras han perfeccionando la tecnica

TAC pasando de la 1 generacion con imagenes de 80x80 y 4.5 min. de exploracion a la 5

generacion con imagenes de 1000x1000 con tiempos de centesimas de segundo.

a b

Figura 5.12: Tomografıa Axial Computerizada. a. Equipo medico de TAC. b. Imagen deun paciente con ictus cerebral.

5.2.4 Medicina Nuclear

La medicina nuclear se basa en la utilizacion de isotopos radioactivos para formacion de

imagenes. Estos radioisotopos son inyectados en el tejido celular difundiendose por las

cavidades mediente flujos, sobre todo por el torrente sanguıneo, y cuya actividad se puede

detectar desde el exterior. La peculiaridadd de estas imagenes es que aportan una informa-

cion funcional del organismo, cosa que no pueden hacer otros tipos como CT o Radiografıa.

Ademas si se combinan diferentes tomas con distintos angulos se puede tener una reconstruc-

cion tridimensional. Por contra la capacidad de contraste y resolucion de estas imagenes es

escasa. Los avances con aceleradores de partıculas ha permitido que esta tecnica haya tenido

un gran desarrollo.

La radiacion que obtiene desde el exterior es la γ dado que ni la α ni la β llegan al

exterior. El detector se compone de un cristal de centelleo junto con un tubo fotomultipli-

cador. Los radioisotopos son compuestos quımicos, pero normalmente se administran como

radiofarmacos, moleculas que actuan en una determinada funcion u organo. Deben tener

un tiempo de vida corto a fin de irradiar lo menos posible al paciente. Normalmente se

introducen mediante una inyeccion pero tambien se puede hacer mediante inhalacion, vıa

Page 157: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.2. Tipos de Imagenes Medicas 153

oral, etc. En la actualidad, la deteccion de la radiacion se realiza en la llamada camara de

Anger o gammacamara. A partir de varias orientaciones se puede hacer una reconstruccion

tomografica. Estas son la SPECT y PET.

Los cristales de centelleo son de yoduro sodico activados con talio, sensibles a la radiacion

gamma y muy caros. En ocasiones se suele anteponer al cristal un colimador o rejilla para

eliminar las radiaciones en las direcciones no deseadas.

Figura 5.13: Ejemplo de una imagen de MN que muestra una atrofia renal.

Tomografıa por Emision de Positrones Unicos (SPECT)

La tomografıa axial computerizada (TAC) introdujo grandes avances en la exploraciones

medicas y tambien en medicina nuclear. Supuso el paso de 2 a 3 dimensiones. Al igual que

las TAC, las SPECT analiza la radiacion entorno a una circunferencia exterior al cuerpo

a analizar mediante detectores colimados. La diferencia es que con TAC se irradia y con

SPECT la radiacion viene del interior, de los radioisotopos. Por contra con SPECT no se

consigue la misma nitidez en las imagenes como con TAC. Para obtener la imagen tomo-

grafica se utiliza una gammacamara rotatoria que proporciona datos cualitativos e incluso

cuantitativos.

Si se toman distintos planos, se puede construir una representacion 3D lo que permite

realizar los cortes dentro del cuerpo con la orientacion que se quiera. La reconstrucion de

las proyecciones se consigue mediante calculos matriciales al igual que las TAC.

Tomografıa por Emision de Positrones (PET)

Constituye la parte mas reciente de la medicina nuclear, se forma a partir de emisores de

positrones, es decir, radiaciones β. Las radiaciones beta tienen un tiempo de vida corto, se

propagan hasta encontrarse con un electron, entonces se aniquilan y se producen dos fotones

que se alejan en sentidos contrarios; si el radioisotopo emite otro par de fotones entonces la

Page 158: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

154 Capıtulo 5. Imagenes Medicas

Figura 5.14: Reconstruccion 3D a partir de la cual se puede obtener cualquier corte.

posicion del positron esta en esa misma lınea. Al igual que en TAC y SPECT la deteccion

se produce a lo largo de una circunferencia que rodea el cuerpo de analisis.

Los sitemas PET son extremadamente caros pero son de interes para el estudio metabolico

de tejidos y organos, como por ejemplor, el matabolismo de la glucosa cerebral, el metabolis-

mo del oxıgeno o procesos miocardicos.

a b

Figura 5.15: Equipo PET. a. Anillo detector PET donde se dectectan coincidencias defotones. b. Imagen PET que indica una malignidad, la actividad cerebral, cardiaca, renal yvesical son fisiologicas.

Page 159: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.2. Tipos de Imagenes Medicas 155

5.2.5 Resonancia Magnetica

La RM es un metodo de diagnostico que ha resultado ser de gran utilidad en la medicina

desde su introduccion en 1976. La RM se basa en la capacidad de algunos nucleos para

absorber ondas de radiofrecuencia cuando son sometidos al efecto de un campo magnetico.

Dicha capacidad genera una senal que es detectada por un receptor y tratada en un ordenador

de manera similar a como lo hace la TAC para producir imagenes.

Respecto a otras tecnicas como los rayos X y la TAC, se usa cada vez mas por sus

mejores prestaciones, como permitir cortes mas finos, y en varios planos, ser mas sensible

para demostrar accidentes vasculares cerebrales, tumores y otras patologıas, y no utilizar

radiaciones ionizantes. Como desventajas cabe mencionar su mayor coste, el prolongado

tiempo para obtener las imagenes y el tener que excluir a portadores de marcapasos y otros

objetos extranos intracorporeos.

La RM se basa en el hecho de que por debajo de los 60 Mhz hay una ventana de radiofre-

cuencia que produce fenomenos de resonancia en los tejidos, en concreto con los nucleos de

hidrogeno de las moleculas de agua, dando informacion de la densidad de atomos. Ademas,

el spin de estos tambien podra proporcionar informacion fisiologica de los tejidos. Las bases

de este fenomeno fueron sentadas en 1946 por Felix Bloch y Edward M. Purcell3. En 1972

Damadiam probo que los tejidos cancerosos tenıan diferentes comportamientos de resonancia.

La aplicacion era inmediata. Se aplicaron los mismos metodos de reconstrucion propuestos

por Lautebur en las TAC. A partir de aquı el desarrollo fue espectacular hasta ser uno de

los pilares fundamentales de la imagen medica. Los fundamentos fısicos son:

• Se orientan los atomos que se van a analizar, normalmente de hidrogeno, en direccion

de un campo magnetico.

• Se les aplica un campo electromagnetico a su frecuencia de resonancia para cambiar

su momento magnetico.

• Cuando el impulso de radiofrecuencia cesa el momento magnetico vuelve a su posicion

inicial liberando energıa electromagnetica que se puede captar desde el exterior con un

detector o antena.

• Los datos obtenidos se procesan para formar la imagen de resonancia en niveles de

grises en funcion de la energıa captada de cada region.

Tambien son de interes los nucleos C13, F 19, P 31 y Na23, que son tambien susceptibles de

magnetizacion. Pero es el H el mas utilizado por ser el mas abundante el cuerpo humano y

3Premiados con el Nobel en 1952

Page 160: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

156 Capıtulo 5. Imagenes Medicas

por el mas facil de tratar magneticamente. El tipo de tejido viene marcado por los tiempos

de respuesta de los protones. Teniendo en cuenta todos estos parametros se puede llegar a

obtener una imagen capaz de distinguir tejidos blandos con un gran contraste, como puede

ser sangre y grasa, ademas con una resolucion espacial muy buena.

Evidentemente esta tecnica tambien tiene sus inconvenientes, y es que las maquinas

necesarias son muy aparatosas, grandes y costosas. Ademas, dado el gran numero de calculos

que requiere la formacion de las imagnes supone que el proceso sea muy lento e incomodo

para el paciente.

En la formacion de las imagenes se pueden utilizar tres metodos: excitacion local (por

puntos, lıneas o planos), por retroproyeccion filtrada o mediante transformadas de Fourier

(igual que en TAC).

a b

Figura 5.16: Resonancia Magnetica. a. Equipo medico de RM. b. Imagen obtenida conplano sagital de cabeza.

5.2.6 Resumen de Caraterısticas

La tabla 5.1 resume las principales caracterısticas de los tipos de imagenes medicas aquı

contadas.

5.3 Compresion de Imagenes Medicas con JPEG2000

Segun todo lo expuesto anteriormente sobre las imagenes medicas es evidente la necesidad

de desarrollar algoritmos de todo tipo para facilitar el uso de las misma. Algoritmos que

van desde el realce, segmentacion, filtrado, analisis frecuencial, depuracion y eliminacion de

ruido, visualizacion... hasta el almacenamiento. Y es en este punto, el almacenamiento,

donde las tecnicas de compresion de imagen juegan un papel fundamental,[28].

Page 161: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.3. Compresion de Imagenes Medicas con JPEG2000 157

TAC MR US MN RayosX (D) RayosX (A)

Pixel/Imagen (256− 512)2 5122 5122 1282 10002 20002

bpp 12 12 8 8 12 14Resolucion espacial media alta media baja alta altaResolucion contraste alta alta baja baja alta baja

Radiacion media ninguna ninguna media baja mediaCoste alto alto medio medio medio bajo

Funcion fisiologica no alguna no si no noPortabilidad no no si si no si

Tabla 5.1: Parametros de calidad en imagenes medicas.

El problema que surge con las imagenes medicas es que, en general, aceptan pocas

perdidas, dicho de otro modo; para realizar un buen diagnostico a partir de las mismas

se necesita que tengan buena calidad sobre todo en las zonas claves donde se encuentra la

patologıa. Cuando se dice buena calidad en realidad se quiere decir muy buena, de ahı que

los metodos mas extendidos para comprimir imagenes medicas sean metodos sin perdidas.

Segun esto, el estandar JPEG2000 tiene dos caracterısticas de compresion que pueden

resultar muy utiles, estas son: la opcion de compresion sin perdidas y las Regiones de

Interes. Si bien es verdad que, aunque JPEG2000 sin perdidas obtiene tasas algo menores,

aporta una vision mas flexible que otros metodos sin perdidas que por lo general suelen ser

muy poco flexibles. Por otro lado es interesante la capacidad de proporcionar calidades de

compresion locales aun con perdidas, es decir, diferentes en funcion de la region de imagen.

Esto permite alcanzar tasas muy altas de compresion con calidades muy buenas solo en las

regiones interesantes, las que muestren la patologıa asociada. A continuacion se presentan

ejemplos de estas dos caracterısticas. Todas las imagenes tienen 8 bpp que, aunque no

es suficiente en algunos tipos para hacer un buen diagnostico, algunas tienen mas de 12

bpp, si es suficiente para comparar tasas de compresion. Las imagenes medicas han sido

proporcionadas por el Hospital General Universitario Gregorio Maranon.

5.3.1 Compresion Sin Perdidas

En compresion de imagenes medicas es fundamental que el proceso sea sin perdidas o que

estas sean muy pocas, ya que estan en juego las vidas de los pacientes, ya sean humanos o

animales. El problema de no tener perdias es que la compresion que se obtiene es mucho

menor y eso supone un grave problema cuando el volumen de informacion es muy grande,

como es el caso de las imagenes medicas. Dependiendo de la aplicacion la imagen aceptara

mas o menos perdidas. Por ejemplo son mas aceptables perdidas en PET, donde la calidad

Page 162: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

158 Capıtulo 5. Imagenes Medicas

ya de por sı es muy baja, que para una resonancia magnetica, donde prima la calidad.

Las siguientes imagenes muestran ejemplos de compresion sin perdidas obtenidas con

J2MT con el filtro entero (5,3) y con los parametros por defecto del JPEG2000. Se presentan

las originales, que son iguales que las comprimidas por ser sin perdidas, y ademas el espacio

transformado a su lado.

a b

Figura 5.17: Compresion de una CT de 512x512 a 1.6584 bpp (4.82:1).

a b

Figura 5.18: Compresion de una PET de 256x256 a 1.7748 bpp (4.51:1).

En el campo de la medicina los principales algoritmos de compresion sin perdidas, algunos

ya mencionados anteriormente, que se han propuesto para imagenes con niveles de gris son:

CALIC (Context Based, Adaptive, Lossles Image Codec), CPM (Central Prediction Method),

TMW, BTPC (Binary Tree Predictive Coding), PNG (Portable Network Graphics), SPIHT

(Set Partitioning in Hierarchical Trees), LOCO-I (Low Complexity Lossless Compression

for Images), FELICS (Fast, Efficient, Lossless Image Compression System), CLIC(Context

Page 163: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.3. Compresion de Imagenes Medicas con JPEG2000 159

a b

Figura 5.19: Compresion de una radiografıa de 2550x2100 a 2.7703 bpp (2.89:1).

a b

Figura 5.20: Compresion de una RM de 512x512 a 4.2844 bpp (1.87:1).

Page 164: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

160 Capıtulo 5. Imagenes Medicas

based Lossless Image Compression), GIF (Graphics Interchange Format), TIFF (Tagged

Image File Format) y JPEG-LS. Ver [20]. Las principales tecnicas de estos algoritmos son la

codificacion predictiva adaptativa, Lempel-Ziv, descomposicion piramidal, transformaciones

o codificacion aritmetica. Los metodos que mejores tasas consiguen de los anteriormente

citados son TMW, CALIC, SPIHT y JPEG-LS. Estos proporcional tasas para imagenes

medicas similares que van desde 2:1 hasta 5:1, dependiendo del tipo de imagen. Notar

tambien que aunque algunos de los anteriores de tasas similares, como es el caso de GIF,

solo es capaz de procesar imagenes de 8 bpp, totalmente insuficiente para CT o RM que

utilizan 12 bpp. En la tabla 5.2 se incluye la relacion de tasas de compresion sin perdidas

de alguno de ellos para las anteriores imagenes.

(x : 1) JPEG2000 JPEG-LS CALIC SPIHT PNG

CT 4.82 6.03 6.32 3.68 3.29PET 4.51 4.41 4.35 3.82 1.74

RADIOGRAFIA 2.89 2.91 2.23 2.74 1.76RM 1.87 1.85 1.96 1.85 1.39

Tabla 5.2: Tasas de compresion sin perdidas con diferentes algoritmos.

A tenor de los datos de la tabla 5.2 se puede ver que JPEG2000 sin perdidas es capaz de

competir contra los algoritmos sin perdidas mas eficientes. Si bien sus tasas no son igual de

altas en todos los casos, sı que proporciona tasas muy altas y en algunos casos por encima

de las demas.

5.3.2 Compresion Con Perdidas y ROI

La compresion con perdidas en el caso de imagenes medicas es, en muchos casos, inviable da-

da la calidad necesaria en el diagnostico, como el caso de CT o RM, que tienen resoluciones

espaciales y de contraste muy altas. El problema viene con el coste asociado al almace-

namiento, la capacidad de memoria, que aunque se han ido abaratando mucho en estos

ultimos anos, siguen siendo una pieza clave en los sistemas. Otro inconveniente es el tiempo

de acceso y procesamiento que evidentemente aumenta con el tamano de las imagenes.

Un aspecto a tener en cuenta es el de asumir perdidas bajo ciertas condiciones. En el

caso de utilizar metodos perceptuales se pueden asumir ciertas perdidas si no son preceptual-

mente visibles. En el caso de imagenes medicas se puede establecer una condicion adicional:

solo ciertas regiones de la imagen son necesarias para el diagnostico. Bajo esta suposicion

la ganacia de compresion puede aumentar drasticamente si se codifican las regiones de di-

agnostico con una buena calidad y el resto con otra no tan buena, esto es, utilizar Regiones

de Interes.

Page 165: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.3. Compresion de Imagenes Medicas con JPEG2000 161

a b

Figura 5.21: Compresion de las imagenes de las figuras 5.17 y 5.20 con una calidad muybuena (perdidas inapreciables) a 0.5 bpp (16:1). 512. a Sin pedidas 3.37 bpp (2.73:1). bCon perdidas y ROI 0.2 bpp (41:1).

a b

Figura 5.22: Compresion de una RM de 256x256 con un tumor en la cabeza. a Sin pedidas3.37 bpp (2.73:1). b Con perdidas y ROI 0.2 bpp (41:1).

Page 166: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

162 Capıtulo 5. Imagenes Medicas

a b

Figura 5.23: Compresion de una CT de 512x512 con un tumor en la rodilla. a Sin pedidas2.1127 bpp (3.79:1). b Con perdidas y ROI 0.1 bpp (80:1).

Los inconvenientes que pueden surgir del uso de estas ROI son que se elijan mal las

regiones y se pierda informacion util para el diagnostico. Por ejemplo si la region que

engloba a la patologıa es muy pequena se puede perder la localizacion de la misma. Aunque

estos aspectos tecnicos son mas bien externos al metodo y mas achacables al usuario.

Page 167: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

5.3. Compresion de Imagenes Medicas con JPEG2000 163

Page 168: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

164 Capıtulo 5. Imagenes Medicas

Page 169: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 6

Conclusiones

Ahora mis manos amargas llevan cristales rotos. Quefue de todo aquello. Todos lo dibujos estan lavadoscon negro, todo esta tatuado. Todo el amor vuelve,cambiando mi mundo en negro. Tatuado todo lo queveo, todo lo que tengo, todo lo que necesito. Se algo,tu tienes una vida bonita y se que seras una estrella.Alguien mas comprende porque... porque no puede sermıo. Estamos juntos.

Eddie Vedder, Black (Pearl Jam).

Con la aparicion en los ultimos anos de nuevos servicios TIC surgen nuevos problemas

asociados a estos servicios, como es el aumento del volumen de informacion que se maneja,

del que en gran parte son responsables las imagenes digitales.

La lınea abierta por los metodos perceptuales en la compresion de imagenes consigue

mejorar las tasas obtenidas hasta ahora con metodos mas tradicionales, como los metodos

estadısticos y transformadas. Sin embargo, aunque muchos de estos metodos ya se usan en

la practica como la correccion gamma o el enmascaramiento, los mas complejos se encuen-

tran todavıa por madurar debido en al conocimiento parcial que se tiene del SVH y a la

complejidad de su simulacion.

Por otro lado en este proyecto se ha conseguido desarrollar un metodo de compresion sin

perdidas, que para unos determinados tipos de imagenes como son las retinianas, consigue

tasas de compresion mejores que las que proporcionan los mejores algoritmos de compre-

sion sin perdidas. Las caracterısticas principales del metodo es la busqueda de cadenas,

la codificacion DPCM y la codificacion aritmetica. Pero este metodo puede ser aplicado a

otros campos del tratamiento de imagenes (realce de imagenes, representacion de contornos,

huellas dactilares...). Entre las cuestiones a mejorar esta sobre todo la programacion en C

165

Page 170: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

166 Capıtulo 6. Conclusiones

de todo el codificador para reducir el tiempo del calculo.

El nuevo estandar JPEG2000 aporta metodos mas eficientes y mas flexibles que mejoren

tanto el almacenamiento de imagenes digitales como la comunicacion. Para ello utiliza

las nuevas herramientas de compresion desarrolladas en los ultimos anos donde son clave

el uso de Wavelets, la codificacion Aritmetica y el modelado de los nuevos conocimientos

sobre el SVH. La herramienta grafica J2MT se revela como un entorno muy util para la

comprension del JPEG2000 de una manera rapida e intuitiva, dado que las actuales versiones

del compresor implican un manejo tedioso, practicamente inmanejable. El objetivo principal

de la herramienta J2MT es dar una vision bastante completa de las caracterısticas del nuevo

estandar de compresion, sobre todo enfocado a un entorno academico con una base sobre el

tratamiento de imagenes.

En la evaluacion de la compresion de imagenes medicas el JPEG2000 muestra su gran

eficiencia con tasas muy competitivas en compresion sin perdidas y artefactos muy poco

visibles en el caso sin perdidas. Un aspecto adicional a tener en cuenta que aporta el nuevo

estandar es la compresion con regiones de interes, que puede resultar de gran utilizadad en

imagenes medicas para preservar con buena calidad solo aquellas zonas de la imagen que

contienen la patologıa.

Page 171: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

167

Page 172: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

168 Capıtulo 6. Conclusiones

Page 173: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Bibliografıa

[1] J. Askelof, M. Larsson, and C. Christopoulos. Region of interest coding in jpeg 2000.

Signal Processing: image communication, 17:105–111, 2002.

[2] R. Barea-Navarro. Fundamentos de Bioingenierıa. Departamento de Electronica, (Univ.

de Alcala).

[3] R.C. Calderbank, I. Daubechies, W. Sweldens, and B.-L Yeo. Wavelet transforms that

map integers to integers. Appl. Comput. Harmon, 5(3):332–369, 1998.

[4] C.K. Chui. An introduction to wavelets. Academic Press, Boston, MA, 1992.

[5] G. Cristobal, J. Cuesta, and L. Cohen. Image filtering and denoising through the scale

transform. In IEEE Symp. Time-Frequency Time-Scale Analysis, pages 617–620, 1998.

[6] S. Daly, W. Zeng, J. Li, and S Lei. Visual masking in wavelet compression for jpeg2000.

Technical report, Sharp Laboratories and Microsoft, 2000.

[7] I. Daubechies. Ten lectures on wavelets. SIAM, Philadelphia, PA, 1992.

[8] I. Daubechies and W. Sweldens. Factoring wavelet transforms into lifting steps. J.

Fourier Appl., 4(3):247–269, 1998.

[9] S. Fischer. Modelos perceptuales en la cuantificacion y codificacion de imagenes. Mas-

ter’s thesis, ETSI de Telecomunicacion, 2000.

[10] P. Glor Howard. The desing and analysis of efficient lossless data compression system.

Technical Report CS-93-28, Department of Computer Science (Brown University), 1993.

[11] M. Guazzo. A general minimun-redundancy source-coding algorithm. IEEE Trans.

Inform. Theory, 2:15–25, 1980.

[12] D. Hankerson, G.A. Harris, and P.D. Johnson. Information Theory and Data Compres-

sion. CRC Press, Boca Raton(Boston), New York, Washington (DC) London, 1998.

169

Page 174: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

170 BIBLIOGRAFIA

[13] D.A. Huffman. A method for the construction of minimum redundancy codes. Proceed-

ings of the Institute of Radio Engineers, 40, 1952.

[14] JPEG. Information technology-jpeg2000 image coding system. Technical Report 15444-

1, ITU Recommendation T.800, ISO/IEC International Standard, 2000.

[15] J.H. Kasner, M.W. Marcellin, and B.R. Hunt. Universal trellis coded quantization.

IEEE Transactions on Image Processing, 1995.

[16] M. Keil, G. Cristobal, H. du Buf, B. Escalante, and L. Pessoa. AMOVIP: Advanced

modeling of visual information processing. In Proc. Int. Conf. on Image Analysis and

Processing, pages 1208–1213, 1999.

[17] M. Keil, G. Cristobal, and H.Neumann. A neurodynamical retinal network bared on

reaction-diffusion systems. In ICIAP2001, Palermo, Italy, September 26-28, 2001.

[18] M.S. Keil. Neural Circuits for Early Vision With Application to Brightness Perception

and Image Processing. PhD thesis, University of Ulm, Ulm, Germany, 2002.

[19] B. Kiat. Exploring and Utilising Features in Natural Images. PhD thesis, University of

Western Australia, Australia, 1994.

[20] J. Kivijarvi, T. Ojala, T. Kaukoranta, A. Kuba, L.Nyul, and O.Nevalainen. A compar-

ison of lossless compresion methods for medical images. Computerized Medical Imaging

and Graphics, 22:323–339, 1998.

[21] Charilaos Christopoulos (Media Lab) and Ericsson Research (Sweden). Jpeg2000 verifi-

cacion model 8.5 (technical description). Technical Report ISO/IEC JTC1/SC29/WG1

N1878 (ITU-T SG8), JPEG (Joint Photographic Expert Group)., 2000.

[22] S. Mallat. A Wavelet Tour of Signal Processing. Academic Press, 1999.

[23] J.M. Menendez Garcıa and Casajus Quiros F.J. Tecnologıas de Audio y Vıdeo. ETSIT

(UPM), Ciudad Universitaria, Madrid, 2000.

[24] A. Moffat, N. Sharman, I. H. Witten, and T.C. Bell. An empirical evaluation of coding

methods for multi-symbol alphabets. Information Processing & Management, 1994.

[25] A.Navarro, R. Tabernero and G. Cristobal. Image representation with Gabor wavelets

and its applications. In Peter H. Hawkes, editor, Advances in Imaging and Electron

Physics, pages 1–84. Academic Press, Boston, MA, 1996. Vol.97.

[26] R. Pasco. Source Coding Algorithms for Fast Data Compression. PhD thesis, Standfor

Univ., 1976.

Page 175: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

BIBLIOGRAFIA 171

[27] J. Portilla, R.Navarro, O.Nestares, and A. Tabernero. Texture synthesis-by-analysis

based on a multiscale early-vision model. Opt. Eng., 35(8):1–15, 1996.

[28] M. Rabbani and P.W. Jones. Image compression techniques for medical diagnosis imag-

ing systems. J. of Digital Imaging, 4(2):65–78, 1991.

[29] Majid Rabbani and Rajan Joshi. An overview of the jpeg2000 still image compression

standard. Technical report, Eastman Kodak Company, 2001.

[30] J. Rissanen and G.G. Langdon. Arithmetic coding. IBM J. Res. Develop., 23(2):149–

162, 1979.

[31] F. Rubin. Arithmetic stream coding using fixed precision registers. IEEE Trans. Inform.

Theory, 25:672–675, 1979.

[32] A. Said and W.A. Pearlman. A new fast and efficient image codec based on set parti-

tioning in hierarchical trees. IEEE Trans. Circuits Syst. Video Technol, 6(3):243–250,

June 1996.

[33] J.M. Shapiro. Embedded image coding using zero trees of wavelet coeficients. IEEE

Trans. Signal Processing, 41(12):3445–3462, 1993.

[34] G. Sullivan. Efficient scalar quantization of exponential and laplacian variables. IEEE

Trans. Inform., 42(5):1365–1374, December 1996.

[35] W. Sweldens. The lifting scheme: A construction of second generation wavelets. Siam

J. Math, 29(2):511–546, 1997.

[36] D. Taubman. High perfomance scalable image compression with ebcot. IEEE Trans.

Image Processing, 9(7):1158–1170, July 2000.

[37] M.J. Weinberger, G. Seroussi, and M. Sapiro. The loco-i lossless image com-

pression algorithm: Principles and standardization into jpeg-ls. Technical Report

MO3CC51C440575288, Hewlett-Packard Laboratories and University of Minnesota,

1998.

[38] H. Witten, R.M. Neal, and Cleary J.G. Arithmetic coding for data compression. Comm.

ACM, 30:520–540, 1987.

[39] J.W. Woods and T.Naveen. A filter based bit allocation scheme for subband compression

of hdtv. IEEE Trans. Image Processing 1 (3), 1(3):436–440, July 1992.

[40] W. Zeng, J. Li, and S. Lei. An efficient color re-indexing scheme for palette-based

compression. In Int. Conf. on Image Processing, 2000.

Page 176: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

172 BIBLIOGRAFIA

Page 177: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Capıtulo 7

Anexos

7.1 Anexo A: Presentacion del J2MT en Genova

ISO/IEC JTC1/SC29/WG1 N2428

March 4, 2002

ISO/IEC JTC1/SC29/WG1

(ITU-T SG8)Coding of Still Pictures

JBIG JPEG

Joint bi-level Image Joint Photographic

Experts Group Experts Group

TITLE : JPEG 2000 Matlab Toolbox (J2MT) Version 1.0SOURCE : Rafael Redondo and Gabriel Cristobal. Instituto de Optica (CSIC)

Serrano 121, 28006 Madrid, Spain

PROJECT : JPEG 2000

STATUS : Software and documentation (ver. 1.0)

REQUESTED

ACTION : To be reviewed at the March 2002 Genoa meeting of WG1

DISTRIBUTION: WG1 web site

Contact:

ISO/IECJTC1/SC29/WG1 Convenor - Dr. Daniel Lee

Hewlett-Packard Company, 1501 Page Mill Road, Palo Alto, CA 94304-1126

173

Page 178: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

174 Capıtulo 7. Anexos

Tel: +1 415 857 3946, Fax: +1 415 857 4691, E-mail: Daniel [email protected]

1. Development of the JPEG 2000 Matlab toolbox

(J2MT)

The requirement for a Verification Model (VM) for JPEG 2000 Compression Standard emerged at theSC29 WG1 meeting in Geneva. The VM will be used by the JPEG 2000 committees as a vehicle for coreexperiments and ultimately will evolve into an implementation of the final JPEG 2000 standard. Thisdocument describes a new software toolbox, which is fully compliant with the VM ANSI C standardsoftware. Through a very intuitive graphical interface (GUI), the user can select the different VMparameters and options, deploying the original image, wavelet pyramid image and reconstructed imageeither in the same GUI canvas or through external windows. The toolbox is primarily intended forresearchers and engineers in the area of signal and image processing.

1.1 Description

This project is an extension of the JPEG 2000 VM and therefore is fully compliant with it. The J2MTprovides a common framework for algorithm development, evaluation and comparison. The software hasbeen implemented in the MATLAB software environment. It attach an interface module to the VM andintroduce several visualization tools. The graphical interface makes it easy to extend functionality withcustom routines, a feature that makes this tool a useful engineering and educational aid. Once the differentparameters and options have been selected, Matlab performs an internal call to the main ANSI C VMprograms: vm compress * and vm expand *. In this way, the execution is faster than porting the C codeto M-files.

1.2 Highlights

1. Fully compliant with VM software.

2. Very intuitive graphical interface. The modification of compression parameters can be accomplishedin a straightforward manner.

i. Pyramidal decomposition is dynamic and straightforward

ii. Mark control protection against errors

3. PGM support via the PNM Matlab toolbox (shareware)

4. Extends JP2 to the list of Matlab image I/O formats.

5. DICOM support through the Image Processing Matlab toolbox

6. Includes VM visual optimization tools according with Part2.

7. ROI rubber band selection with the mouse.

8. Portability between different platforms

9. Help guide to assist the user with the parameter selection

According with the Procedure for Development and Revision of JPEG 2000 Verification Model document:

The VM should be of broad scope and be capable of addressing the large set of requirements of the JPEG2000 compression standard. The VM should be adaptable to change of its structure and should be flexible tointegrating new input and output data [3].

Page 179: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.1. Anexo A: Presentacion del J2MT en Genova 175

Moreover, the main motivation of the current project is to extend and facilitate the use of the current VMsoftware as a Matlab toolbox extension that calls the ANSI C VM programs.

2. Software

The J2MT has been built through the Interactive GUI design interface (GUIDE) that includes severalgraphical editing facilities, i.e. layout editor, menu editor, etc. The J2MT only requires of the Matlab maintoolbox, although other Matlab toolboxes from The Mathworks are advisable. In particular the ImageProcessing and Signal processing toolboxes. One of the advantages of the Matlab environment is itsplatform interoperability. That means that Matlab applications are fully transportable between platformswithout modifications. Matlab data files (MAT-files) from different environments are convertedautomatically.

2.1 Prerequisites

2.1.1 VM software.

2.1.2 We used the Verification Model version 8.5 (VM8.5) [1]. The verificationModel 8.5 has been compiled in a Sun workstation with Solaris 2.6, using theGNU gcc compiler. It has been compiled also in a Pentium III computer withthe Cygwin1 gcc compiler.

2.1.3 Matlab2

We tested the toolbox on versions 6.0 and 6.1. Previous versions have not been tested, but might work aswell.

2.1.4 PNM toolbox3

The PNM Matlab toolbox is a collection of Matlab programs that provide support to the following imageformats:

1. PPM (portable pixelmap), PGM (portable graymap), PBM (portable bitmap)

2. RAS (Sun raster images)

3. Silicon Graphics images (SGI, RGBA, RGB, and BW files)

4. Support for 16-bit raw (binary) PPM/PGM/PBM images

5. XBM (X11 bitmap) image files.

Several conversion utilities support the format PNM file format. Most notably, we can cite XV4, andGIMP5 for UNIX and PaintShop Pro6 for Windows

1http://www.cygwin.com2http://www.mathworks.com3http://home.online.no/ pjacklam/matlab/software/pnm/4http://www.trilon.com/xv5http://www.gimp.org6http://www.jasc.com

Page 180: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

176 Capıtulo 7. Anexos

2.2 Computer platforms

2.2.1 Unix/Linux platform

All programs were developped using Sun Sparc Solaris 2.6 and GNU C. The programs should compile andwork with all recent versions of Unix-based Matlab supported platforms, notably HP9000/700 HP-UX,IBM RS/6000 AIX, Compaq Alpha Tru64, SGI IRIX/IRIX64 and Linux.

2.2.2 Win32 platform

The programs were ported to the Windows platform using the Cygwin7 environment. The programs shouldcompile and work with the following platforms: Windows 2000, NT, Me, 98 and 95. For the mostup-to-date information about the Windows XP support see the MathWorks web site.

3. Usage

To startup MATLAB on a UNIX machine, just entermatlab

on the workstation console, or double click the Matlab icon on a PC.To startup J2MT, enterj2mtFor entering the parameters in the window boxes it’s necessary to type the key Enter after typing the valueintroduced.

NetPBM is responsible for image I/O as in the VM. The transformed image can be saved in the J2Pformat (see Section 4.1 Menu options). One can convert to other formats using the internal Matlabfunction or to get and intall the NetPBM library8.

4. Description

The J2MT consists of four parts a menu and 3 sections (see Fig. 1).

1. Menu section: It includes the I/O calls to image loaders and viewers and a help guide

2. Section 1: Image visualization area

3. Section 2: Parameter selection area

4. Section 3: Control and error computation area.

7http://www.cygwin.com8http://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/

Page 181: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.1. Anexo A: Presentacion del J2MT en Genova 177

Fig. 1. General layout of the J2MT graphical interface

Fig. 2 Main J2MT window showing the wavelet coefficients and the reconstructed image

4.1 Menu

The Menu part of the J2MT consists of two sliding submenus: Image and Help:

1. Image menu

(a) Read image (PGM)

(b) Read image (JP2)

(c) Write image (JP2)

(d) VM path

(e) Process

A. Original image

B. Reconstructed image

C. Transformed image (wavelet coefficients)

D. Error image

(f) Exit

Page 182: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

178 Capıtulo 7. Anexos

2. Help menu

i. Usage

ii. Menus

iii. Wavelet rransform

iv. Codification I

v. Codification II

vi. ROI & Color

vii. Statistics & Rates

3. About

Fig2. J2MT Menu bar

4.2 Section 1: Visualization area

This part consists of three main image canvas areas where the user can visualize the following information,

1. The original image (left) . The size of the image is shown at the bottom of the image. Theoriginal image size is automatically resized to fit the the visualization area (either by downsamplingor by interpolation). The user has the option to visualize the true image size in an external windowusing the Menu option above described.

2. Wavelet transform coefficients/tiling decomposition (middle) . This part presents eitherthe wavelet transform coefficient pyramidal decomposition or the selected tiling decomposition. Asin the previous case, the user has the option to visualize this information in an external window withits true size.

3. Reconstructed image . This part presents the reconstructed image after decoding. As in theprevious cases, the user has the option to visualize this information in an external window with itstrue size.

4.3 Section 2: Parameter selection area9

4.3.1 Section 2.1 Wavelet transform

1. Filter types

(a) Reversible/non-reversible (-Frev)(no)

(b) Standard (9x7,5x3,13x7)/ Others (-FKernels/Fdir)

2. Implementation

(a) Lifting/convolution (-Fconv)(no)

9Note: The corresponding VM flags are indicated between parenthesis using Courier font type for a betterreference. The second field (if appears) corresponds to the default value.

Page 183: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.1. Anexo A: Presentacion del J2MT en Genova 179

3. Decomposition

(a) Levels

i. Type and level depth (-Flev)(5)

ii. Selection os sublevels (-Fgendecomp)(Mallat)

(b) Type

i. Mallat

ii. Spacl

iii. Packet

iv. Others

4. Show (Note: present a preview of the levels and sublevels decomposition).

Fig.3. Section 21 GUI overview

4.3.2 Section 2.2: Codification I

1. Block size

(a) Horizontal coordinate(-Cblk)(64x64)

(b) Vertical coordinate

2. Precint size (-Cpp)

(a) Default (yes/no)

(b) Change precint/size (Noter: selection for each level)

3. Memory/time consumption

(a) Memory report (-mem)(no)

i. Coder (yes/no)

Page 184: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

180 Capıtulo 7. Anexos

ii. Decoder (yes/no)

(b) Time report (-Ccpu)(no)

i. Coder (yes/no)

ii. Decoder (yes/no)

4. Codification options

(a) Codification order (-Corder)(L)

i. LRCP (default)

ii. RLCP

iii. RPCL

iv. PCRL

v. CPRL

(b) Causal coding (yes/no) (-Ccausal)(no)

(c) Parallel coding (yes/no) (-Cparallel)(no)

(d) Simple coding (yes/no) (-Clazy)(no)

(e) Number of layers (-Clayers)(50)

(f) Edge respect (-Cframes)

(g) No truncation (yes/no) (-Cno frame)

5. Error truncation

(a) Segment marker (yes/no) (-Csegmark)

(b) Block protection (yes/no) (-Cer term)

(c) Block header (yes/no) (-Bresync)

(d) Block tail (yes/no) (-Beph)

Fig 4. Section 2.2 GUI overview

Page 185: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.1. Anexo A: Presentacion del J2MT en Genova 181

4.3.3 Section 2.3: Codification II

1. Rate control

(a) Lagrangian rate (yes/no) (-Flra/-Fno lra)(no)

(b) Maximum rate. (-rate)(100 bpp)

(c) Maximum rate tolerance: (-hi rate tol)(0bpp)

(d) Minimum rate tolerance: (-low rate tol)(0.005)

2. Quantization

(a) Scalar generalized (0-4) (yes/no) - Dead zone 2 (-Qnz)(0)

(b) Trellis codification (TCQ) (yes/no) (-Qtcq)

(c) Implicit quantization (yes/no) (-Fimplicit)

(d)

3. Perceptual options

(a) CSF weights (yes/no) (Note: if yes the user is asked to introduce the file name of the CSFweights file) (-Fweights)

(b) Progressive (VIP). (Note: if yes the user is asked to introduce the rate and the file name)(-Cvpw)

(c) Quantization widths (Note: if yes the user is asked to introduce the file name)

(-Fsteps)(no).

(a) Standard mask (yes/no). (-Cvis)(0.5).

(b) Perceptual mask (yes/no) (-Xmask)(0.7 0 1 6 9 1)

i. Pixel weight (alfa) (Note: default=0.7; width mask default=13)

ii. Neighbor weights (beta) (Note: default=0.0; bits= 9)

iii. Respect blocks

iv. Minimum level

4. Others

(a) Guard bits (-Fguard bits) (2)

(b) Offset value: 128 (default) (-Fdc)

Page 186: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

182 Capıtulo 7. Anexos

Fig. 5. Section 2.3 GUI overview

4.3.4 Section 2.4: ROI & Color

1. ROI Selection (-Rrgn)

(a) Square shape

(b) Circle shape

2. ROI Method

(a) Generic (-Rno rect)

(b) Block aligned (-Ralign)

(c) Implicit partition (-Rmax drift)

3. Color transformation (-Mgcc)

(a) Non reversible (YCbCr)

(b) Reversible

4. Others

(a) Guard bits

(b) Offset value

5. Add other options :(Note: this buttom allows to introduce other VM options to the commandline).

Page 187: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.1. Anexo A: Presentacion del J2MT en Genova 183

Fig. 6. Section 2.4 GUI overview

4.4 Section 3: Control and error computation area

This part allows to the user to start the execution of the program, showing the distorsion (in the case oflossy compression) both characterized by the MSE (mean squared error) and the PSNR (peak signal tonoise ratio). The user has the option to visualize in an external window the error image. This also can bedone using the pull-down Image menu described in section 4.1.

Fig. 7. Section 3 GUI area

4.5 Example

Fig. 8 shows an example of a JPEG 2000 compressed image in which the user has interactively selecteddragging with the mouse two ROI’s: one squared shape region around the beak and eye of the bird imageand a second circular shape region around the paw.

Page 188: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

184 Capıtulo 7. Anexos

4.6 Revision history

Version 1.0 (March 5, 2002) Initial release

4.7 Future extensions

We intend to extend the current toolbox by including source code for some watermarking algoritms inorder to evaluate and compare new embedding and detection techniques.

4.8 Acknowledgements

The J2MT is a new extension of the Matlab toolboxes, developed by Rafael Redondo and G. Cristobal,Instituto de Optica (CSIC), Spain. The J2MT results from a research effort conducted under the auspicesof the EU AMOVIP project :Advanced Modeling of Visual Information Processing”, INCO DC 961646.

5. References

[1] JPEG 2000 Verification Model 8.5 (Software), ISO/IEC/JTC1/SC29/WG1 N1880, September 2000.

[2] Christopoulos, C., JPEG 2000 Verification Model 8.5 (Technical Description),ISO/IEC/JTC1/SC29/WG1 N1878, September 2000.

[3] Rabbani, M. and Joshi, R. (2002) “An overview of the JPEG 2000 still image compression standard”(2002) , Signal Processing: Image Communication, 17, pp. 3-48[4] Procedure for Development and Revision of JPEG 2000 Verification Model, Draft Version 1.0,ISO/IEC/JTC1/SC29/WG1 N896, June 1998[5] Askelof, J., Carlander, M.L. and Christopoulos, C. (2002) “Region of interest coding in JPEG 2000”,Signal Processing: Image Communication, 17, pp. 105-111[6] Zeng, W., Daly, S. and Lei, S. (2002), “An overview of the visual optimization tools in JPEG 2000”,Signal Processing: Image Communication, 17, pp. 85-104

Page 189: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.1. Anexo A: Presentacion del J2MT en Genova 185

Page 190: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

186 Capıtulo 7. Anexos

7.2 Anexo B: Lista de los parametros JPEG2000

A continuacion se incluye la lista, en ingles, de los parametros permitidos por el codificador JPEG2000.

The following arguments are recognized:

-i <image file> [<image file> [...]]

Mandatory argument, identifying one or more image files; with one file

for each component. The simple image reader supports binary PGM and

PGX files only. PGX is a trivial monochrome file format defined just

to enable simple testing of JPEG2000 with image data having unusual

bit-depths. The file consists of a single text header line of the form

"PG <byte order> [+|-]<bit-depth> <cols> <rows>", with the binary data

appearing immediately after the newline character, packed into 1, 2 or

4 bytes per sample, depending upon the value of <bit-depth>. The <byte

order> field must be one of the fixed strings, "LM" (LSB’s first) or

"ML" (MSB’s first), while the optional ‘+’ (default) or ‘-’ character

preceding the <bit-depth> field indicates whether the data is signed

or not. Any bit-depth from 1 to 32 is acceptable. Each component can

be specified separately through this command line argument.

Alternatively, the wild card character ‘#’ can be used to allow

replacement with a one-based component index. If the file name

presented to this argument includes the ‘#’ character, that filename

is first checked for existence. If not found, the file names with ‘#’

replacement character ‘1’ to ‘256’ are checked for existence. The

actual replacement characters used as indices can also be controlled

with the ‘-i_subset’ argument. All consequtive component file names

generated with the replacement character list will be used in

compression.

-i_subset <component_subset>

This argument can control the list of replacement characters used for

the ‘#’ character of the filename specified with the ‘-i’ argument.

This list of replacement characters defaults to the range ‘1’ to

‘256’,but this argument can specify individual component indices (as

in ‘-i_subset 2 4 6 8’ or ‘-i_subset r g b’) or an inclusive range of

component indices (as in ‘-i_subset 1:10’).

-i <mcraw image file>

Mandatory argument, identifying a multi-component raw image file. File

extensions that are recognized include ".img", ".nrm", ".bil", ".raw",

".bsq", ".bip".

-rcb <rows cols bands> (*MCRAW INPUT ONLY*)

Mandatory argument with ‘-imcraw’, specifying the number of rows,

cols, and components (or bands) in the image. Enter as three numbers

separated by spaces.

-dt <data type> (default = "short") (*MCRAW INPUT ONLY*)

Optional argument for ‘-imcraw’, specifying the data type of the image

values. Valid inputs are "uchar", "char", "ushort", "short", "ulong",

"long".

-bps <bits per sample> (default = from data type) (*MCRAW INPUT ONLY*)

Optional argument for ‘-imcraw’, specifying the bit depth of the image

values. The input can be a text file or a single number. For text file

input, two columns (bitdepth and is_signed) of info are expected, one

for each component. The text file name must not start with a digit

(0-9). If the input is a single number, then this value is assumed for

all components.

-do <data organization> (default = "bil") (*MCRAW INPUT ONLY*)

Optional argument for ‘-imcraw’, specifying the data organization of

the file. Valid inputs are "bsq", "bil", "bip".

-skip <skip bytes> (default = 0) (*MCRAW INPUT ONLY*)

Optional argument for ‘-imcraw’, specifying the number of header bytes

to skip.

-swap (default = no swapping) (*MCRAW INPUT ONLY*)

Optional argument for ‘-imcraw’, indicating that the byte order of

each sample should be swapped.

-o <name of file for compressed bit-stream>

-rate <max rate in bpp> (default = 100)

-low_rate_tol <lower tolerance to max_rate in bpp> (default = 0.005)

Page 191: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.2. Anexo B: Lista de los parametros JPEG2000 187

-hi_rate_tol <higher tolerance to max_rate in bpp> (default = 0)

-step <normalized base step> (default = 0.0078125)

-iter <num rate-control iterations> (default = 0)

-mem [<stop id>]

Print memory usage report. If the optional ‘stop_id’ parameter is

supplied, the program will halt when allocating memory with the

supplied non-zero identifier. This is the same identifier printed by

the memory report if memory leaks are detected.

-verbose (default = verbose)

-quiet (default = verbose)

-Bresync[+<tnum>] [Y|N]

Insert resync markers on packet boundaries. The optional parameter,

‘Y’ or ‘N’ may be used to explicitly state whether the argument is

turning resync markers on or off, which can be useful when overriding

global settings in specific tiles.

-Beph[+<tnum>] [Y|N]

Insert End-Of-Packet-Head (EPH) markers on packet boundaries. The

optional parameter, ‘Y’ or ‘N’ may be used to explicitly state whether

the argument is turning resync markers on or off, which can be useful

when overriding global settings in specific tiles. Note that the EPH

marker is not currently defined; it is included in the VM because of

its tremendous usefulness (almost to the point of being essential) in

creating codestreams which are easily reorganized; most importantly,

the EPH marker is invaluable in creating codestreams to which packet

packet head (PPT/PPM) markers can be added and manipulated by an

external superficial codestream parser, such as "j2g_fiddle".

-Bold_sot

This flag forces the compressor to use the old SOT marker style,

omitting the final byte which normally indicates the total number of

tile-parts in the tile to minimize resource consumption during

decompression.

-Bcomment comment

Place a comment in the compressed file (use quotes for multiple

words).

-Bcrg <CRG file>

Place a CRG marker in the codestream. This argument provides a

mechanism for specifying the component registration marker segment.The

file has 2 columns, the first column contains the Xcrg values and the

second column contains the Ycrg values.

-Fref <missing rows> <missing columns> (default = (0,0))

Explicitly set the number of missing rows above and columns to the

left of the image on the canvas. The compression system behaves as

though the canvas is the image being compressed, except that the upper

and left hand boundaries of the actual image may be moved in from the

corresponding canvas boundaries. This allows for efficient cropping in

the compressed domain. It also enables different Wavelet transform

policies to be implemented. Note that the ‘-Fref’ coordinates must

each be at least as large as the corresponding partitioning reference

coordinates specified via the ‘-Ftile_ref’ argument. To obtain the HP

first Wavelet transform convention instead of LP first, without

altering the alignment of tiles within the image itself, you must set

both the ‘-Fref’ and ‘-Ftile_ref’ coordinates equal to 1 in the

relevant direction. Note that the coordinates specified here refer to

the high resolution grid. This will normally but not always correspond

to the highest resolution image component.

-Ftiles <hi-res tile height> <hi-res tile width> (default = no tiling)

This argument allows the image to be broken into tiles during

compression. All operations within a tile are entirely independent of

the other tiles, including the operations of entropy coding, Wavelet

decomposition and any colour transform and/or component sub-sampling

operations. The argument’s two parameters identify the nominal

dimensions on the high resolution grid. The actual tile dimensions in

any image component are obtained by dividing by the relevant

sub-sampling factors.

-Ftile_ref <row index> <column index> (default = (0,0))

Explicitly set the partitioning reference point on which the tile

partition is based. By default, the partitioning reference point is

Page 192: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

188 Capıtulo 7. Anexos

the origin of the canvas, which is interpreted as the image prior to

any cropping from the top or left.

-Fconv (default=use lifting implementation)

This flag forces the use of a convolution-based implementation of the

Wavelet transform in place of the default lifting-based

implementation. The flag affects only those image components which

have a non-reversible decomposition. The codestream does not provide

any indication as to whether non-reversible transforms are implemented

using lifting or convolution.

-Fdir <directory path> (default = from "JP2_KERNELS_DIR" env var)

Provides a mechanism for specifying the ‘kernels_dir’ directory path

explicitly, rather than relying upon the value set into the

JP2_KERNELS_DIR environment variable. The ‘kernels_dir’ directory is

used to retrieve specifications for user-defined decomposition

kernels. Path name segments may be separated by either slashes (’/’)

or sloshes (’’), regardless of the convention on the underlying

platform (e.g. WIN32 or UNIX).

-Flra

Use Lagrangian Rate Allocation type rate control

-Fno_lra

Do not use Lagrangian Rate Allocation type rate control; use binary

search method of rate control (can be used to override default LRA

rate control for TCQ)

-Fguard_bits[+<tnum>] <guard bits> [<guard bits> [...]] (default = 2)

Sets the number of guard bits to use when adjusting the nominal ranges

of image samples, subband samples and quantized sample indices so as

to make best use of the dynamic range of internal data types, while

minimizing the risk of overflow. The minimum reasonable value is 1. A

value of 2 is generally sufficient for almost all practical purposes,

but values as high as 3 might be required in some lossless compression

applications. The value may not exceed 7. If there are multiple image

components then different numbers of guard bits may be specified for

each component; the last supplied parameter will be used for all

remaining components if there are more components than paramters.

-Frev[+<tnum>] [Y|N [Y|N [...]]] (default = non-reversible)

Use this to specify whether or not each image component uses a

reversible decomposition. By default, all image components use

non-reversible decompositions. If the argument is used without any

parameters, all components will use a reversible decomposition

instead. The argument takes an optional arbitrary string of Y or N

characters where Y denotes reversible and N denotes non-reversible. In

this case, the first such character establishes the reversibility of

the first image component, the second character establishes the

reversibility of the second component and so forth; if there are more

components than characters, the last character is re-used as

necessary.

-Fimplicit[+<tnum>] [Y|N [Y|N [...]]] (default = explicit

quantization)

Use this to specify whether or not each image component uses an

implicit quantization signalling style whereby only a base step size

is signalled and all other step sizes are obtained by dividing the

base step size for the entire image by 2 to the power of the number of

two-dimensional filtering stages between the original image and the

relevant subband. If the base step size itself is a power of 2 then

all step sizes will be exact powers of 2. Note that this argument is

incompatible with ‘-Fsteps’, but not with ‘-Fweights’, for obvious

reasons. By default, all image components use explicitly signalled

quantization parameters for each subband. If the argument is used

without any parameters, all components will use implicit quantization

instead. The argument takes an optional arbitrary string of Y or N

characters where Y denotes implicit and N denotes explicit

quantization. In this case, the first such character identifies the

type of quantization used for the first image component, the second

characters corresponds to the second component and so forth; if there

are more components than characters, the last character is re-used as

necessary. Note that the argument has no effect on components which

use a reversible decomposition.

Page 193: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.2. Anexo B: Lista de los parametros JPEG2000 189

-Fframes[+<tnum>] <height> <width> <vert SSO levels> <hor SSO levels>

[...]

Enables the frames mode for one or more image components. The argument

takes one or more groups of four parameters. The first two parameters

in each group of four specify the height and width of the nominal

frame at the image component level; these must be exact powers of 2!

The second two parameters specify the number of lowest frequency

decomposition levels in the vertical and horizontal directions

respectively for which the SSO-DWT transform must be applied instead

of the full overlapping DWT; these may exceed the number of

decomposition levels in the transform for the relevant image

component. If only one group of four parameters is supplied, the

specifications are applied to all image components. Multiple groups of

parameters apply to successive image components with the last group

applying to any remaining image components. It is possible to turn off

frames mode in one direction or for one or more specific image

components by specifying 0 for the height and/or width in the relevant

group of parameters.

-Fanchor[+<tnum>] <row> <column> [...] (default = (0,0))

Explicitly set the block framing reference point on which the frame,

code-block and packet partitions are based. The reference point must

be one of (0,0), (0,1), (1,0), or (1,1). The (1,1) and (1,0) reference

points minimize decompressor memory consumption in some applications,

when used with the SSO-DWT transform (see ‘-Fframes’). Apart from this

consideration, there is not currently any known reason for adopting

anything other than the (0,0) reference point. For this reason the

anchor point is forced to (0,0), in any component which is not using

the frames mode, regardless of the directives given in this argument!

If only one pair of coordinates is supplied, all image components are

affected. In general, each pair of supplied parameters applies to each

successive image component with the last pair of coordinates applying

to any remaining components.

-Flev[+<tnum>] <levels> [<levels> [...]] (default = 5 level

decomposition)

Set the number of levels of Wavelet decomposition used in each image

component. By default, five levels of decomposition are used in each

component. If only a single parameter is supplied, it is applied to

all components. When multiple parameters are supplied, they identify

the number of decomposition levels for each successive image

component, with the last supplied parameter applied to any remaining

image components. A value of 0 is legal and indicates that no Wavelet

transform will be applied at all.

-Fdecomp[+<tnum>] mallat|spacl|packet|<decomp string> [...] (default =

mallat)

This argument may be used to specify the spatial decomposition tree

for one or more image components. When only one string parameter is

supplied, it is applied to all image components; when multiple strings

are supplied they control the decomposition structure for each

successive image component separately, with the last specification

applied to any remaining components. The string parameters may be any

of "mallat", "spacl" or "packet", or they may consist of a string of

digits in the range 1 to 3. The first digit identifies the

‘max_hp_descent’ value for the highest resolution level (highest

frequency subbands) and subsequent digits refer to successively lower

resolution levels; the final digit is applied to any remaining low

resolution levels. For an explanation of the interpretation of the

‘max_hp_descent’ values, the reader is referred to the thorough

documentation in the master "ifc.h" header file. For reference, the

Mallat decomposition is completely described by the string "1", while

the Spacl and Packet decompositions are described by the strings "21"

and "321" respectively.

-Fkernels[+<tnum>] <id> [<id> [...]] [* <id> [<id> [...]] [* ...]]

This argument may be used to specify decomposition kernels to be used.

By default, the W9X7 kernel is used for all components with a

non-reversible decomposition, while the W5X3 kernel is used for all

components with a reversible decomposition. The argument takes zero or

more string parameters defining a set of specifications for the first

Page 194: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

190 Capıtulo 7. Anexos

image component. These may optionally be followed by an asterisk ‘*’

and then another set of specifications for the next image component

and so on. The last set of specifications is applied to any remaining

components. Each set of specifications consists of zero or more ‘id’

strings. If there are no ‘id’ strings then the default kernels are

used for the relevant image component(s). Otherwise, the first ‘id’

string specifies the kernels used in generating the subbands which

constitute the highest resolution level. Further ‘id’ strings may be

supplied to specify different kernels for lower resolution levels,

with the last ‘id’ string in the set of specifications applied to all

lower resolution levels. In the simplest case the ‘id’ string is one

of "W9X7", "W5X3" or a numeric index in the range 0 to 255. In the

latter case, the kernel will be retrieved from a file whose full path

name is "<kernels_dir>/<type>/kernel-<id>", where ‘kernels_dir’ is

usually obtained from the JP2_KERNELS_DIR environment variable, but

may also be specified directly via ‘-Fdir’ and ‘type’ is one of the

strings, "float_lifting" or "int_lifting", depending upon whether the

relevant image component has a reversible or non-reversible

decomposition, respectively. The file formats are different for the

two cases and a definition of each format appears in the relevant

kernel directory. The ‘id’ string may take the optional form

"<id1>,<id2>", in which case the <id1> string defines the kernel to be

applied in the vertical direction, while the <id2> string defines the

kernel to be applied in the horizontal direction.

-Fsteps[+<tnum>] <step quotient file> (default = fixed flat quant

matrix)

Provides a mechanism to allow explicit modification of the

quantization step sizes assigned to different subbands. By default,

all subbands are assigned exactly the same quantization step size,

within a normalized framework, in which the subband samples are scaled

to ensure that the synthesis basis functions all have unit L2-norm.

The step sizes for each subband are divided by the relevant entries in

the supplied ‘step quotient’ file. Thus, subbands with larger step

quotients will use relatively smaller step sizes. The file format is

explained thoroughly in the comments appearing at the beginning of the

"std_forward_info_local.c" header file. It should be noted that

scaling the step sizes alone might have no significant impact on

visual quality, since the EBCOT coder bases its decisions concerning

the contributions from different subbands and code blocks to the final

bit-stream on distortion measures, rather than blind assumptions

concerning the significance of a single quantization step in different

bands. If visual weighting is the goal then the same file should

generally be supplied to the ‘-Fweights’ argument, in addition to or

instead of this argument.

-Fweights[+<tnum>] <root weights file> (default = no weighting)

This argument provides a mechanism for specifying the relative

importance of different subbands to overall visual quality.

Specifically, the EBCOT coding algorithm tries to minimize the overall

Weighted MSE, where the default is to simply use MSE. The weights

supplied via the ‘root weights’ file for each subband are squared and

then multiplied by the MSE contribution to determine the WMSE

contribution from any given subband’s samples. When this quantity is

minimized, subbands with larger weights will be assigned greater

significance in the final bit-stream.

-Fovlp[+<tnum>] [L][R][T][B] [ [L][R][T][B] [...]] (default=no

overlap)

This argument may be used to add overlap samples to any boundary of

any tile in any component. The argument takes one or more string

parameters where each string consists of any or all of the characters,

‘L’, ‘R’, ‘T’ and ‘B’, in any order. The first such string identifies

whether each of the left (L), right (R), top (T) and bottom (B)

boundaries contains an overlap in the first image component of the

relevant tile(s). If additional string parameters appear then these

refer to subsequent image components, with the last supplied string

parameter applied indefinitely to any remaining components.

Overlapping tiles can be useful in reducing the visibility of tile

boundary artefacts. Note that when two adjacent tiles both specify

Page 195: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.2. Anexo B: Lista de los parametros JPEG2000 191

overlap on their common boundary, there will be two full rows or

columns of overlap between the tiles. Overlapping tiles may be used in

conjunction with carefully selected tile sizes and reference

coordinates to ensure that the overlapping tile segments which are

compressed in each image component contain boundary samples whose

canvas coordinates are always even in every resolution level. Under

these conditions, it can be particularly advantageous to use the

SSO-DWT boundary extension policy at the boundaries of these

overlapping tile segments, rather than just at internal frame

boundaries. If desired, this behaviour must be enabled separately by

means of the ‘-Xsso_ext’ argument.

-Fgen_decomp[+<tnum>] <decomp string> [...] (default = none)

Provides a mechanism for specifying a general wavelet decomposition.

This argument excepts one or more strings of integers in the range of0

to 3. The first string is for the first component and succesivestrings

control the next component, with the last string controlling the

decomposition structure for remaining components. Likewise, each

string is a concatenation of sub-strings for individual levels, with

the first sub-string addressing the highest resolution level and

successive sub-strings addressing progressively lower resolution

levels. The last resolution level defined in the component string

controls levels not addressed. Each level sub-string is a string of

integers from 0 to 3. Value 0 indicates that the current subband

should not be decomposed further. Value 1 indicates that the current

subband should be split both horizontally and vertically. Value 2

indicates that the current subband should be split in just the

horizontal direction (resulting in left and right sub-bands). Value 3

indicates that the current subband should be split in just the

vertical direction (resulting in top and bottom sub-bands). Note that

the maximum depth through the resulting tree structure is controlled

by the max_hp_descent values passes through the ‘-Fdecomp’ argument.

Therefore, zeros do not have to be included in the ‘-Fgen_decomp’

strings when the depth in the tree equals max_hp_descent. See the

GeneralDecompExamples.ppt PowerPoint file for example ‘-Fgen_decomp’

options for various decomposition structures.

-Fdc[+<tnum>] <offset value>

Flag specifying the use of a DC shift offset other than the default.

This should be the total floating point offset desired.

Allows control over the floating point DC offset shift for each

tile-component. If there are multiple image components then different

offsets may be specified for each component; the last supplied

parameter will be used for all remaining components if there are more

components than paramters.

-Cblk[+<tnum>] <ht>[x<wd>] [<ht>[x<wd>] [...]] (default = 64x64)

Specify the nominal code-block dimensions to use in coding. In its

simplest form, the argument takes only one parameter assigning an

identical code-block size in both dimensions and all image components.

In general, the argument takes one or more size specifiers where each

size specifier takes one of the forms: <dim> (if the code-block is

square); or <ht>x<wd> (if separate vertical and horizontal dimensions

are to be given). Each dimension must be an exact power of 2 in the

range 4 to 1024 and the product of the two dimensions may not exceed

4096. The first such size specifier identifies the code-block

dimensions for the first image component. The second applies to the

next image component and so forth. The last size specifier is applied

to any remaining image components. Like most arguments, the ‘-Cblk’

argument also has a tile-specific form.

-Cpp[+<tnum>] <ht>[x<wd>] [<ht>[x<wd>] [...]] [*] ...

Specify precinct partition dimensions. This argument can take anywhere

from 1 to a very large number of parameters. It specifies the size of

the precinct partition within each resolution level for each image

component, as described in the PART-1 CD. The argument accepts one or

more parameter sets, where multiple parameter sets are separated by

the ‘*’ character. Parameter sets apply to consecutive image

components, with the last parameter set applying to any remaining

image components. Each parameter set consists of one or more size

specifiers. The first size specifier identifies the dimensions of the

Page 196: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

192 Capıtulo 7. Anexos

partition for the highest resolution level of any tile-component to

which the specifier applies. Subsequent size specifiers refer to

progressively lower resolution levels with the last size specifier

applied to any remaining resolution levels. Each size specifier takes

one of two forms: <dim> (if the partition is square); or <ht>x<wd> (if

a different height and width are to be given). Each dimension must be

an exact power of 2 in the range 1 through 2^15. Like most arguments,

the ‘-Cpp’ argument also has a tile-specific form.

-Cframes[+<tnum>] [Y|N [Y|N [...]]] (default = ignore frames)

Dictates whether or not the code-block size should be reduced as

necessary to conform to frame boundaries. By default, frame boundaries

are ignored. If no parameters are supplied, the argument forces the

opposite policy in all image components. One or more parameters may be

supplied, each of which must be one of the characters, ‘Y’ (respect

frames) or ‘N’ (ignore frames). The parameters establish the behaviour

in each successive image component with the last parameter applied to

any remaining image components.

-Ccausal[+<tnum>] [Y|N [Y|N [...]]]

Determines whether or not the context models will be restricted to be

vertically causal on a sub-block basis. By default, the causal

restriction is applied only in those image components which have the

parallel coding mode (see below). If no parameters are suppllied the

argument forces the causal restriction to apply in all image

components. One or more parameters may be supplied, each of which must

be one of the characters, ‘Y’ (causal) or ‘N’ (non-causal). The

parameters establish the behaviour in each successive image component

with the last parameter applied to any remaining image components.

-Cparallel[+<tnum>] [Y|N [Y|N [...]]] (default = sequential coding)

Determines whether or not the parallel coding options will be used.

These options force the states of the arithmetic coder’s adaptive

probability models to be reset between coding passes and the

arithmetic code-word generation process to be terminated on a byte

boundary at the end of each coding pass. This allows for independent,

parallel encoding of each coding pass, rather than sequential

encoding. Moreover, unless specifically rendered non-causal by means

of the ‘-Ccausal’ argument, the affected image components will also

use vertically non-causal context formation rules to enable parallel

decoding of the coding passes. If no parameters are supplied, all

image components will be coded with the parallel options. One or more

parameters may be supplied, each of which must be one of the

characters, ‘Y’ (parallel) or ‘N’ (sequential). The parameters

establish the behaviour in successive image components with the last

parameter applied to any remaining image components

-Clazy[+<tnum>] [Y|N [Y|N [...]]] (default = full effort coding)

Determines whether the lazy coding mode will be adopted, where

trailing bit-planes bypass the arithmetic coder in all but the

normalization coding passe. If no parameters are supplied, the lazy

mode will be adopted in all image components. One or more parameters

may be supplied, each of which must be one of the characters, ‘Y’

(lazy) or ‘N’ (full effort). The parameters establish the behaviour in

successive image components with the last parameter applied to any

remaining image components

-Csegmark[+<tnum>] [Y|N [Y|N [...]]] (default = no segmark)

Determines whether or not the segmark mode will be adopted, in which a

4-symbol marker is included at the end of the normalization coding

pass for each bit-plane. If no parameters are supplied, the segmark

code will be used in all image components. One or more parameters may

be supplied, each of which must be one of the characters, ‘Y’

(segmark) or ‘N’ (no segmark). The parameters establish the behaviour

in successive image components with the last parameter applied to any

remaining image components

-Cer_term[+<tnum>] [Y|N [Y|N [...]]]

Causes the encoder to adopt a predictable termination policy and

identify the fact that this policy has been used in the codestream

COD/COC markers. Error resilient decoders can exploit the knowledge

that this predictable termination policy was used to implement error

detection and concealment schemes. In the VM’s decompressor, this is

Page 197: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.2. Anexo B: Lista de los parametros JPEG2000 193

obtained with the decoder’s ‘-Cer’ switch. Note that if the

predictable error resilient termination is requested for any image

component which is not using either the lazy (‘-Clazy’) or parallel

(‘-Cparallel’) coding options, then a side effect will be to terminate

each coding pass and include termination lengths in the packet

headers, exactly as for ‘-Cparallel’, but without forcing model

resetting and causal context formation (unless these are separately

requested). If no parameters are supplied, the predictable termination

will be adopted in all image components. One or more parameters may be

supplied, each of which must be one of the characters, ‘Y’

(predictable termination) or ‘N’ (no predictable termination). The

parameters establish the behaviour in successive image components with

the last parameter applied to any remaining image components

-Corder[+<tnum>] L|RL|RP|PC|CP [<minLEV> <minC> <LAYERS> <LEVS>

<COMPS> ...]

This argument provides for the specification of packet progression

orders in the codestream. Like most arguments, there is a

tile-specific form which allows the order to be overridden in specific

tiles. There are five defined ordering principles, each identified by

a one or two character string as follows: "L" denotes

layer-progressive (LRCP in full); RL denotes resolution-layer

progressive (RLCP in full); RP denotes resolution-position progressive

(RPCL in full); PC denotes position-component progressive (PCRL in

full); and CP denotes component-position progressive (CPRL in full).

This order string may optionally be followed by five integers and a

further order string, where the 5 integers identify the coordinates of

a bounding box to be applied to the previous progression order. The

parameters are: 1) the minimum resolution level index (0-based); 2)

the minimum component index (0-based); 3) the maximum number of

layers; 4) the maximum number of resolution levels (from 0); 5) the

maximum number of components (from 0). The ensuing order string

applies for any packets found outside these bounds; there is no need

for it to be a different order string. This construction may be

repeated as necessary to create nested bounding boxes and new

progression orders to be applied outside each successive bounding box.

There is no constraint on the five parameters actually specified for

the bounding box, other than they be non-negative. By default, the

layer-progressive order will be used (i.e. LRCP,

layer-resolution-component-position) which is most commonly

interpreted as SNR-progressive ordering.

-Ctile_parts

This flag is meaningful only when used in conjunction with a

tile-specific ‘-Corder’ argument. In this case, the relevant tile will

be broken into tile-parts, with one tile-part for each distinct

progression order supplied via the tile-specific ‘-Corder’ argument.

The tile-part boundaries will be positioned immediately after the last

packet which was sequenced according to the most recent progression

order and its associated bounding box. In this case, the relevant

order information will be placed in a POC marker in the relevant

tile-part header.

-Cvis <exponent> (default = do not exploit visual masking)

This option causes the encoder to base its rate-distortion

optimization decisions upon a visually sensitive distortion metric,

which accounts for the phenomenon of visual masking. The option may be

used with or with CSF compensating global weights supplied by

‘-Fweights’, depending upon the viewing conditions. By itself, the

option compensates for visual masking effects in a manner which is

independent of assumptions on viewing conditions, which is most useful

when the images are to be viewed on a monitor with user control over

the "zoom" factor. The argument takes a single parameter identifying

the exponent to be used in the assumed masking model. This parameter

must be strictly greater than 0 and strictly less than 1.0. A typical

value (not necessarily optimal) is 0.5. Smaller values decrease the

strength of the masking compensation. Note that the option tends to

yield the highest performance when used in conjunction with a nominal

code-block size of 32x32 samples, rather than the default 64x64 block

size.

Page 198: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

194 Capıtulo 7. Anexos

-Clayers [<rate> [+<layers>] [<rate> [+<layers>] [...]]] (default = 1

layer)

Specifies the bit-stream layer formation parameters. If no parameters

are supplied, a generically scalable multi-layer codestream will be

constructed with approximately 50 layers roughly logarithmically

spaced through the range 0.05bpp to 2.0bpp. If the argument is not

supplied at all, the default is to use only a single quality layer,

optimized for the target bit-rate. Alternatively, the argument may

take one or more parameters. In this case, <rate> is the target rate

(bpp) for the first additional layer, beyond the final layer

corresponding to the overall target bit-rate. <layers> is the number

of extra layers which should be added for scalability, between this

first layer with the indicated target bit-rate and the next layer with

a specific target bit-rate. Rates are approximately log-spaced for

layers which lie between specific target bit-rates, but there is no

careful rate optimization loop. Additional layers with specific

bit-rates may be specified by repeating the <rate> [+<layers>]

construct.

-Cvpw <rate> <weights file> [<rate> <weights file> [...]] (default =

no progressive weighting)

This argument may be used to specify a sequence of progressive visual

weights. The argument must be followed by one or more pairs of

parameters, where the first parameter identifies the maximum bit-rate

(in bits-per-pixel) for which the weights are valid, and the second

parameter gives the name of a file which contains the weighting

factors. The weights file has exactly the same syntax as the files

specified by the ‘-Fweights’ and ‘-Fsteps’ arguments. In this case,

the weight factors are interpreted as effective boosts in the visually

weighted RMS error contributions from each of the subbands. Note that

the bit-rates for which visual weights are specified may appear in any

order; and above the largest bit-rate, no weights are applied beyond

those specified via the ‘-Fweights’ argument. The weights are applied

uniformly across all tiles in the image.

-Cno_trunc (default = use R-D optimized truncation for all layers)

If this flag is supplied, then the final layer of the bit-stream will

contain the complete bit-stream generated for each code block, without

any truncation. This means that the overall target bit-rate for the

full bit-stream will be ignored and an external iterative rate-control

loop is required to achieve a particular overall bit-rate. If the

bit-stream is SNR scalable then any other layers will still be formed

using the R-D optimal block truncation strategy.

-Creverse_tiles

If this flag is supplied, tiles will be delivered to the codestream in

reverse order. The main purpose of this is to test correct

decodability with unconventional tile sequences.

-Comit_tile_length

If this flag is supplied, the last tile in the codestream will be

delivered with 0 as the tile-length field in the SOT marker. This is

what some memory efficient compressor’s of large images might need to

do, although the VM’s compressor currently buffers all block

bit-streams before forming the codestream so it can always compute

accurate tile lengths.

-Ccpu

Report CPU time for block encoding engine.

-Cscan_buffer_bytes

Specify a reduced memory buffer (in bytes) for storing scan elements

of compressed data. This reduced buffer will store as many scan

elements as possible while trying to maintain constant rate-distortion

characteristics over all elements. Least significant bit-plane passes

are truncated from elements in order to maintain this constant RD

behavior.

-Cscan_buffer_elements

Specify a reduced memory buffer (in the number of scan elements) for

storing scan elements of compressed data. This reduced buffer will

store as many scan elements as possible while trying to maintain

constant rate-distortion characteristics over all elements. Least

significant bit-plane passes are truncated from elements in order to

Page 199: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.2. Anexo B: Lista de los parametros JPEG2000 195

maintain this constant RD behavior.

-Rrgn[+<tnum>] <boost> [R <y> <x> <ht> <wd>]|[C <y> <x> <rad>] [*] ...

This argument may appear only once, but it can take a potentially very

large number of parameters. The argument specifies boost and geometric

information for one or more regions, which may be customized on a

component basis. Moreover, like most command-line arguments, the

tile-specific form may be used to override default region

configurations. The argument consists of one or more parameter sets,

which may be interspersed with ‘*’ characters if separate parameter

sets are to be specified for different components. Each parameter set

commences with a ‘boost’ value which must be a positive integer

indicating the amount by which sample values are effectively shifted

up above the background, if they contribute to the region of interest.

The parameter set then contains either an ‘R’ or a ‘C’ character,

depending upon whether a rectangular or a circular geometry is to be

specified. Rectangular geometries are specified with four parameters

corresponding to the y- and x-coordinates of the upper left hand

corner and the height and width of the rectangular region,

respectively; all parameters are specified relative to the dimensions

of the location and size of the relevant image component on the

canvas, as parameters in the range 0 to 1. Circular regions are

specified via the y- and x-coordinates of the centre, followed by the

radius; again, all coordinates are specified relative to the location

and size of the relevant image component, with the radius specified

relative to the maximum of the two dimensions. Any number of regions

may be specified via consecutive parameter sets. If a ‘*’ character is

encountered between parameter sets then the ensuing parameter sets are

deemed to apply to the next image component in sequence. All parameter

sets after the last ‘*’ character, if any, are deemed to apply to all

remaining image components.

-Ralign

This flag forces the use of a single homogeneous boost value within

each code-block. In this case, no ROI geometry or boost information

must be specified at all and the ROI machinery is simply being used to

generate region-specific differentiation in the distortion metric

applied to the different code-blocks for the purpose of quality layer

generation in the EBCOT algorithm.

-Rmax_shift[+<tnum>] [Y|N [Y|N [...]]] (default = explicit regions)

This flag is used to specify whether or not the region of interest

geometries should be determined implicitly bythe decompressor using

the ‘max-shift’ method. By default, all geometry information is

signalled explicitly through the codestream. The argument takes one or

more parameters, each of which must consist of a single character,

either ‘Y’ (use ‘max-shift’) or ‘N’ (do not use ‘max-shift’ method).

The first character refers to the first component; the second

character refers to the second component and so forth; the last

parameter is applied to any remaining components. Like most arguments,

this argument has a tile-specific form, which can be used to override

the signalling mode in specific tiles. Note that the ‘max-shift’

method requires that all regions of interest for the relevant tile

have identical boost values and that these boost values be

sufficiently large. Violation of these conditions in any tile will

generate an error; to remedy the error, the ‘max-shift’ method must be

explicitly disabled in the affected tiles.

-Rno_rect

This flag forces the use of the generic ROI mask generation

implementation, rather than the fast rectangular mask generation. The

flag has no affect unless all ROI regions in some tile-component have

rectangular geometries, since this is the condition under which the

specific implementation for rectangular geometries will normally be

used.

-Qtcq

Use trellis coded quantization on entropy coder blocks.

-Qnz <nz> (default nz=0.0)

Use generalized scalar quantization, with a zero bin of sized to

2(1-nz)*stepsize. nz in (-1,1). This only works with the irreversible

filters. Default behavior is the Part 1 deadzone.

Page 200: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

196 Capıtulo 7. Anexos

-XpsExt

Use point-symmetric extension instead of normal symmetric extension.

-Xmask [alpha=0.7] [beta=0.0] [respect_block_boundaries=1]

[win_width=6] [bits_retained=9] [minlevel=1]

This option indicates use of visual masking in the transform operation

and may accept up to seven additional parameters. The first two

parameters specify the alpha (point) and beta (neighborhood) powers

respectively to use for visual masking. The third parameter specifies

if the neighborhood masking should respect entropy encoder block

boundaries. The fourth and fifth parameters are the window width and

the number of precision bits to lose for neighborhood masking. The

sixth parameter specifies the minlevel as defined in WG1 N1135.

-Xsso_ext[+<tnum>] [Y|N [Y|N [...]] (default=symmetric extension)

This argument forces the selection of SSO-DWT style boundary

extension, in which the boundary sample is left unchanged, skipping

all update steps at the boundary, on all tile boundaries whose samples

are those which are modified during the update lifting steps (i.e.

even indexed boundary locations). This can have beneficial effects in

hiding tile boundaries when used in conjunction with overlapping tiles

and appropriate selection of the various parameters. See ‘-Fovlp’ for

more information on this. By default, symmetric extension is applied

at tile boundaries and SSO-DWT extension is applied at most at the

internal boundaries between frames within a tile. The argument takes

zero or more parameters. Each optional parameter must consist of one

of the characters ‘Y’ (use SSO-DWT style extension) or ‘N’ (use

symmetric extension). The first parameter identifies the extension

style for the first image component in the relevant tile(s).

Subsequent parameters correspond to consecutive image components, with

the last parameter applying to any remaining image components. If no

parameters are supplied, all components in the relevant tile(s) will

adopt the SSO-DWT style boundary extension.

‘-Xwt_output’ <output wavelet PPM file> (default = none)

Specifies a file for outputing a viewable PPM file for the wavelet

transform used in encoding. Note that this argument can provide

significant utility in debugging ‘-Fgen_decomp’ strings. Also note

that this option does not currently work for tiled images.

-Mycc[+<tnum>] [Y|N]

May be used to specify the use of an RGB to luminance-chrominance

transform for colour imagery. Uses YCbCr transform with non-reversible

decompositions and RCT transform with reversible decompositions. The

transform is applied only to the initial 3 components, interpreting

them as R, G and B. Also, an error will be generated unless either all

3 components have a reversible decomposition or all 3 components have

a non-reversible decomposition. In the former case, all three

components are also required to have the same bit-depth. The argument

takes an optional single character argument which, if present, must be

one of ‘Y’ (use the transform) or ‘N’ (no color transform). This can

be useful when the argument is used in its tile-specific form to turn

the component transform on and off in different tiles.

-Mtdt[+<tnum>] [Y|N] [<third_d_kernel_id>]

Flag specifying the use of a wavelet transform across the component

direction. The argument takes an optional single character argument

which, if present, must be one of ‘Y’ (use the transform) or ‘N’ (no

multi-component transform). This can be useful when the argument is

used in its tile-specific form to turn the component transform on and

off in different tiles. If this optional character is not ‘N’, the

following optional <third_d_kernel_id> parameter can specify the

filter kernel in the component direction, where <third_d_kernel_id>

can be anything allowed for the ‘-Fkernels’ <id>.

-Mlin[+<tnum>] [Y|N] <forw file> [<rev file>]

Flag specifying the use of a non-reversible, linear transform across

components for decorrelation. This argument takes an optional single

character argument which, if present, must be one of ‘Y’ (use the

transform) or ‘N’ (no multi-component transform). This can be useful

when the argument is used in its tile-specific form to turn the

component transform on and off in different tiles. If this optional

character is not ‘N’, the following "forw" argument should point to a

Page 201: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.2. Anexo B: Lista de los parametros JPEG2000 197

file that contains a floating-point forward transform matrix (32-bit,

raster order). The "rev" argument may point to a file that contains

the correponding floating-point reverse transform matrix. The default

action is to embed the transpose of the forward transform matrix,

which is valid for orthonormal transforms only. Since the dynamic

range of the transformed samples may grow beyond the original range,

some error checking is provided on the number of guard bits to ensure

proper coding. This check is valid for orthonormal transforms only

(see component_mix.c). For an arbitrary linear transform, one must

check/set the number of guard bits manually.

-u

Print this usage statement and exit. Overrides other arguments.

Page 202: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

198 Capıtulo 7. Anexos

Page 203: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 199

7.3 Anexo C: Funciones J2MT

El archivo principal tc11.m unicamente contiene las definiciones de los objetos

function j2mt;

% Programa de arranque. Verifica incompatibilidades de archivos.%% J2MT - Rafael Redondo Tejedor 2002 (c)

if (size(dir(’tmp.pgm’ ),1))|(size(dir(’tmpr.pgm’ ),1))| ...

(size(dir(’tmp.jp2’ ),1))|(size(dir(’tmpt.ppm’ ),1))| ...

(size(dir(’Cresults.txt’ ),1))|(size(dir(’Dresults.txt’ ),1))

while 1

OptionQuit=questdlg(’Incompatibilidad de archivos. Desea continuar?.’ ,...

’Advertencia!!’ ,’Si’ ,’No’ ,’Ayuda’ ,’No’ );

switch OptionQuit

case ’Si’ ,

tc11;

break;

case ’No’ ,

break;

case ’Ayuda’ ,

h = warndlg([’Alguno de los siguientes archivos pueden ser ’ ...

’modificados: tmp.pgm, tmpr.pgm, tmpt.ppm, tmp.jp2, ’ ...

’Cresults.txt, Dresults.txt. ’ ...

’Intente ejecutar el programa en otro directorio.’ ],...

’Incompatibilidad de archivos’ );

set(findobj(h,’String’ ,’OK’ ),’String’ ,’Volver’ );

waitfor(h);

end;

end;

else tc11;

end;

function Config;

% Mira cual es el sistema operativo% y elige la sintaxis correcta del prompt% con la ruta de acceso al compresor (VM).%% J2MT - Rafael Redondo Tejedor 2002 (c)

conf menu = findobj(’Tag’ ,’&Imagenuimenu5’ );

if strcmp(computer,’PCWIN’ )

ext = ’*.exe’ ;

else ext = ’*’ ;

end;

path = [get(conf menu,’UserData’ ) filesep ext];

[newfile, newpath] = uigetfile(path, ’Seleccionar ruta de JPEG2000:’ );

if newfile ~= 0

[newpath,name,ext,var] = fileparts([newpath newfile]);

if newpath

set(conf menu,’UserData’ ,newpath);

end;

end;

function expandmenu;

% Deshabilita los mens por defecto de Matlab.%% J2MT - Rafael Redondo Tejedor 2002 (c)

state = get(gcbo,’checked’ );

if strcmp(state,’on’ )

set(gcbo,’checked’ ,’off’ )

set(findobj(gcf,’Label’ ,’&File’ ),’Visible’ ,’off’ );

set(findobj(gcf,’Label’ ,’&Edit’ ),’Visible’ ,’off’ );

set(findobj(gcf,’Label’ ,’&Tools’ ),’Visible’ ,’off’ );

set(findobj(gcf,’Label’ ,’&Window’ ),’Visible’ ,’off’ );

set(findobj(gcf,’Label’ ,’&Help’ ),’Visible’ ,’off’ );

else set(gcbo,’checked’ ,’on’ )

set(findobj(gcf,’Label’ ,’&File’ ),’Visible’ ,’on’ );

set(findobj(gcf,’Label’ ,’&Edit’ ),’Visible’ ,’on’ );

set(findobj(gcf,’Label’ ,’&Tools’ ),’Visible’ ,’on’ );

set(findobj(gcf,’Label’ ,’&Window’ ),’Visible’ ,’on’ );

set(findobj(gcf,’Label’ ,’&Help’ ),’Visible’ ,’on’ );

end;

Page 204: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

200 Capıtulo 7. Anexos

function ControlParameter(tag);

% Controla los estados de los botones, activaciones% y desactivaciones, incompatibilidades entre opciones,% rangos de valores, muestra mensajes de error y% advertencia. Slo es llamada cuando el botn% pulsado necesita este chequeo.%% ¡tag¿-etiqueta del objeto%% J2MT - Rafael Redondo Tejedor 2002 (c)

hnd = findobj(gcbf,’Tag’ ,tag);

switch tag

case ’P101p’ ,

if 4 == get(findobj(’Tag’ ,’P108p’ ),’Value’ );

value = 9 - get(hnd,’Value’ );

btn act = get(findobj(’Tag’ ,’P110t’ ),’UserData’ );

if str2num(btn act(4)) > value

DecompParam([’P11’ num2str(value) ’p’ ]);

end;

for i=1:value

set(findobj(’Tag’ ,[’P11’ num2str(i) ’p’ ]),’Enable’ ,’on’ );

end;

for i=value+1:8

set(findobj(’Tag’ ,[’P11’ num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

ShowDecomp(0);

case ’P103p’ ,

set(gcbo,’Value’ ,1);

set(findobj(’Tag’ ,’P104p’ ),’Enable’ ,’on’ ,’Value’ ,0);

set(findobj(’Tag’ ,’P107p’ ),’Value’ ,0,’Enable’ ,’on’ );

case ’P104p’ ,

set(gcbo,’Value’ ,1);

set(findobj(’Tag’ ,’P103p’ ),’Enable’ ,’on’ ,’Value’ ,0);

set(findobj(’Tag’ ,’P106p’ ),’Value’ ,1);

set(findobj(’Tag’ ,’P107p’ ),’Value’ ,0,’Enable’ ,’off’ );

uiwait(helpdlg(’Con filtros reversibles no tendr efecto la cuantificacin.’ ,’Advertencia!’ ));

case ’P106p’ ,

set(gcbo,’Value’ ,1);

set(findobj(’Tag’ ,’P107p’ ),’Value’ ,0);

case ’P107p’ ,

set(gcbo,’Value’ ,1);

set(findobj(’Tag’ ,’P106p’ ),’Value’ ,0);

case ’P108p’ ,

value = get(hnd,’Value’ );

if ~(value == 4)

for i=1:8

set(findobj(’Tag’ ,[’P11’ num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

for j=2:5

for i=1:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

else

value = 9 - get(findobj(’Tag’ ,’P101p’ ),’Value’ );

for i=1:value

set(findobj(’Tag’ ,[’P11’ num2str(i) ’p’ ]),’Enable’ ,’on’ );

end;

for i=value+1:8

set(findobj(’Tag’ ,[’P11’ num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

set(findobj(’Tag’ ,’P121p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P122p’ ),’Enable’ ,’on’ );

DecompParam(’P121p’ );

end;

ShowDecomp(0);

case ’P109p’ ,

set(findobj(’Tag’ ,’P171p’ ),’Value’ ,0);

set(findobj(’Tag’ ,’P109p’ ),’Value’ ,1);

case ’P171p’ ,

set(gcbo,’Value’ ,1);

set(findobj(’Tag’ ,’P109p’ ),’Value’ ,0);

title = ’Otros Filtros:’ ;

prompt = {’Direccin de los Filtros (Path):’ ,’Identificadores de filtro 0-255 (kernel-xxx):’};def{1} = get(findobj(’Tag’ ,’P171t’ ),’UserData’ );

def{2} = get(gcbo,’UserData’ );

answer=inputdlg(prompt,title,1,def);

if isempty(answer)

ControlParameter(’P109p’ );

else

if ~isempty(answer{1})if ~isempty(answer{2})

i = 1; ii = 1; l = length(answer{2});while i

while (i<=l)&(answer{2}(i)~=’ ’ )

Page 205: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 201

i = i+1;

end;

if (str2num(answer{2}(ii:i-1))<256)&(str2num(answer{2}(ii:i-1))>=0)i = i+1; ii = i;

else

uiwait(errordlg(’Parmetro fuera del rango [0,256).’ ,’Error!’ ));

i = 0; ii = 0;

end;

if i>=l i = 0;end;

end;%while iif ii

set(findobj(’Tag’ ,’P171t’ ),’UserData’ ,answer{1});set(gcbo,’UserData’ ,answer{2});

else ControlParameter(’P171p’ );

end;

else

errordlg(’Identificador incorrecto. La seleccin no tendr efecto.’ ,’Error!’ );

ControlParameter(’P109p’ );

end;

else

errordlg(’Directorio sin completar. La seleccin no tendr efecto.’ ,’Error!’ );

ControlParameter(’P109p’ );

end;

end;

case ’P211p’ ,

value1 = get(gcbo,’Value’ );

value2 = get(findobj(’Tag’ ,’P212p’ ),’Value’ );

if ((11-value1)+(11-value2))>12

errordlg(’El rea no puede exceder 4096.’ ,’Error!’ );

set(gcbo,’Value’ ,[10-value2]);

end;

case ’P212p’ ,

value1 = get(gcbo,’Value’ );

value2 = get(findobj(’Tag’ ,’P211p’ ),’Value’ );

if ((11-value1)+(11-value2))>12

errordlg(’El rea no puede exceder 4096.’ ,’Error!’ );

set(gcbo,’Value’ ,[10-value2]);

end;

case ’P221p’ ,

if str2num(get(findobj(’Tag’ ,’P221p’ ),’String’ )) <= 0

set(findobj(’Tag’ ,’P221p’ ),’String’ ,’0.01’ );

errordlg(’Debe ser un nmero mayor que 0.’ ,’Error!’ );

end;

case ’P229p’ ,

level = 9 - get(findobj(’Tag’ ,’P101p’ ),’Value’ );

if level

prompt={’Nivel 1:’ ,’Nivel 2:’ ,’Nivel 3:’ ,’Nivel 4:’ ,’Nivel 5:’ ,’Nivel 6:’ ...

,’Nivel 7:’ ,’Nivel 8:’};dlgTitle=’Introduzca tamao en cada nivel (ej: 64x64).’ ;

def = get(findobj(’Tag’ ,’P229p’ ),’UserData’ );

answer=inputdlg(prompt(1:level),dlgTitle,1,def(1:level));

ok = 1; mess = 1;

if ~isempty(answer)

for i=1:level

if ~isempty(answer{i})j = 1;

while (answer{i}(j)~=’x’ )&(answer{i}(j)~=’X’ )&okif (length(answer{i})==j)|(isempty(str2num(answer{i}(j))))

ok = 0;

else

j = j+1;

end;

end;

if ok

if log2(str2num(answer{i}(1:j-1)))-floor(log2(str2num(answer{i}(1:j-1))))mess = 0; ok = 0;

end;

if j==length(answer{i})ok=0;

elseif log2(str2num(answer{i}(j+1:length(answer{i})))) ...

-floor(log2(str2num(answer{i}(j+1:length(answer{i})))))mess = 0; ok = 0;

end;

end;

else ok = 0;

end;

end;%i=1:levelif ~ok

if mess

uiwait(errordlg([’Datos incorrectos (ej: 64x64).’ ],’Error!’ ));

ControlParameter(’P229p’ );

else

uiwait(errordlg([’Rango incorrecto: valores en potencias de 2 (2-32768).’ ],’Error!’ ));

ControlParameter(’P229p’ );

end;

else

if level<8

set(findobj(’Tag’ ,tag),’UserData’ ,{answer{1:level},def{level+1:8}})else set(findobj(’Tag’ ,tag),’UserData’ ,answer)

end;

set(findobj(’Tag’ ,’P228p’ ),’Value’ ,0);

Page 206: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

202 Capıtulo 7. Anexos

end;

end;%isempty(answer)end;

case ’P316p’ ,

if get(findobj(’Tag’ ,’P316p’ ),’Value’ )

set(findobj(’Tag’ ,’P317p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P315p’ ),’Value’ ,0);

ControlParameter(’P315p’ );

if (get(findobj(’Tag’ ,’P211p’ ),’Value’ )~=6)|(get(findobj(’Tag’ ,’P212p’ ),’Value’ )~=6)

uiwait(helpdlg(’La mscara visual funciona mejor con bloques de 32x32.’ ,’Consejo’ ));

end;

else set(findobj(’Tag’ ,’P317p’ ),’Enable’ ,’off’ );

end;

case ’P317p’ ,

value = str2num(get(findobj(’Tag’ ,’P317p’ ),’String’ ));

if 1 <= value

set(findobj(’Tag’ ,’P317p’ ),’String’ ,’0.99’ );

errordlg(’El coeficiente debe ser menor que 1.’ ,’Error!’ );

elseif value <= 0

set(findobj(’Tag’ ,’P317p’ ),’String’ ,’0.01’ );

errordlg(’El coeficiente debe ser mayor que 0.’ ,’Error!’ );

end;

case ’P318p’ ,

if get(findobj(’Tag’ ,tag),’Value’ )

set(findobj(’Tag’ ,’P319p’ ),’Enable’ ,’on’ );

else set(findobj(’Tag’ ,’P319p’ ),’Enable’ ,’off’ );

end;

case ’P319p’ ,

step path = get(gcbo,’UserData’ );

answer=inputdlg({’Introduce direccin y nombre del fichero:’},’Pesos CSF’ ,1,{step path});if ~isempty(answer)

if ~isempty(answer{1})set(gcbo,’UserData’ ,answer{1});

else uiwait(errordlg(’Datos incorrectos. El campo est vaco.’ ,’Error!’ ));

ControlParameter(’P319p’ );

end;

else set(findobj(’Tag’ ,’P318p’ ),’Value’ ,0);

set(gcbo,’Enable’ ,’off’ );

end;

case ’P315p’

if get(findobj(’Tag’ ,’P315p’ ),’Value’ )

set(findobj(’Tag’ ,’P316p’ ),’Value’ ,0);

set(findobj(’Tag’ ,’P317p’ ),’Enable’ ,’off’ );

for i=0:5

set(findobj(’Tag’ ,[’P35’ num2str(i) ’p’ ]),’Enable’ ,’on’ );

end;

else

for i=0:5

set(findobj(’Tag’ ,[’P35’ num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

case ’P310p’ ,

if get(gcbo,’Value’ )

uiwait(warndlg(’No usar con Tasas altas. Puede que no consiga la convergencia.’ ,’Advertencia!’ ));

end;

case ’P311p’ ,

if get(gcbo,’Value’ )

set(findobj(’Tag’ ,’P321p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P312p’ ),’Value’ ,0);

else

set(findobj(’Tag’ ,’P312p’ ),’Value’ ,1);

set(findobj(’Tag’ ,’P321p’ ),’Enable’ ,’off’ );

end;

case ’P312p’ ,

if get(gcbo,’Value’ )

set(findobj(’Tag’ ,’P321p’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P311p’ ),’Value’ ,0);

else

set(findobj(’Tag’ ,’P311p’ ),’Value’ ,1);

set(findobj(’Tag’ ,’P321p’ ),’Enable’ ,’on’ );

end;

case ’P321p’ ,

if (str2num(get(gcbo,’String’ ))>=4)

uiwait(errordlg(’Debe estar dentro del rango (0,4).’ ,’Error!’ ));

set(gcbo,’String’ ,’3.99’ );

elseif (str2num(get(gcbo,’String’ ))<=0)

uiwait(errordlg(’Debe estar dentro del rango (0,4).’ ,’Error!’ ));

set(gcbo,’String’ ,’0.01’ );

end;

case ’P419p’ ,

if (0>=str2num(get(gcbo,’String’ )))|(200<=str2num(get(gcbo,’String’ )))

uiwait(warndlg(’Puede que sean modificados los bits de guarda en la codificacin.’ ,’Advertencia!’ ));

end;

case ’P331p’ ,

if str2num(get(gco,’String’ )) <= 0

uiwait(errordlg(’Debe ser un nmero mayor que 0.’ ,’Error!’ ));

end;

case ’P332p’ ,

if str2num(get(gco,’String’ )) <= 0

uiwait(errordlg(’Debe ser un nmero mayor que 0.’ ,’Error!’ ));

end;

Page 207: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 203

case ’P333p’ ,

if str2num(get(gco,’String’ )) <= 0

uiwait(errordlg(’Debe ser un nmero mayor que 0.’ ,’Error!’ ));

end;

case ’P338p’ ,

if get(gcbo,’Value’ )

set(findobj(’Tag’ ,’P339p’ ),’Value’ ,0);

set(findobj(’Tag’ ,’P341p’ ),’Enable’ ,’off’ );

end;

case ’P339p’ ,

if get(gcbo,’Value’ )

set(findobj(’Tag’ ,’P338p’ ),’Value’ ,0);

set(findobj(’Tag’ ,’P341p’ ),’Enable’ ,’on’ );

else set(findobj(’Tag’ ,’P341p’ ),’Enable’ ,’off’ );

end;

case ’P341p’ ,

step path = get(gcbo,’UserData’ );

answer=inputdlg({’Introducir direccin y nombre del fichero:’},’Anchos de Cuantizacin’ ,1,{step path});if ~isempty(answer)

if ~isempty(answer{1})set(gcbo,’UserData’ ,answer{1});

else uiwait(errordlg(’Datos incorrectos. El campo est vaco.’ ,’Error!’ ));

ControlParameter(’P341p’ );

end;

else set(findobj(’Tag’ ,’P341p’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P339p’ ),’Value’ ,0);

end;

case ’P420p’ ,

def = {get(gcbo,’UserData’ )};title = ’Aadir Parmetros JPEG2000’ ;

added flags = inputdlg({’Se aadirn las opciones escritas:’},title,2,def);if ~isempty(added flags)

if ~isempty(added flags{1})set(gcbo,’UserData’ ,added flags{1});

else uiwait(errordlg(’Datos incorrectos. El campo est vaco.’ ,’Error!’ ));

ControlParameter(’P420p’ );

end;

end;

case ’P342p’ ,

if get(gcbo,’Value’ )

set(findobj(’Tag’ ,’P343p’ ),’Enable’ ,’on’ );

else set(findobj(’Tag’ ,’P343p’ ),’Enable’ ,’off’ );

end;

case ’P343p’ ,

rate = get(findobj(’Tag’ ,’P342p’ ),’UserData’ );

step path = get(gcbo,’UserData’ );

prompt = {’Introduce Tasa:’ ,’Introduce direccin y nombre del fichero:’};answer=inputdlg(prompt,’Pesos Visuales Progresivos’ ,1,{rate,step path});if ~isempty(answer)

if ~isempty(answer{1})&~isempty(answer{2})set(findobj(’Tag’ ,’P342p’ ),’UserData’ ,answer{1});set(gcbo,’UserData’ ,answer{2});

else

uiwait(errordlg(’Algn campo est incompleto.’ ,’Error!’ ));

ControlParameter(’P343p’ );

end;

else

set(findobj(’Tag’ ,’P342p’ ),’Value’ ,0);

set(gcbo,’Enable’ ,’off’ );

end;

case ’P350p’ ,

value = str2num(get(findobj(’Tag’ ,’P350p’ ),’String’ ));

if 1 < value

set(gcbo,’String’ ,’1’ );

uiwait(errordlg(’Fuera de Rango [0,1].’ ,’Error!’ ));

elseif value < 0

set(gcbo,’String’ ,’0.0’ );

uiwait(errordlg(’Fuera de Rango [0,1].’ ,’Error!’ ));

end;

case ’P351p’ ,

value = str2num(get(findobj(’Tag’ ,’P351p’ ),’String’ ));

if 1 < value

set(gcbo,’String’ ,’1’ );

uiwait(errordlg(’Fuera de Rango [0,1].’ ,’Error!’ ));

elseif value < 0

set(gcbo,’String’ ,’0.0’ );

uiwait(errordlg(’Fuera de Rango [0,1].’ ,’Error!’ ));

end;

case ’P355p’ ,

value level = 9 - get(findobj(’Tag’ ,’P101p’ ),’Value’ );

value = 9 - get(gcbo,’Value’ ) ;

if value level < value

set(gcbo,’Value’ ,9-value level);

end;

case ’P413p’ ,

set(gcbo,’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P414p’ ),’Value’ ,0,’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P415p’ ),’Value’ ,0,’Enable’ ,’on’ );

case ’P414p’ ,

set(gcbo,’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P413p’ ),’Value’ ,0,’Enable’ ,’on’ );

Page 208: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

204 Capıtulo 7. Anexos

set(findobj(’Tag’ ,’P415p’ ),’Value’ ,0,’Enable’ ,’on’ );

case ’P415p’ ,

set(gcbo,’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P413p’ ),’Value’ ,0,’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P414p’ ),’Value’ ,0,’Enable’ ,’on’ );

case ’P416p’ ,

set(findobj(’Tag’ ,’P417p’ ),’Value’ ,0);

case ’P417p’ ,

set(findobj(’Tag’ ,’P416p’ ),’Value’ ,0);

otherwise uiwait(warndlg(’Botn Desconocido. Chequea llamadas a ’’ControlParameter’’.’ ,’Advertencia!!’ ));

end;

function ShowParam;

% Controla la visibilidad de las botones de cada seccin.%% J2MT - Rafael Redondo Tejedor 2002 (c)

actbtn = gcbo;

btn = findobj(’Tag’ ,get(findobj(’Tag’ ,’FrameParam’ ),’UserData’ ));

if ~(btn == actbtn)

Parameters1 = [’P101p’ ;’P101t’ ;’P102t’ ;’P102p’ ;’P103p’ ;’P103t’ ;’P104p’ ;’P104t’ ; ...

’P105t’ ;’P105p’ ;’P106p’ ;’P106t’ ;’P107p’ ;’P107t’ ;’P108p’ ;’P108t’ ; ...

’P109p’ ;’P109t’ ;’P110t’ ;’P110p’ ;’P111p’ ;’P112p’ ;’P113p’ ;’P114p’ ;’P115p’ ;’P116p’ ; ...

’P117p’ ;’P118p’ ;’P121p’ ;’P122p’ ;’P132t’ ;’P133t’ ;’P134t’ ;’P135t’ ; ...

’P131p’ ;’P132p’ ;’P133p’ ;’P134p’ ;’P135p’ ;’P141p’ ;’P142p’ ;’P143p’ ; ...

’P144p’ ;’P145p’ ;’P151p’ ;’P152p’ ;’P153p’ ;’P154p’ ;’P155p’ ; ...

’P160p’ ;’P161p’ ;’P162p’ ;’P162t’ ;’P163p’ ;’P163t’ ;’P164p’ ;’P164t’ ; ...

’P165t’ ;’P166t’ ;’P167t’ ;’P166p’ ;’P170p’ ;’P170t’ ;’P171p’ ;’P171t’ ];

Parameters2 = [’P201p’ ;’P202p’ ;’P202t’ ;’P203p’ ;’P203t’ ;’P204p’ ;’P204t’ ; ’P205p’ ;’P205t’ ;...

’P210t’ ;’P211p’ ;’P211t’ ;’P212p’ ;’P212t’ ;’P213t’ ; ...

’P213p’ ;’P214p’ ;’P214t’ ;’P215p’ ;’P215t’ ;’P216t’ ;’P216p’ ;’P217t’ ;’P217p’ ; ...

’P218p’ ;’P218t’ ;’P219p’ ;’P219t’ ;’P221t’ ;’P221p’ ; ...

’P222p’ ;’P222t’ ;’P223p’ ;’P223t’ ;’P224p’ ;’P224t’ ; ...

’P228t’ ;’P228p’ ;’P229p’ ;’P230p’ ;’P234t’ ;’P234p’ ;’P235t’ ;’P235p’ ;...

’P236t’ ;’P236p’ ;’P237t’ ;’P237p’ ];

Parameters3 = [’P301p’ ;’P301t’ ;’P302p’ ;’P302t’ ;’P303p’ ;’P303t’ ;’P304p’ ;’P304t’ ;’P305p’ ; ...

’P310p’ ;’P310t’ ;’P311p’ ;’P311t’ ;’P312p’ ;’P312t’ ; ...

’P315p’ ;’P315t’ ;’P316p’ ;’P316t’ ;’P317p’ ;’P318t’ ;’P318p’ ;’P319p’ ; ...

’P320p’ ;’P321p’ ;’P321t’ ;’P331p’ ;’P331t’ ;’P332p’ ;’P332t’ ;’P333p’ ;’P333t’ ; ...

’P321p’ ;’P338p’ ;’P338t’ ;’P339p’ ;’P339t’ ;’P341p’ ;’P342p’ ;’P342t’ ; ...

’P343p’ ;’P350p’ ;’P350t’ ;’P351p’ ;’P351t’ ;’P352p’ ;’P352t’ ;’P353p’ ;’P353t’ ; ...

’P354p’ ;’P354t’ ;’P355p’ ;’P355t’ ;’P356p’ ;’P356t’ ];

Parameters4 = [’P401p’ ;’P401t’ ;’P402p’ ;’P402t’ ;’P403p’ ;’P403t’ ;’P404p’ ;’P404t’ ; ...

’P410t’ ;’P411p’ ;’P412p’ ;’P413t’ ;’P413p’ ;’P414t’ ;’P414p’ ;’P415t’ ;’P415p’ ; ...

’P416t’ ;’P416p’ ;’P417t’ ;’P417p’ ;’P418t’ ;’P418p’ ;’P419t’ ;’P419p’ ;’P420p’ ];

switch get(btn,’Tag’ )

case ’Param1’ ,

for i=1:length(Parameters1(:,1))

set(findobj(gcbf,’Tag’ ,Parameters1(i,:)),’Visible’ ,’off’ );

end;

set(findobj(gcbf,’Tag’ ,’Param1t’ ),’Visible’ ,’off’ );

case ’Param2’ ,

for i=1:length(Parameters2(:,1))

set(findobj(gcbf,’Tag’ ,Parameters2(i,:)),’Visible’ ,’off’ );

end;

set(findobj(gcbf,’Tag’ ,’Param2t’ ),’Visible’ ,’off’ );

case ’Param3’ ,

for i=1:length(Parameters3(:,1))

set(findobj(gcbf,’Tag’ ,Parameters3(i,:)),’Visible’ ,’off’ );

end;

set(findobj(gcbf,’Tag’ ,’Param3t’ ),’Visible’ ,’off’ );

case ’Param4’ ,

for i=1:length(Parameters4(:,1))

set(findobj(gcbf,’Tag’ ,Parameters4(i,:)),’Visible’ ,’off’ );

end;

set(findobj(gcbf,’Tag’ ,’Param4t’ ),’Visible’ ,’off’ );

end;%switch get(btn,’Tag’)set(btn,’FontWeight’ ,’normal’ ,’Enable’ ,’on’ );

switch get(actbtn,’Tag’ )

case ’Param1’ ,

for i=1:length(Parameters1(:,1))

set(findobj(gcbf,’Tag’ ,Parameters1(i,:)),’Visible’ ,’on’ );

end;

set(findobj(gcbf,’Tag’ ,’Param1t’ ),’Visible’ ,’on’ );

case ’Param2’ ,

for i=1:length(Parameters2(:,1))

set(findobj(gcbf,’Tag’ ,Parameters2(i,:)),’Visible’ ,’on’ );

end;

set(findobj(gcbf,’Tag’ ,’Param2t’ ),’Visible’ ,’on’ );

case ’Param3’ ,

for i=1:length(Parameters3(:,1))

set(findobj(gcbf,’Tag’ ,Parameters3(i,:)),’Visible’ ,’on’ );

end;

set(findobj(gcbf,’Tag’ ,’Param3t’ ),’Visible’ ,’on’ );

case ’Param4’ ,

Page 209: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 205

for i=1:length(Parameters4(:,1))

set(findobj(gcbf,’Tag’ ,Parameters4(i,:)),’Visible’ ,’on’ );

end;

set(findobj(gcbf,’Tag’ ,’Param4t’ ),’Visible’ ,’on’ );

end;%switch get(btn,’Tag’)set(actbtn,’FontWeight’ ,’bold’ ,’Enable’ ,’inactive’ );

set(findobj(’Tag’ ,’FrameParam’ ),’UserData’ ,get(actbtn,’Tag’ ));

end;

function Imagenmenu(hfig, cmd)

% Controla las opciones del men ’Imagen’:%% FileOpen: abre una imagen *.PGM% Openjp2: abre una imagen *.JP2% FileSaveAsjp2: guarda imagen comprimida *.JP2% FileSaveAs: guarda imagen reconstruida *.PGM%% ¡hfig¿-figura activa% ¡cmd¿-Opcin%% J2MT - Rafael Redondo Tejedor 2002 (c)% Adaptacin de: FILEMENU% Damian T. Packer, 11 June 1998 (c) by The MathWorks, Inc.

LASTEXPORTEDASTYPE=’FileMenuFcnLastExportedAsType’;

LASTEXPORTEDASNAME=’FileMenuFcnLastExportedAsName’;

error(nargchk(2,2,nargin));

ispc = strcmp(computer, ’PCWIN’ );

if strcmp(cmd, ’FilePost’ )

%% The first time the FilePost callback is called, hide any% non-functional items on Unix, and then deinstall the callback,% since it need happen only once.%if ~ispc

% hide non-functional unix itemsfile = findall(allchild(hfig),’type’ ,’uimenu’ ,’label’ ,’&File’ );

set(findall(file,’label’ ,’Pre&ferences...’ ),’visible’ ,’off’ );

drawnow;

end

else

%% All other callbacks happen to be implemented built-in on the% PC, so just pass the input arguments through if we’re on the% PC. If we’re on Unix, we need to implement the ones we can in% M.

%if ispc% uimenufcn(hfig, cmd);

%else % we’re on UNIX:

switch cmd

case ’FileOpen’

set(findobj(’Tag’ ,’OIbtn’ ),’String’ ,’Abriendo...’ );

% bring up the selection dialog[filename, pathname] = uigetfile(’*.pgm’ , ’Nueva Imagen’ );

if filename~=0

[path,name,ext,ver] = fileparts(filename);

if ~strcmp(ext,’.pgm’ )

uiwait(errordlg(’Formato de imgen no vlido.’ ,’Error!’ ));

Imagenmenu(gcbf,’FileOpen’ );

else

try

subplot(1,4,2); delete(gca);

subplot(1,4,3); delete(gca);

subplot(1,4,4); delete(gca);

set(findobj(gcbf,’Tag’ ,’TF’ ),’Visible’ ,’on’ );

set(findobj(gcbf,’Tag’ ,’RF’ ),’Visible’ ,’on’ );

[OI,map] = pgmread([pathname filename]);

colormap(map);

Coord = get(findobj(gcbf,’Tag’ ,’OF’ ),’Position’ );

subplot(1,4,1); imagesc(OI.^0.45); axis off;

set(gca,’Units’ ,’normalized’ ,’Position’ ,Coord,’Color’ ,[0.75 0.75 0.75]);

set(findobj(’Tag’ ,’P401t’ ),’UserData’ ,gca);

set(findobj(gcbf,’Tag’ ,’OF’ ),’Visible’ ,’off’ );

catch

errordlg(lasterr,’Error Cargando Imagen’ ,’modal’ );

uiwait;

end;

Page 210: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

206 Capıtulo 7. Anexos

[s1,s2,s]=size(OI);

set(findobj(’Tag’ ,’SizeText’ ),’String’ ,[num2str(s1) ’ x ’ num2str(s2)]);

set(findobj(’Tag’ ,’btnStart’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’OIbtn’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’btnerr’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’TIbtn’ ),’Enable’ ,’inactive’ );

set(findobj(’Tag’ ,’RIbtn’ ),’Enable’ ,’inactive’ );

set(findobj(’Tag’ ,’P411p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P412p’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Manipular...’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’RateText’ ),’String’ ,’’ );

set(findobj(’Tag’ ,’MSEdB’ ),’String’ ,’PSNR (dB):’ );

set(findobj(’Tag’ ,’MSE’ ),’String’ ,’MSE:’ );

set(findobj(’Tag’ ,’Mean’ ),’String’ ,’Media:’ );

set(findobj(’Tag’ ,’P160p’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Guardar Imagen’ ),’Enable’ ,’off’ );

set(findobj(’Label’ ,’Imagen Original’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Imagen Transformada’ ),’Enable’ ,’off’ );

set(findobj(’Label’ ,’Imagen Reconstruida’ ),’Enable’ ,’off’ );

set(findobj(’Label’ ,’Imagen Error’ ),’Enable’ ,’off’ );

set(hfig,’Name’ ,[’JPEG2000 MATLAB TOOLBOX: ’ filename]);

set(findobj(’Tag’ ,’P401p’ ),’UserData’ ,’’ );

set(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ ,fullfile(pathname,filename));

end;

end;

set(findobj(’Tag’ ,’OIbtn’ ),’String’ ,’Imagen Original’ );

case ’Openjp2’ ,

set(findobj(’Tag’ ,’RIbtn’ ),’String’ ,’Abriendo...’ );

[filename, pathname] = uigetfile(’*.jp2’ , ’Cargar *.jp2’ );

if filename~=0

[path,name,ext,ver] = fileparts(filename);

if ~strcmp(ext,’.jp2’ )

uiwait(errordlg(’Formato de imgen no vlido.’ ,’Error!’ ));

Imagenmenu(gcbf,’Openjp2’ );

else

try

jp2 path = get(findobj(’Tag’ ,’&Imagenuimenu5’ ),’UserData’ );

jp2 path = [jp2 path filesep];

OptionCer = questdlg(’El archivo contiene proteccn frente a errores?’ , ...

’Cargando *.jp2’ ,’Si’ ,’No’ ,’No’ );

if strcmp(OptionCer,’Si’ )

Cer = ’ -Cer’ ;

else Cer = ’’ ;

end;

OptionFconv = questdlg(’La imagen ha sido obtenida mediante convolucin?’ , ...

’Cargando *.jp2’ ,’Si’ ,’No’ ,’No’ );

if strcmp(OptionFconv,’Si’ )

Fconv = ’ -Fconv’ ;

else Fconv = ’’ ;

end;

if strcmp(computer,’PCWIN’ )

Cno speedup = ’ -Cno speedup’ ;

else Cno speedup = ’’ ;

end;

file = fullfile(pathname,filename);

show info = 0;

if get(findobj(’Tag’ ,’P235p’ ),’Value’ )

Dmem = ’ -mem ’ ; show info = 3;

else Dmem = ’’ ;

end;

if get(findobj(’Tag’ ,’P237p’ ),’Value’ )

Dcpu = ’ -Ccpu ’ ;show info = 3;

else Dcpu = ’’ ;

end;

eval([’!’ jp2 path ’vm8 expand 32 -i ’ file ’ -o tmpr.pgm -Xwt output tmpt.ppm’ ...

Cno speedup Dmem Dcpu Cer Fconv ’ > Dresults.txt’ ]);

if size(dir(’tmpr.pgm’ ))

subplot(1,4,1); delete(gca);

subplot(1,4,4); delete(gca);

[RI,map] = pgmread(’tmpr.pgm’ );

Coord = get(findobj(gcbf,’Tag’ ,’RF’ ),’Position’ );

subplot(1,4,2); imagesc(RI.^0.45); axis off;

set(gca,’Units’ ,’normalized’ ,’Position’ ,Coord,’Color’ ,[0.75 0.75 0.75]);

[s1,s2,s] = size(RI);

set(findobj(’Tag’ ,’SizeText’ ),’String’ ,[num2str(s1) ’ x ’ num2str(s2)]);

size file = dir(file);

set(findobj(’Tag’ ,’RateText’ ),’String’ ,[num2str((size file.bytes)*8/(s1*s2)) ’ bpp’ ]);

[TI,map] = ppmread(’tmpt.ppm’ );

Coord = get(findobj(gcbf,’Tag’ ,’TF’ ),’Position’ );

subplot(1,4,3); imagesc(TI.^0.45); axis off;

set(gca,’Units’ ,’normalized’ ,’Position’ ,Coord,’Color’ ,[0.75 0.75 0.75]);

set(findobj(gcbf,’Tag’ ,’OF’ ),’Visible’ ,’on’ );

set(findobj(gcbf,’Tag’ ,’TF’ ),’Visible’ ,’off’ );

set(findobj(gcbf,’Tag’ ,’RF’ ),’Visible’ ,’off’ );

set(findobj(’Tag’ ,’P401p’ ),’UserData’ ,’’ );

set(findobj(’Label’ ,’Guardar Imagen’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Manipular...’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Imagen Original’ ),’Enable’ ,’off’ );

set(findobj(’Label’ ,’Imagen Transformada’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Imagen Reconstruida’ ),’Enable’ ,’on’ );

Page 211: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 207

set(findobj(’Label’ ,’Imagen Error’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’btnerr’ ),’Enable’ ,’off’ )

set(findobj(’Tag’ ,’OIbtn’ ),’Enable’ ,’inactive’ );

set(findobj(’Tag’ ,’TIbtn’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’RIbtn’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’MSEdB’ ),’String’ ,’MSE (dB):’ );

set(findobj(’Tag’ ,’MSE’ ),’String’ ,’MSE:’ );

set(findobj(’Tag’ ,’Mean’ ),’String’ ,’Media:’ );

set(findobj(’Tag’ ,’P160p’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P411p’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P412p’ ),’Enable’ ,’off’ );

if show info

Showresults(show info);

end;

end;%if size(dir(’tmpr.pgm’))catch

uiwait(errordlg(lasterr,’Error Cargando Imagen’ ,’modal’ ));

end;

end;%if ˜strcmp(ext,’.jp2’)end;%if filename˜=0set(findobj(’Tag’ ,’RIbtn’ ),’String’ ,’Imagen Reconstruida’ );

%No use, use the FILESAVE casecase ’FileSave’

filename = get(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ );

[pathname,fileout,ext,ver] = fileparts(filename);

fileout = [fileout,’.jp2’ ];

try

eval([’!cp tmp.jp2’ pathname fileout]);

catch

errordlg(lasterr,’Error Guardando Imagen’ ,’modal’ );

uiwait;

end;

case ’FileSaveAsjp2’

filename = get(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ );

[pathname,fileout,ext,ver] = fileparts(filename);

Filename = [pathname filesep fileout ’.jp2’ ];

% Bring up user selection dialog% if no file name is entered, repeatnewfile=’’ ;

while isempty(newfile)

[newfile, newpath] = uiputfile(Filename, ’Guardar Imagen Comprimida’ );

end;

if newfile~=0

% if cancel button was not pressed% save the figurefullfilename=fullfile(newpath,newfile);

try

if ispc

eval([’!copy tmp.jp2 ’ fullfilename]);

else

eval([’!cp tmp.jp2 ’ fullfilename]);

end;

catch

errordlg(lasterr,’Error Guardando Imagen Comprimida’ ,’modal’ );

uiwait;

end

set(hfig,’Name’ ,[’Tool Box Compression: ’ newfile]);

end;

case ’FileSaveAs’

filename = get(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ );

[pathname,fileout,ext,ver] = fileparts(filename);

Filename = [pathname filesep fileout ’r.pgm’ ];

% Bring up user selection dialog% if no file name is entered, repeatnewfile=’’ ;

while isempty(newfile)

[newfile, newpath] = uiputfile(Filename, ’Guardar Imagen Reconstruida’ );

end;

if newfile~=0

% if cancel button was not pressed% save the figurefullfilename=fullfile(newpath,newfile);

try

if ispc

eval([’!copy tmpr.pgm ’ fullfilename]);

else

eval([’!cp tmpr.pgm ’ fullfilename]);

end;

catch

errordlg(lasterr,’Error Guardando Imagen Reconstruida’ ,’modal’ );

uiwait;

end

set(hfig,’Name’ ,[’Tool Box Compression: ’ newfile]);

end;

end;

Page 212: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

208 Capıtulo 7. Anexos

function ShowHelp(message)

% Muestra mensajes de ayuda del funcionamiento del J2MT.%% ¡message¿-tipo de mensaje ayuda:% About, menus, Wavelet, C1% C2, R&C, Statistics.%% J2MT - Rafael Redondo Tejedor 2002 (c)

switch message

case ’About’ ,

txt = sprintf([’ JPEG 2000 MATLAB TOOLBOX - Version 1.0 (C) \n’ ...

’ ...-.-.-....\n\n’ ...

’ Autor: Rafael Redondo Tejedor\n\n’ ...

’ Instituto de ptica de Madrid (CSIC)’ ]);

msgbox(txt,’Acerca de JPEG 2000 Matlab Toolbox’ );

case ’menus’ ,

txt = sprintf([’ IMAGEN:\n\n’ ...

’ - NUEVA IMAGEN: abre la imagen a comprimir. Slo formato PGM.\n’ ...

’ - CARGAR *.JP2: descomprime un archivo con formato JP2.\n’ ...

’ - GUARDAR IMAGEN: Guarda la imagen Recontruida (PGM) y/o la Comprimida (JP2).\n’ ...

’ - RUTA VM: ruta en la que se encuantran los compresores (VerificationModel). ’ ...

’Por defecto es el directorio de carga de Matlab.\n’ ...

’ - EXPANDIR MENU: se habilitan o deshabilitan los mens por defecto de Matlab.\n’ ...

’ - MANIPULAR: Se presenta las imgenes Origonal, Transformada, Comprimida y ’ ...

’Error en verdadera dimensin con una correccin gamma de 0.45.\n’ ...

’ - SALIR: cierra el programa.\n\n’ ...

’ AYUDA J2MT: mens con la ayuda de cada una de las partes del J2MT.’ ]);

msgbox(txt,’Mens J2MT’ );

case ’Wavelet’ ,

txt = sprintf([’ TIPOS DE FILTROS:\n\n’ ...

’ - NO REVERSIBLE: se utilizan filtros no reversibles en la transformacin.\n’ ...

’ - REVERSIBLE: se utilizan filtros reversibles en la transformacin.\n’ ...

’ - ESTANDAR: se utilizan los filtros estndar. Daubechies (9,7) no reversibles y entero (5,3) reversibles.\n’ ...

’ - OTROS: filtros definidos por el usuario (mediante archivo).\n\n’ ...

’ IMPLEMENTACION:\n\n’ ...

’ - CONVOLUCION: obtencin de la transformada wavelet mediante convolucin. No posible con filtros reversibles.\n\n’ ...

’ - LIFTING: operacin alternativa a la convolucin con los mismos resultados.\n’ ...

’ DESCOMPOSICION: (H-horizontal, V-vertical, HV-ambos)\n\n’ ...

’ - NIVELES: nmero de niveles de la transformada wavelet.\n’ ...

’ - TIPO: Tipo de descomposicin wavelet. Mallat, Spacl, Packet u otras definibles por el usuario.\n’ ...

’ - NIVEL ACTIVO: nivel que se desea modificar.\n’ ...

’ - DESCOMPOSICION DE NIVEL: primera descomposicin de nivel. Se elige el tipo y el nmero de descomposiciones del nivel.\n’ ...

’ - SUBNIVEL: tipo de descomposicin de la primera iteracin, segunda descomposicin.\n’ ...

’ - DESCOMPOSICION DE SUBNIVELES: tipo de descomposicin de la segunda iteracin, tercera descomposicin.’ ]);

msgbox(txt,’TRANSFORMADA WAVELET’ );

case ’C1’ ,

txt = sprintf([’ TAMAO DE BLOQUE:\n\n’ ...

’ - COORD. X: ancho del bloque.\n’ ...

’ - COORD. Y: alto del bloque.\n\n’ ...

’ TAMAO DEL PRECINTO:\n\n’ ...

’ - DEFECTO: tamao del precinto por defecto. Suele ser el ptimo.\n’ ...

’ - DEFINIR TAMAO: cambiar el tamao del precinto para cada nivel segn la notacin NxN.\n\n’ ...

’ OPCIONES DE CODIFICACION:\n\n’ ...

’ - ORDEN: orden de codificacin en la que se ordenan las capas (L), bloques (P), componentes (C) y resoluciones (R).\n’ ...

’ - CAUSAL: codificacin causal, elimina dependencia entre planos de bit.\n’ ...

’ - PARALELA: codificacin en paralelo de los planos de bit.\n’ ...

’ - SENCILLA: codificacin menos exigente, ms rpida pero con peor tasa.\n’ ...

’ - NUMERO DE CAPAS: nmero de capas de la compresin aritmtica.\n’ ...

’ - RESPETAR BORDES: respeto de los bordes de imagen en los bloques.\n’ ...

’ - NO TRUNCAR: no truncar los planos de bit para la consecucin de una tasa.\n\n’ ...

’ PROTECCION FRENTE A ERRORES:\n\n’ ...

’ - MARCADOR DE SEGMENTO: marca cada pasada en la codificacin.\n’ ...

’ - PROTECCION DE BLOQUE: introduce cdigos de proteccin al final de cada plano de bit.\n’ ...

’ - CABECERA DE PAQUETE: cdigos de proteccin en la cabecera de cada paquete.\n’ ...

’ - COLA DE PAQUETE: cdigos de proteccin al final de cada paquete.\n\n’ ...

’ CONSUMO MEMORIA/TIEMPO:\n\n’ ...

’ - TIEMPO: presenta un mensaje del tiempo de compresin del codificador y/o decodificador.\n’ ...

’ - MEMORIA: presenta un mensaje consumo de memoria en la compresin del codificador y/o decodificador.’ ]);

msgbox(txt,’CODIFICACION I’ );

case ’C2’ ,

txt = sprintf([’ CONTROL DE TASA:\n\n’ ...

’ - LRA: utiliza el mtodo LRA para la aproximacin de la tasa seleccionada en Tasa mxima. Es ms preciso y con una sola iteracin.\n’ ...

’ - TASA MAXIMA: mxima tasa de compresin permitida. Puede dar tasas menores si la elegida es demasiado alta.\n’ ...

’ - TOLERANCIA TASA MAXIMA: mxima tolerancia en la consecucin de la tasa de compresin seleccionada.\n’ ...

’ - TOLERANCIA TASA MINIMA: mnima tolerancia en la consecucin de la tasa de compresin seleccionada.\n\n’ ...

’ CUANTIFICACION: no vlida para filtros reversibles\n\n’ ...

’ - ESCALAR GENERALIZADA: cuantificacin uniforme con zona muerta variable.\n’ ...

’ - CODIFICACION TRELLIS: algoritmo de Viterbi alternativo a la cuantificacin uniforme.\n’ ...

’ - CUANTIFICACION IMPLICITA: se fija un escaln de cuantificacin en potencia de 2. Para las siguientes subbandas se obtienen dividiendo este sucesivamente entre 2. Incompatible con la opcin Anchos de cuantificacin.\n\n’ ...

’ OPCIONES PERCEPTUALES:\n\n’ ...

’ - PESOS CSF: codifica con diferente importancia cada subbanda segn pesos (formato archivo).\n’ ...

’ - VIP: igual que los pesos CSF pero con adaptacin de los mismos segn avanza la codificacin (formato archivo).\n’ ...

’ - ANCHOS DE CUANTIFICACION: el cuantificador utiliza diferentes ancho en funcin de la banda (formato archivo).\n’ ...

’ - MASCARA ESTANDAR: Utiliza una mscara visual para enmascarar coeficientes. Incompatible con la otra mscara.\n’ ...

’ - MASCARA PERCEPTUAL: habilita una mscara perceptual ms completa. Deshabilita la estndar.\n’ ...

’ PESO DEL PIXEL: correcin gamma.\n’ ...

’ PESOS DE VECINOS: peso del enmascaramiento del coeficiente respecto de los vecinos.\n’ ...

’ RESPETAR BLOQUES: la mscara tendr en cuenta los bordes de los bloques.\n’ ...

’ ANCHO DE MASCARA: tamao de la mscara. Slo los valores de inters son permitidos.\n’ ...

Page 213: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 209

’ BITS RETENIDOS: bits que sern tenidos en cuenta en el enmascaramiento, empezando por el MSB.\n’ ...

’ NIVEL MINIMO: nivel mnimo a partir del cual se aplicar la mscara.’ ]);

msgbox(txt,’CODIFICACION II’ );

case ’R&C’ ,

txt = sprintf([’ SELECCIONAR ROI:\n\n’ ...

’ - TIPO CUADRADO: seleccin de la ROI cuadrada. Pinchar sobre la imagen original y desplazar el ratn.\n’ ...

’ - TIPO CIRCULO: seleccin de la ROI circular. Pinchar sobre la imagen original y desplazar el ratn.\n\n’ ...

’ METODO ROI:\n\n’ ...

’ - GENERICO: cada ROI tiene su propio realce.\n’ ...

’ - IGUALADO POR BLOQUES: las ROI adquieren un realce comn.\n’ ...

’ - PARTICION IMPLICITA: tambin llamada self-masking, se establece un umbral para cada ROI. Necesita un realce mayor de 13.\n\n’ ...

’ TRANSFORMACION DE COLOR:\n\n’ ...

’ - NO REVERSIBLE: utiliza una transformada no reversible para la obtencin de las componentes de luminancia y diferencia de color.\n’ ...

’ - REVERSIBLE: utiliza la transformada RCT reversible.\n\n’ ...

’ OTROS:\n\n’ ...

’ - BITS DE GUARDA: bits de guarda en la precisin del codificador.\n’ ...

’ - VALOR DE OFFSET: valor de offset en el pretratamiento de la imagen.\n’ ...

’ - ANADIR PARAMETROS: aade en la lnea de comandos cualquier parmetro a continuacin de los especificados.’ ]);

msgbox(txt,’ROI & COLOR’ );

case ’Statistics’ ,

txt = sprintf([’ - TASAS: compresin en ’’bpp’’ segn el tamao del archivo final comprimido y relacin (x:1).\n’ ...

’ - PSNR: medida del error segn la frmula 20*log(1/X), donde X es la imagen error normalizada.\n’ ...

’ - MSE: error cuadrtico medio. Diferencia de cuadrdos entre la imagen original y reconstruida.\n’ ...

’ - MEAN: media del error con valores con signo.\n’ ]);msgbox(txt,’ESTADISTICAS’ );

end;

function ControlROI(form)

% Control de seleccin de ROI:% Presenta dinmicamente en pantalla la forma% de ROI elegida con los mensajes de error% correspondientes si las simensiones no son% correctas. Restablece el cursor presentando% en pantalla la ROI final y almacena sus% coordenadas.%% ¡form¿-tipo de ROI (1 crculo, 0 rectangular)%% J2MT - Rafael Redondo Tejedor 2002 (c)

figure(gcf);

k = waitforbuttonpress;

if strcmp(get(gcf,’Pointer’ ),’crosshair’ )

dim = get(findobj(’Tag’ ,’SizeText’ ),’String’ );

i = 1;

while ~strcmp(dim(i),’ ’ )

i=i+1;

end;

s1 = str2num(dim(1:i));

s2 = str2num(dim(i+3:length(dim)));

if form

pos = get(gca,’Position’ );

circle = Drawcircle([s1 s2]); % return figure unitsh = circle{1};if s1>=s2 s = s1;

else s = s2; end;

coord = [[circle{2}(2) circle{2}(1) circle{2}(3)]./[s2 s1 s] 1]; % last coord only for controlelse

pos = get(gca,’Position’ );

point1 = get(gcf,’CurrentPoint’ ); % button down detectedfinalRect = rbbox; % return figure unitspoint2 = get(gcf,’CurrentPoint’ ); % button up detected%%% highlight area drawn in main figurepoint1 = [(point1(1,1)-pos(1))/pos(3) (point1(1,2)-pos(2))/pos(4)]; % extract x and ypoint2 = [(point2(1,1)-pos(1))/pos(3) (point2(1,2)-pos(2))/pos(4)];

p1 = min(point1,point2); % calculate locationsoffset = abs(point1-point2); % and dimensions

x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];

y = [1-(p1(2)+offset(2)) 1-(p1(2)+offset(2)) 1-p1(2) 1-p1(2) 1-(p1(2)+offset(2))];

hold on

axis manual

h = plot(x.*s1,y.*s2); % redraw in dataspace units

%%% highlight area drawn in main figurerinf = min(point1(2),point2(2));

rsup = max(point1(2),point2(2));

cinf = min(point1(1),point2(1));

csup = max(point1(1),point2(1));

coord=[1-rsup cinf rsup-rinf csup-cinf];

end;%if formif strcmp(get(gcf,’Pointer’ ),’crosshair’ )

if coord(3)&coord(4)

boost = get(findobj(’Tag’ ,’P411p’ ),’UserData’ );

if form

type = ’C’ ;

Page 214: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

210 Capıtulo 7. Anexos

else type = ’R’ ;

end;

figures = get(findobj(’Tag’ ,’P401p’ ),’UserData’ );

if ~isempty(figures)

separator = ’ ’ ;

else separator = ’’ ;

end;

new figure = [separator boost{1} ’ ’ type];

for i=1:4-form

new figure = [new figure ’ ’ num2str(coord(i))];

end;

set(findobj(’Tag’ ,’P401p’ ),’UserData’ ,[figures new figure]);

hs = get(findobj(’Tag’ ,’P410t’ ),’UserData’ );

set(findobj(’Tag’ ,’P410t’ ),’UserData’ ,[hs h]);

else

cleanControlROI

uiwait(errordlg(’Alguna de las dimensiones es 0.’ ,’Error!’ ));

delete(h);

end;%if coord(3)&coord(4)else

delete(h);

uiwait(errordlg(’Alguna de las dimensiones es mayor que la imagen.’ ,’Error!’ ));

end;%if strcmp(get(gcf,’Pointer’),’crosshair’)cleanControlROI

else

cleanControlROI

end;%if strcmp(get(gcf,’Pointer’),’crosshair’)

function cleanControlROI

set(gcbo,’FontWeight’ ,’normal’ );

set(findobj(’Tag’ ,’P410t’ ),’String’ ,’’ );

set(gcf,’WindowButtonMotionFcn’ ,’’ ,’Pointer’ ,’arrow’ );

function GetROI(form);

% Seleccin de ROI:% Activa el control de la forma del cursor.% Presenta menu para la eleccin del realce.% Activa el control de la seleccin de ROI.%% ¡form¿-tipo de ROI%% J2MT - Rafael Redondo Tejedor 2002 (c)

subplot(get(findobj(’Tag’ ,’P401t’ ),’UserData’ ));

set(findobj(’Tag’ ,’P411p’ ),’FontWeight’ ,’normal’ );

set(findobj(’Tag’ ,’P412p’ ),’FontWeight’ ,’normal’ );

set(gcbo,’FontWeight’ ,’bold’ );

boost=inputdlg({’Introduce el realce en bits:’},’Realce de ROI’ ,1,{’8’});if ~isempty(boost)

if str2num(boost{1})if ~((str2num(boost{1})<14)&(get(findobj(’Tag’ ,’P415p’ ),’Value’ )==1))set(findobj(’Tag’ ,’P411p’ ),’UserData’ ,boost);

subplot(get(findobj(’Tag’ ,’P401t’ ),’UserData’ ));

set(gcf,’WindowButtonMotionFcn’ ,’Controlcursor(’’crosshair’’);’ );

str help = ’Arrasta el cursor en la imagen original.’ ;

set(findobj(’Tag’ ,’P410t’ ),’String’ ,str help);

if isempty(get(findobj(’Tag’ ,’P401p’ ),’UserData’ ))

figures = get(findobj(’Tag’ ,’P410t’ ),’UserData’ );

for i=1:length(figures)

delete(figures(i));

end;

set(findobj(’Tag’ ,’P410t’ ),’UserData’ ,’’ );

end;

ControlROI(form);

else

errordlg(’El realce debe ser mayor de 13 para ROI implcita.’ ,’Error!’ );

set(gcbo,’FontWeight’ ,’normal’ );

end;

else

warndlg(’Debe tener un valor positivo’ ,’Advertencia!’ );

end;

else

set(gcbo,’FontWeight’ ,’normal’ );

end;

function Controlcursor(point);

% Controla la forma del cursor en funcin% de las coordenadas del ste y los ejes.%

Page 215: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 211

% ¡point¿-forma del cursor%% J2MT - Rafael Redondo Tejedor 2002 (c)

ps = get(gca,’Position’ );

pt = get(gcf,’CurrentPoint’ );

if (pt(1,1)>ps(1) & pt(1,1)<ps(1)+ps(3) & pt(1,2)>ps(2) & pt(1,2)<ps(2)+ps(4))

set(gcf,’Pointer’ ,point);

else

set(gcf,’Pointer’ ,’arrow’ );

end;

function final circle = Drawcircle(s)

% Dibuja dinmicamente un cculo en la% imagen en funcin del cursor.%% J2MT - Rafael Redondo Tejedor 2002 (c)

x=get(gcf,’CurrentPoint’ );

p=get(gca,’Position’ );

hold on;

if s(1)>=s(2)

rel dim = 1;

else rel dim = 2;

end;

c = [((x(1,1:2)-[p(1) p(2)]).*s)./p(3:4)];

c(2) = s(2) - c(2);

h=rectangle(’Position’ ,[c eps eps],’Curvature’ ,[1 1]);

set(h,’LineStyle’ ,’--’ );

set(gca,’UserData’ ,struct(’C’ ,c,’R’ ,h,’P’ ,p,’S’ ,s,’r’ ,0));

rs = num2str(rel dim);

rss = num2str(rel dim+2);

offset = num2str(rel dim-1);

sign = num2str(rel dim*2-3);

T=’x=get(gcf,’’CurrentPoint’’);CRPS=get(gca,’’UserData’’);’;

T=[T ’radius=abs(CRPS.C(’ rs ’)-(’ offset ’-(x(1,’ rs ’)-CRPS.P(’ rs ’))*’ sign ’/CRPS.P(’ rss ’))*CRPS.S(’ rs ’))+eps;’ ];

T=[T ’set(CRPS.R,’’Position’’,[CRPS.C-radius([1 1]) 2*radius([1 1])]);CRPS.r=radius;set(gca,’’UserData’’,CRPS);’];

old motion = get(gcf,’WindowButtonMotionFcn’ );

set(gcf,’WindowButtonMotionFcn’ ,[old motion T]);

U = [’CRPS=get(gca,’’UserData’’);set(CRPS.R,’’EdgeColor’’,[0 0 1],’’LineStyle’’,’’-’’);’ ...

’set(gcf,’’WindowButtonMotionFcn’’,’’’’);set(gcf,’’WindowButtonUpFcn’’,’’’’);’];

set(gcf,’WindowButtonUpFcn’ ,U);

waitfor(gcf,’WindowButtonMotionFcn’ ,’’ );

CRPS=get(gca,’UserData’ );

final circle = {CRPS.R,[CRPS.C CRPS.r]};

function DecompParam(tag);

% Controla el estado de los botones (act/des)% encargados de la descomposicin wavelet.%% ¡tag¿-etiqueta del objeto activado%% J2MT - Rafael Redondo Tejedor 2002 (c)

if tag(1:3) == ’P11’

level = tag(4);

tag = ’P11’ ;

end;

switch tag

case ’P121p’ ,

switch get(findobj(’Tag’ ,tag),’Value’ )

case 1

for j=3:5

for i=1:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

case 2

for j=3:5

for i=2:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

band;

case 3

band;

Page 216: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

212 Capıtulo 7. Anexos

end;%switch valuebtn = get(findobj(’Tag’ ,’P110t’ ),’UserData’ );

UD = get(findobj(’Tag’ ,btn),’UserData’ );

UD(1,1) = get(findobj(’Tag’ ,’P121p’ ),’Value’ );

set(findobj(’Tag’ ,btn),’UserData’ ,UD);

ShowDecomp(0);

case ’P122p’ ,

btn = get(findobj(’Tag’ ,’P110t’ ),’UserData’ );

UD = get(findobj(’Tag’ ,btn),’UserData’ );

UD(1,2) = get(findobj(’Tag’ ,’P122p’ ),’Value’ );

set(findobj(’Tag’ ,btn),’UserData’ ,UD);

if UD(1,1) > 1

band;

end;

ShowDecomp(0);

case ’P11’ ,

old btn = get(findobj(’Tag’ ,’P110t’ ),’UserData’ );

set(findobj(’Tag’ ,old btn),’FontWeight’ ,’normal’ );

set(findobj(’Tag’ ,[tag level ’p’ ]),’FontWeight’ ,’bold’ );

UD = get(findobj(’Tag’ ,[tag level ’p’ ]),’UserData’ );

for j=2:5

for i=1:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Value’ ,UD(j-1,i));

end;

end;

set(findobj(’Tag’ ,’P121p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P122p’ ),’Enable’ ,’on’ );

for j=3:5

for i=1:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

if 1 < get(findobj(’Tag’ ,’P121p’ ),’Value’ );

band;

end;

set(findobj(’Tag’ ,’P110t’ ),’UserData’ ,[tag level ’p’ ]);

otherwise,

btn = get(findobj(’Tag’ ,’P110t’ ),’UserData’ );

UD = get(findobj(’Tag’ ,btn),’UserData’ );

UD(str2num(tag(3))-1,str2num(tag(4))) = get(findobj(’Tag’ ,tag),’Value’ );

set(findobj(’Tag’ ,btn),’UserData’ ,UD);

if (3==get(findobj(’Tag’ ,[’P121p’ ]),’Value’ ))&(tag(4)==’1’ )

sub band(tag(3));

end;

ShowDecomp(0);

end;

%LOCAL FUNCTIONS

function band;

switch get(findobj(’Tag’ ,’P122p’ ),’Value’ )

case 1,

set(findobj(’Tag’ ,’P131p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P141p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P151p’ ),’Enable’ ,’on’ );

if 3 == get(findobj(’Tag’ ,’P121p’ ),’Value’ )

sub band(’3’ );

sub band(’4’ );

sub band(’5’ );

end;

case 2,

set(findobj(’Tag’ ,’P131p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P141p’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P151p’ ),’Enable’ ,’off’ );

if 3 == get(findobj(’Tag’ ,’P121p’ ),’Value’ )

for j=4:5

for i=2:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

sub band(’3’ );

end;

case 3,

set(findobj(’Tag’ ,’P131p’ ),’Enable’ ,’off’ );

set(findobj(’Tag’ ,’P141p’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’P151p’ ),’Enable’ ,’off’ );

if 3 == get(findobj(’Tag’ ,’P121p’ ),’Value’ )

for j=3:4

for i=2:5

set(findobj(’Tag’ ,[’P1’ num2str(j) num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;

sub band(’4’ );

end;

end;

function sub band(num);

switch get(findobj(’Tag’ ,[’P1’ num ’1p’ ]),’Value’ )

Page 217: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 213

case 1,

for i=2:5

set(findobj(’Tag’ ,[’P1’ num num2str(i) ’p’ ]),’Enable’ ,’on’ );

end;

case 2,

set(findobj(’Tag’ ,[’P1’ num ’2p’ ]),’Enable’ ,’on’ );

set(findobj(’Tag’ ,[’P1’ num ’3p’ ]),’Enable’ ,’on’ );

set(findobj(’Tag’ ,[’P1’ num ’4p’ ]),’Enable’ ,’off’ );

set(findobj(’Tag’ ,[’P1’ num ’5p’ ]),’Enable’ ,’off’ );

case 3,

set(findobj(’Tag’ ,[’P1’ num ’2p’ ]),’Enable’ ,’on’ );

set(findobj(’Tag’ ,[’P1’ num ’3p’ ]),’Enable’ ,’on’ );

set(findobj(’Tag’ ,[’P1’ num ’4p’ ]),’Enable’ ,’off’ );

set(findobj(’Tag’ ,[’P1’ num ’5p’ ]),’Enable’ ,’off’ );

case 4,

for i=2:5

set(findobj(’Tag’ ,[’P1’ num num2str(i) ’p’ ]),’Enable’ ,’off’ );

end;

end;%switch

function ShowDecomp(fig);

% Crea una imagen de muestra con la% descomposicin wavelet elegida y% obtiene los parmetros de descomposicin% del compresor JPEG2000 (VM).%% ¡fig¿-figura activa%% J2MT - Rafael Redondo Tejedor 2002 (c)

if fig

[I,map] = ppmread(get(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ ));

I = ones(size(I,1),size(I,2))*0.75;

else

I = ones(256,256)*0.75;

end;

[s1,s2,s] = size(I);

C = [1,1,s2,s1];

ok = 1;

level = 9 - get(findobj(’Tag’ ,’P101p’ ),’Value’ );

standard decomp = 1;

Fdecomp = ’’ ; Fgen decomp = ’’ ;

switch get(findobj(’Tag’ ,’P108p’ ),’Value’ )

case 1,

matrix UD = [1 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

for i=1:level-1

matrix UD = [matrix UD;1 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

end;

name = ’Descomposicin Mallat’ ;

case 2,

matrix UD = [2 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

for i=1:level-1

matrix UD = [matrix UD;1 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

end;

name = ’Descomposicin Spacl’ ;

case 3,

matrix UD = [3 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

matrix UD = [matrix UD;2 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

for i=1:level-2

matrix UD = [matrix UD;1 1 0 0 0;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1];

end;

name = ’Descomposicin Packet’ ;

case 4,

standard decomp = 0;

name = ’Descomposicin Personal’ ;

end;

for L = 1:level

if standard decomp

UD = matrix UD(L*4-3:L*4,:);

else

UD = get(findobj(’Tag’ ,[’P11’ num2str(L) ’p’ ]),’UserData’ );

Fdecomp = [Fdecomp num2str(UD(1,1))];

end;

[I,C kk] = MakeDecomp(I,[C(1,1) C(1,2) C(1,3)-1 C(1,4)-1],UD(1,2));

[I,C] = MakeDecomp(I,C(1,:),UD(1,2));

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(1,2))];

end;

if ((C(1,4)-C(1,1))<=2)|((C(1,3)-C(1,2))<=2)

ok = 0;

break;%?end;

if UD(1,1) > 1

if UD(1,2)==1

for i=2:4

Page 218: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

214 Capıtulo 7. Anexos

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(i,1))];

end;

if UD(i,1)~=4

[I,C sub] = MakeDecomp(I,C(i,:),UD(i,1));

if (UD(1,1)==3)

if ((C sub(1,4)-C sub(1,1))<=2)|((C sub(1,3)-C sub(1,2))<=2)

ok = 0;

break;%?end;

if UD(i,1) == 1

[I,C1] = MakeDecomp(I,C sub(1,:),UD(i,2));

[I,C2] = MakeDecomp(I,C sub(2,:),UD(i,3));

[I,C3] = MakeDecomp(I,C sub(3,:),UD(i,4));

[I,C4] = MakeDecomp(I,C sub(4,:),UD(i,5));

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(i,2)) num2str(UD(i,3)) num2str(UD(i,4)) num2str(UD(i,5))];

end;

elseif (UD(i,1)==2)|(UD(i,1)==3)

[I,C1] = MakeDecomp(I,C sub(1,:),UD(i,2));

[I,C2] = MakeDecomp(I,C sub(2,:),UD(i,3));

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(i,1)) num2str(UD(i,2))];

end;

end;%ifend;%if

end;%if UD(i,1)˜=4end;%for

else

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(UD(1,2),1))];

end;

if (UD(UD(1,2),1)~=4)

[I,C sub] = MakeDecomp(I,C(2,:),UD(UD(1,2),1));

if (UD(1,1)==3)

if ((C sub(1,4)-C sub(1,1))<=2)|((C sub(1,3)-C sub(1,2))<=2)

ok = 0;

break;

end;

if UD(UD(1,2),1)==1

[I,C1] = MakeDecomp(I,C sub(1,:),UD(UD(1,2),2));

[I,C2] = MakeDecomp(I,C sub(2,:),UD(UD(1,2),3));

[I,C3] = MakeDecomp(I,C sub(3,:),UD(UD(1,2),4));

[I,C4] = MakeDecomp(I,C sub(4,:),UD(UD(1,2),5));

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(UD(1,2),2)) num2str(UD(UD(1,2),3)) num2str(UD(UD(1,2),4)) num2str(UD(UD(1,2),5))];

end;

elseif (UD(UD(1,2),1)==2)|(UD(UD(1,2),1)==3)

[I,C1] = MakeDecomp(I,C sub(1,:),UD(UD(1,2),2));

[I,C2] = MakeDecomp(I,C sub(2,:),UD(UD(1,2),3));

if ~standard decomp

Fgen decomp = [Fgen decomp num2str(UD(UD(1,2),2)) num2str(UD(UD(1,2),3))];

end;

end;

end;

end;

end;%if UD(1,2)end;%if UD(1,1) ¿ 1

end;

%Show the decomposition in other figure with real size% or draw the decomposition in a default frame%Set the parameters in UserData’s object for Personal decomp.I(s1,s2)=0;I(1,1)=1;

if fig

showGray(I,fig,name);

set(gcf,’Resize’ ,’off’ );

else

subplot(1,4,2);

imagesc(I.^0.45); axis off;

set(gca,’Units’ ,’normalized’ ,’Position’ ,get(findobj(’Tag’ ,’TF’ ),’Position’ ));

set(findobj(’Tag’ ,’TF’ ),’Visible’ ,’off’ );

for i=1:length(Fgen decomp)

if Fgen decomp(i) == ’4’

Fgen decomp(i) = ’0’ ;

end;

end;

set(findobj(’Tag’ ,’P101p’ ),’UserData’ ,Fdecomp);

set(findobj(’Tag’ ,’P108p’ ),’UserData’ ,Fgen decomp);

end

if ~ok

warndlg(’Los ltimos niveles no se han podido representar correctamente’ ,’Advertencia:’ );

end;

function [I,Coord] = MakeDecomp(I,coord,decomp)

switch decomp

case 1,

Coord(1,:) = [coord(1) coord(2) floor((coord(3)+coord(2)-1)/2) floor((coord(4)+coord(1)-1)/2)];

Coord(2,:) = [coord(1) floor((coord(3)+coord(2))/2) coord(3) floor((coord(4)+coord(1)-1)/2)];

Coord(3,:) = [floor((coord(4)+coord(1))/2) coord(2) floor((coord(3)+coord(2)-1)/2) coord(4)];

Page 219: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 215

Coord(4,:) = [floor((coord(4)+coord(1))/2) floor((coord(3)+coord(2))/2) coord(3) coord(4)];

for i = Coord(1,1):Coord(3,4)

I(i,Coord(1,3)) = 0;

end;

for j = Coord(1,2):Coord(2,3)

I(Coord(1,4),j) = 0;

end;

case 2,

Coord(1,:) = [coord(1) coord(2) floor((coord(3)+coord(2)-1)/2) coord(4)];

Coord(2,:) = [coord(1) floor((coord(3)+coord(2))/2) coord(3) coord(4)];

for i = Coord(1,1):Coord(1,4)

I(i,Coord(1,3)) = 0;

end;

case 3,

Coord(1,:) = [coord(1) coord(2) coord(3) floor((coord(4)+coord(1)-1)/2)];

Coord(2,:) = [floor((coord(4)+coord(1))/2) coord(2) coord(3) coord(4)];

for j = Coord(1,2):Coord(1,3);

I(Coord(1,4),j) = 0;

end;

otherwise, I = I; Coord = coord;

end;

function compress;

% Compone los flags segn las opciones seleccionadas% y llama al compresor y descompresor JPEG2000 (VM).%% J2MT - Rafael Redondo Tejedor 2002 (c)

jp2 path = get(findobj(’Tag’ ,’&Imagenuimenu5’ ),’UserData’ );

jp2 path = [jp2 path filesep];

ispc = strcmp(computer,’PCWIN’ );

filename = get(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ );

Flags = [’ -i ’ filename];

Flev = [’ -Flev ’ num2str(9-get(findobj(’Tag’ ,’P101p’ ),’Value’ ))];

Flags = [Flags Flev];

switch get(findobj(’Tag’ ,’P108p’ ),’Value’ )

case 1,

Fdecomp = ’ -Fdecomp mallat’ ;

case 2,

Fdecomp = ’ -Fdecomp spacl’ ;

case 3,

Fdecomp = ’ -Fdecomp packet’ ;

case 4,

Fdecomp = get(findobj(’Tag’ ,’P101p’ ),’UserData’ );

Fdecomp = [’ -Fdecomp ’ Fdecomp ’ -Fgen decomp ’ get(findobj(’Tag’ ,’P108p’ ),’UserData’ )];

end;

Flags = [Flags Fdecomp];

Fconv = ’’ ;

if get(findobj(’Tag’ ,’P103p’ ),’Value’ )

Frev = ’ -Frev N’ ;

if get(findobj(’Tag’ ,’P107p’ ),’Value’ )

Fconv = ’ -Fconv’ ;

end;

else Frev = ’ -Frev Y’ ;

end;

Flags = [Flags Frev Fconv];

if get(findobj(’Tag’ ,’P171p’ ),’Value’ )

Flags = [Flags ’ -Fdir ’ get(findobj(’Tag’ ,’P171t’ ),’UserData’ ) ...

’ -Fkernels ’ get(findobj(’Tag’ ,’P171p’ ),’UserData’ )];

end;

Cblk = [’ -Cblk ’ num2str(2^(11-get(findobj(’Tag’ ,’P211p’ ),’Value’ ))) ...

’x’ num2str(2^(11-get(findobj(’Tag’ ,’P212p’ ),’Value’ )))];

Flags = [Flags Cblk];

if get(findobj(’Tag’ ,’P213p’ ),’Value’ )

Cframes = ’ -Cframes Y’ ;

else Cframes = ’ -Cframes N’ ;

end;

Flags = [Flags Cframes];

if get(findobj(’Tag’ ,’P214p’ ),’Value’ )

Ccausal = ’ -Ccausal Y’ ;

else Ccausal = ’ -Ccausal N’ ;

end;

Flags = [Flags Ccausal];

if get(findobj(’Tag’ ,’P215p’ ),’Value’ )

Cparallel = ’ -Cparallel Y’ ;

else Cparallel = ’ -Cparallel N’ ;

end;

Flags = [Flags Cparallel];

if get(findobj(’Tag’ ,’P216p’ ),’Value’ )

Clazy = ’ -Clazy Y’ ;

else Clazy = ’ -Clazy N’ ;

end;

Flags = [Flags Clazy];

if get(findobj(’Tag’ ,’P217p’ ),’Value’ )

Csegmark = ’ -Csegmark Y’ ;

else Csegmark = ’ -Csegmark N’ ;

Page 220: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

216 Capıtulo 7. Anexos

end;

Flags = [Flags Csegmark];

if get(findobj(’Tag’ ,’P223p’ ),’Value’ )

Cer term = ’ -Cer term Y’ ; Cer = ’ -Cer 4’ ;

else Cer term = ’ -Cer term N’ ;Cer = ’’ ;

end;

Flags = [Flags Cer term];

if get(findobj(’Tag’ ,’P218p’ ),’Value’ )

Bresync = ’ -Bresync Y’ ;

else Bresync = ’ -Bresync N’ ;

end;

Flags = [Flags Bresync];

if get(findobj(’Tag’ ,’P224p’ ),’Value’ )

Beph = ’ -Beph Y’ ;

else Beph = ’ -Beph N’ ;

end;

Flags = [Flags Beph];

switch get(findobj(’Tag’ ,’P219p’ ),’Value’ )

case 1, Corder = ’ -Corder L’ ;

case 2, Corder = ’ -Corder RL’ ;

case 3, Corder = ’ -Corder RP’ ;

case 4, Corder = ’ -Corder PC’ ;

case 5, Corder = ’ -Corder CP’ ;

end;

Flags = [Flags Corder];

Clayers = [’ -Clayers ’ get(findobj(’Tag’ ,’P221p’ ),’String’ )];

Flags = [Flags Clayers];

if get(findobj(’Tag’ ,’P222p’ ),’Value’ )

Cno trunc = ’ -Cno trunc’ ;

else Cno trunc = ’’ ;

end;

Flags = [Flags Cno trunc];

if get(findobj(’Tag’ ,’P228p’ ),’Value’ )

Cpp = ’’ ;

else

level = 9 - get(findobj(’Tag’ ,’P101p’ ),’Value’ );

sizes = get(findobj(’Tag’ ,’P229p’ ),’UserData’ );

Cpp = [’ -Cpp’ ];

for i=1:level

Cpp = [Cpp ’ ’ sizes{i}];end;

end;

Flags = [Flags Cpp];

if get(findobj(’Tag’ ,’P310p’ ),’Value’ )

Flra = ’ -Flra’ ;

else Flra = ’ -Fno lra’ ;

end;

Flags = [Flags Flra];

Fguard bits = [’ -Fguard bits ’ num2str(8-get(findobj(’Tag’ ,’P418p’ ),’Value’ ))];

Flags = [Flags Fguard bits];

if str2num(get(findobj(’Tag’ ,’P419p’ ),’String’ ))~=128

Fdc = [’ -Fdc ’ get(findobj(’Tag’ ,’P419p’ ),’String’ )];

else Fdc = ’’ ;

end;

Flags = [Flags Fdc];

show info = 0;

if get(findobj(’Tag’ ,’P234p’ ),’Value’ )

Cmem = ’ -mem ’ ;show info = 1;

else Cmem = ’’ ;

end;

if get(findobj(’Tag’ ,’P236p’ ),’Value’ )

Ccpu = ’ -Ccpu ’ ;show info = 1;

else Ccpu = ’’ ;

end;

if get(findobj(’Tag’ ,’P235p’ ),’Value’ )

Dmem = ’ -mem ’ ;

if show info

show info = 2;

else show info = 3;

end;

else Dmem = ’’ ;

end;

if get(findobj(’Tag’ ,’P237p’ ),’Value’ )

Dcpu = ’ -Ccpu ’ ;

if show info

show info = 2;

else show info = 3;

end;

else Dcpu = ’’ ;

end;

Flags = [Flags Cmem Ccpu];

rate = [’ -rate ’ get(findobj(’Tag’ ,’P331p’ ),’String’ )];

low rate tol = [’ -low rate tol ’ get(findobj(’Tag’ ,’P332p’ ),’String’ )];

hi rate tol = [’ -hi rate tol ’ get(findobj(’Tag’ ,’P333p’ ),’String’ )];

Flags = [Flags rate low rate tol hi rate tol];

if get(findobj(’Tag’ ,’P103p’ ),’Value’ )

if get(findobj(’Tag’ ,’P311p’ ),’Value’ )

Q = [’ -Qnz ’ num2str(1-str2num(get(findobj(’Tag’ ,’P321p’ ),’String’ ))/2)];

else

Q = ’ -Qtcq’ ;

end;

Page 221: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 217

Flags = [Flags Q];

if get(findobj(’Tag’ ,’P338p’ ),’Value’ )

Flags = [Flags ’ -Fimplicit Y’ ];

end;

end;

if get(findobj(’Tag’ ,’P339p’ ),’Value’ )

Flags = [Flags ’ -Fsteps ’ get(findobj(’Tag’ ,’P341p’ ),’UserData’ )];

end;

if get(findobj(’Tag’ ,’P318p’ ),’Value’ )

Flags = [Flags ’ -Fweights ’ get(findobj(’Tag’ ,’P319p’ ),’UserData’ )];

end;

if get(findobj(’Tag’ ,’P342p’ ),’Value’ )

Flags = [Flags ’ -Cvpw ’ get(findobj(’Tag’ ,’P343p’ ),’UserData’ )];

end;

if get(findobj(’Tag’ ,’P316p’ ),’Value’ )

Flags = [Flags ’ -Cvis ’ get(findobj(’Tag’ ,’P317p’ ),’String’ )];

elseif get(findobj(’Tag’ ,’P315p’ ),’Value’ )

Flags = [Flags ’ -Xmask ’ get(findobj(’Tag’ ,’P350p’ ),’String’ ) ...

’ ’ get(findobj(’Tag’ ,’P351p’ ),’String’ ) ’ ’ ...

num2str(get(findobj(’Tag’ ,’P352p’ ),’Value’ )) ’ ’ ...

num2str(11-get(findobj(’Tag’ ,’P353p’ ),’Value’ )) ’ ’ ...

num2str(17-get(findobj(’Tag’ ,’P354p’ ),’Value’ )) ’ ’ ...

num2str(9-get(findobj(’Tag’ ,’P355p’ ),’Value’ ))];

end;

Rrgn = get(findobj(’Tag’ ,’P401p’ ),’UserData’ );

if ~isempty(Rrgn)

Flags = [Flags ’ -Rrgn ’ Rrgn];

if get(findobj(’Tag’ ,’P413p’ ),’value’ )

Flags = [Flags ’ -Rno rect’ ];

elseif get(findobj(’Tag’ ,’P414p’ ),’value’ )

Flags = [Flags ’ -Ralign’ ];

else Flags = [Flags ’ -Rmax shift Y’ ];

end;

else subplot(get(findobj(’Tag’ ,’P401t’ ),’UserData’ ));

if isempty(get(findobj(’Tag’ ,’P401p’ ),’UserData’ ))

figures = get(findobj(’Tag’ ,’P410t’ ),’UserData’ );

for i=1:length(figures)

delete(figures(i));

end;

set(findobj(’Tag’ ,’P410t’ ),’UserData’ ,’’ );

end;

end;

if ~get(findobj(’Tag’ ,’P416p’ ),’Value’ )

Flags = [Flags ’ -Mycc Y’ ];

end;

if ispc Cno speedup = ’ -Cno speedup’ ;

else Cno speedup = ’’ ;

end;

%Parameters inserted by the userFlags = [Flags ’ ’ get(findobj(’Tag’ ,’P420p’ ),’UserData’ )];

try

if size(dir(’tmp.jp2’ ))

delete(’tmp.jp2’ );

end;

if size(dir(’Cresults.txt’ ))

delete(’Cresults.txt’ );

end;

% Make compress & expand in default fileseval([’!’ jp2 path ’vm8 compress 32’ Flags ’ -o tmp.jp2 > Cresults.txt’ ]);

%[’!’ jp2 path ’vm8 compress 32’ Flags ’ -o tmp.jp2 ¿ Cresults.txt’]if size(dir(’tmp.jp2’ ))

if size(dir(’tmpr.jp2’ ))

delete(’tmpr.jp2’ );

end;

if size(dir(’tmpt.ppm’ ))

delete(’tmpt.ppm’ );

end;

if size(dir(’Dresults.txt’ ))

delete(’Dresults.txt’ );

end;

eval([’!’ jp2 path ’vm8 expand 32 -i tmp.jp2 -o tmpr.pgm -Xwt output tmpt.ppm’ ...

Fconv Cno speedup Dmem Dcpu Cer ’ > Dresults.txt’ ]);

%[’!’ jp2 path ’vm8 expand 32 -i tmp.jp2 -o tmpr.pgm -Xwt output tmpt.ppm’ ...%Fconv Cno speedup Dmem Dcpu Cer ’ ¿ Dresults.txt’]

if size(dir(’tmpr.pgm’ ))

%Display the obtained images & set enable menus[RI,map] = pgmread(’tmpr.pgm’ );

Coord = get(findobj(gcbf,’Tag’ ,’RF’ ),’Position’ );

subplot(1,4,2); imagesc(RI.^0.45); axis off;

set(gca,’Units’ ,’normalized’ ,’Position’ ,Coord,’Color’ ,[0.75 0.75 0.75]);

[TI,map] = ppmread(’tmpt.ppm’ );

Coord = get(findobj(gcbf,’Tag’ ,’TF’ ),’Position’ );

subplot(1,4,3); imagesc(TI.^0.45); axis off;

set(gca,’Units’ ,’normalized’ ,’Position’ ,Coord,’Color’ ,[0.75 0.75 0.75]);

set(findobj(’Tag’ ,’P401p’ ),’UserData’ ,’’ );

set(findobj(’Label’ ,’Guardar Imagen’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Imagen Transformada’ ),’Enable’ ,’on’ );

set(findobj(’Label’ ,’Imagen Reconstruida’ ),’Enable’ ,’on’ );

Page 222: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

218 Capıtulo 7. Anexos

set(findobj(’Label’ ,’Imagen Error’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’btnerr’ ),’Enable’ ,’on’ )

set(findobj(’Tag’ ,’TIbtn’ ),’Enable’ ,’on’ );

set(findobj(’Tag’ ,’RIbtn’ ),’Enable’ ,’on’ );

set(findobj(gcbf,’Tag’ ,’RF’ ),’Visible’ ,’off’ );

set(findobj(gcbf,’Tag’ ,’TF’ ),’Visible’ ,’off’ );

%Calculating Ratessize file = dir(’tmp.jp2’ );

[s1,s2,s] = size(TI);

ratio = sprintf(’%4.2f’ ,((s1*s2)/(size file.bytes)));

set(findobj(’Tag’ ,’RateText’ ),’String’ ,[sprintf(’%2.4f’ ,(size file.bytes)*8/(s1*s2)) ’ bpp (’ ratio ’:1)’ ]);

[OI,map] = pgmread(get(findobj(’Tag’ ,’&Imagenuimenu1’ ),’UserData’ ));

EI = (OI - RI);

err2 = mean(mean(EI))*100/255;

err1 = mean(mean((EI/255).^2));

if err1

dB = 20*log10(1/(sqrt(err1)));

set(findobj(’Tag’ ,’MSEdB’ ),’String’ ,[’PSNR (dB): ’ sprintf(’+%4.2f’ ,dB)]);

else set(findobj(’Tag’ ,’MSEdB’ ),’String’ ,[’PSNR (dB): inf’ ]);

end;

set(findobj(’Tag’ ,’MSE’ ),’String’ ,[’MSE: ’ num2str(err1)]);

set(findobj(’Tag’ ,’Mean’ ),’String’ ,[’Media: ’ num2str(err2)]);

%Showing message infoif show info

Showresults(show info);

end;

else

uiwait(errordlg(’Algn parmetro introducido es incorrecto’ ,’Error Descomprimiendo!’ ));

end;

else

uiwait(errordlg(’Algn parmetro introducido es incorrecto’ ,’Error Comprimiendo!’ ));

end;

catch

%If there is any problem show this error messageuiwait(errordlg(lasterr,’Error Comprimiendo’ ,’modal’ ));

end;

function Showresults(select);

% Presenta mensajes con la informacin de tiempo y memoria% consumida en la codificacin y decodificacin.%% J2MT - Rafael Redondo Tejedor 2002 (c)

if nargin<1 select = 0; end;

ok = 1;

if (select<=2)

fid C = fopen(’Cresults.txt’ ,’r’ );

if fid C==-1

uiwait(errordlg(’Error leyendo archivo Cresults.txt.’ ,’Error!’ ));

ok = 0;

else

count = 1;str C = ’’ ;

while count

[s,count] = fscanf(fid C,’%c’ );

str C = [str C s];

end;

fclose(fid C);

end;

end

if (select>=2)

fid D = fopen(’Dresults.txt’ ,’r’ );

if fid D==-1

uiwait(errordlg(’Error leyendo archivo Dresults.txt.’ ,’Error!’ ));

ok = 0;

else

count = 1;str D = ’’ ;

while count

[s,count] = fscanf(fid D,’%c’ );

str D = [str D s];

end;

fclose(fid D);

end;

end;

if ok

switch select

case 2,

msgbox(sprintf([’ *** INFORMACIN DEL CODIFICADOR ***\n\n’ ...

str C]),’Informacin del Sistema’ );

msgbox(sprintf([’ *** INFORMACIN DEL DECODIFICADOR ***\n\n’ ...

str D]),’Informacin del Sistema’ );

case 1,

msgbox(sprintf([’ *** INFORMACIN DEL CODIFICADOR ***\n\n’ ...

str C]),’Informacin del Sistema’ );

case 3,

Page 223: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.3. Anexo C: Funciones J2MT 219

msgbox(sprintf([’ *** INFORMACIN DEL DECODIFICADOR ***\n\n’ ...

str D]),’Informacin del Sistema’ );

end;

end;

function option quit;

% Cierra el programa y elimina ficheros temporales.%% J2MT - Rafael Redondo Tejedor 2002 (c)

OptionQuit=questdlg(’Est seguro?’ , ’Salir’ ,...

’Si’ ,’No’ ,’No’ );

if strcmp(OptionQuit,’Si’ )

if size(dir(’tmp.jp2’ ),1)

delete tmp.jp2;

end;

if size(dir(’tmp.pgm’ ),1)

delete tmp.pgm;

end;

if size(dir(’tmpr.pgm’ ),1)

delete tmpr.pgm;

end;

if size(dir(’tmpt.ppm’ ),1)

delete tmpt.ppm;

end;

if size(dir(’Cresults.txt’ ),1)

delete Cresults.txt;

end;

if size(dir(’Dresults.txt’ ),1)

delete Dresults.txt;

end;

for i=1:5

try

close(gcf+i);

end;

end;

clf;

close(gcf);

end;

Page 224: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

220 Capıtulo 7. Anexos

Page 225: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 221

7.4 Anexo D: Funciones de la Codificacion de

Cadenas

Funciones Principales (Matlab) y Auxiliares (C-mexfiles).

function [B,Texture]=LineDetec(I,N,U)

% function [II,Texture]=LineDetec(I,N)%% Applies diferent masks to detec the pixels that belongs to lines.% The dimensions of the masks are 3, 5 and 7%% ¡I¿ - initial image; ¡N¿ - size of the mask% ¡II¿ - image of lines detected; ¡Texture¿ - rest of pixels%% (C) Rafael Redondo, May 2001

[d1,d2,d]=size(I);

if N==3

inc=1;

mask1=[-1 -1 -1;2 2 2;-1 -1 -1];

mask2=[-1 -1 2;-1 2 -1;2 -1 -1];

mask3=[-1 2 -1;-1 2 -1;-1 2 -1];

mask4=[2 -1 -1;-1 2 -1;-1 -1 2];

% mask1=[-1 -2 -1;0 0 0;1 2 1]; other 3-mask% mask2=[-1 0 1;-2 0 2;-1 0 1];% mask3=[-2 -1 0;-1 0 1;0 1 2];% mask4=[0 -1 -2;1 0 -1;2 1 0];elseif N==5

inc=2;

mask1=[-2 1 2 1 -2;-2 1 2 1 -2;-2 1 2 1 -2;-2 1 2 1 -2;-2 1 2 1 -2];

mask2=[-2 -2 -2 -2 -2;1 1 1 1 1;2 2 2 2 2;1 1 1 1 1;-2 -2 -2 -2 -2];

mask3=[-2 -2 -2 1 2;-2 1 1 2 1;-2 1 2 1 -2;1 2 1 1 -2;2 1 -2 -2 -2];

mask4=[2 1 -2 -2 -2;1 2 1 1 -2;-2 1 2 1 -2;-2 1 1 2 1;-2 -2 -2 1 2];

elseif N==7

inc=3;

mask1=[-2 -1 1 2 1 -1 -2;-2 -1 1 2 1 -1 -2;-2 -1 1 2 1 -1 -2;-2 -1 1 2 1 -1 -2;-2 -1 1 2 1 -1 -2;-2 -1 1 2 1 -1 -2;-2 -1 1 2 1 -1 -2];

mask2=[-2 -2 -2 -2 -2 -2 -2;-1 -1 -1 -1 -1 -1 -1;1 1 1 1 1 1 1;2 2 2 2 2 2 2;1 1 1 1 1 1 1;-1 -1 -1 -1 -1 -1 -1;-2 -2 -2 -2 -2 -2 -2];

mask3=[-2 -2 -2 -2 -1 2 2;-2 -2 -1 1 2 2 2;-2 -1 -1 2 2 2 -1;-2 1 2 2 2 1 -2;-1 2 2 2 -1 -1 -2;2 2 2 1 -1 -2 -2;2 2 -1 -2 -2 -2 -2];

mask4=[2 2 -1 -2 -2 -2 -2;2 2 2 1 -1 -2 -2;-1 2 2 2 -1 -1 -2;-2 1 2 2 2 1 -2;-2 -1 -1 2 2 2 -1;-2 -2 -1 1 2 2 2;-2 -2 -2 -2 -1 2 2];

else error(’error arguments’ );

end;

ph=zeros(inc,d2);

pv=zeros(d1+2*inc,inc);

Ix=[ph;I;ph];

Ix=[pv,Ix,pv];

II=zeros(d1,d2);

mask=[mask1,mask2,mask3,mask4];

for n=1:N:4*N

for i=1:d1

for j=1:d2

if I(i,j)

value=round(sum(sum(Ix(i:i+2*inc,j:j+2*inc).*mask(1:N,n:n+(N-1)),1),2));

if (II(i,j)<value)

II(i,j)=value;

end;

end;

end;

end;

end;

M=max(max(II));

m=min(min(II));

U = ((M-m)*U/100)+m;

B=I;

B(II<U) = 0;

Texture=I-B;

%Entropy Borders=calc entropy(B)%Entropy Textures=calc entropy(Texture)showGray(log(1+B),5,’Borders5’ );

showGray(log(1+Texture),6,’Textures6’ );

function [stream]=Ccoder Amp(I,res);

c=clock; cont = 0;

C1=c(4)*3600+c(5)*60+c(6);

scale=8; %n bits resolution 1 to 16range = 2^scale;

if nargin<2

res = 255;

Page 226: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

222 Capıtulo 7. Anexos

else

res = 2^res-1;

end;

I=round(I*(range-1)/res);

[d1,d2,d]=size(I);

I=[zeros(1,d2);I;zeros(1,d2)];

I=[zeros(d1+2,1),I,zeros(d1+2,1)];

bc=2; % 0 to 7Bc=2^(3+bc); %ARITHMETIC BLOCK 8 to 1024p = 1;b = 1;x = 1;

BIT COUNT MOV=0;

BIT COUNT HEAD=0;

BIT COUNT A H=0;

BIT COUNT AMP=0;

COUNT ARITH=0;

COUNT ARITH AH=0;

COUNT ARITH H=0;

METHOD COUNT=zeros(1,4);

HIST MOV=zeros(1,8);

HIST HEAD=zeros(1,d1);

HIST HEAD2=zeros(1,d2+1);

HIST AMP HEAD=zeros(1,range*2+1);

HIST AMP=zeros(1,range*2+1);

mov=[1 -1;0 -1;-1 -1;-1 0;-1 1;0 1;1 1;1 0]; %set of movementsN=2;M=2; %initial headpixels=0;num line=0;

free=I;%set ocupied all zerosstream=[num2str(dec2bin(d1-1,11)),num2str(dec2bin(d2-1,11))];

n head = log2(d1*d2/4);

if floor(n head) ~= n head

n head = floor(n head)+1;

end;

stream = [stream,num2str(dec2bin(0,n head))]; %n chains placestream = [stream,’000000’ ,’000000’ ]; %variances placestream = [stream,num2str(dec2bin(scale-1,4))]; %setting scalestream = [stream,num2str(dec2bin(bc,3))]; %setting Blockstream = [stream,num2str(dec2bin(0,bc+3))]; %setting Final Block Lengthbitstream=zeros(1,0);

amp=2^(scale-2);cont AH=0;cont A=0;

h = waitbar(0,’Please wait... searching Skeletons’ );

for i=2:d1+1 %make skeletonsfor j=2:d2+1

if free(i,j)

waitbar((j+(i*(d2+2)))/((d1+2)*(d2+2)),h)

free(i,j)=0;

n=i; m=j;

num line=num line+1;

pixels=pixels+1;

bits = code head(n-N);

bitstream = [bitstream,bits];

BIT COUNT HEAD = BIT COUNT HEAD + length(code head(n-N));

HIST HEAD(n-N+1) = HIST HEAD(n-N+1) + 1;

if m-M<0 %diferential headsM=d2+m-M;

else M=m-M;

end;

BIT COUNT HEAD = BIT COUNT HEAD + 8;

HIST HEAD2(M+1) = HIST HEAD2(M+1) + 1;

bitstream = [bitstream,num2str(dec2bin(M,8))];

N = n; M = m;

cont AH=cont AH+1;

line AH(cont AH) = I(i,j)-amp;

BIT COUNT A H = BIT COUNT A H + length(code head2(I(n,m)));

HIST AMP HEAD(I(i,j)-amp+range)=HIST AMP HEAD(I(i,j)-amp+range)+1;

A = I(i,j);amp=I(i,j);

FINISHED = 1;pixel=1;

now = 6;

steps = 0;%% Ap1=0; Ap2=0; Ap3=0;while FINISHED

if free(n+mov(now,1),m+mov(now,2))

n = n+mov(now,1);

m = m+mov(now,2);

if pixel

bits = code mov head(now,i-1,j-1,d1,d2);

bitstream = [bitstream,bits];

BIT COUNT MOV=BIT COUNT MOV+length(bits);

before=now;

pixel=0;

end;

D=4+now-before;

if D>8

D=D-8;

elseif D<1

D=8+D;

end;

bits = code mov(D); bitstream = [bitstream,bits];

BIT COUNT MOV = BIT COUNT MOV + length(code mov(D));

HIST MOV(D) = HIST MOV(D) + 1;

%%A=floor(p*A+(1-p)*b*Ap1+(1-p)*(1-b)*x*Ap2+(1-p)*(1-b)*(1-x)*Ap3);cont A=cont A+1;

line A(cont A)=I(n,m)-A;

Page 227: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 223

BIT COUNT AMP = BIT COUNT AMP+length(code amp(I(n,m)-A));

HIST AMP(I(n,m)-A+range) = HIST AMP(I(n,m)-A+range) + 1;

free(n,m)=0; %%%Ap3=Ap2; Ap2=Ap1; Ap1=A;A=I(n,m);

before=now;

pixels=pixels+1;

steps=0;

now=now-3; %go back 3 positionsif now<1

now=8+now;

end;

elseif steps==7

if (pixel)&(i-1<d1)

bitstream = [bitstream,’1’ ];

BIT COUNT MOV = BIT COUNT MOV + 1;

end;

bits = code mov(8); bitstream = [bitstream,bits];

BIT COUNT MOV = BIT COUNT MOV + length(code mov(8));

HIST MOV(8) = HIST MOV(8) + 1;

FINISHED = 0;

if length(bitstream)>75 %optimize access arraystream = [stream,bitstream];

bitstream = zeros(1,0);

end;

else now=now+1;

steps=steps+1;

if (now==9) now=1;

end;

end; %ifend;%while FINISHED

end; %if free(i,j)end;%FOR

end;%FOR %end make skeletonsstream = [stream,bitstream];

stream(23:23+n head-1) = num2str(dec2bin(num line,n head)); %setting n chainsclose(h);

c=clock;

C2=c(4)*3600+c(5)*60+c(6);

time1 = C2-C1

%ARITHMETIC CODEDh = waitbar(0,’Please wait... doing Arithmetic Coding’ );

%arithmetic coding of amplitudevariance table = [0.023,0.016;0.043,0.033;0.07,0.056;0.108,0.088;0.162,0.133;0.239,0.198;0.348,0.29;0.502,0.419;...

0.718,0.602;1.023,0.859;1.45,1.221;2.046,1.726;2.882,2.433;4.053,3.422;5.693,4.809;7.973,6.747;...

11.17,9.443;15.627,13.219;21.874,18.488;30.635,25.875;42.911,36.235;60.123,50.715;84.237,71.021;...

118.157,99.506;165.814,139.489;232.441,195.569;326.578,273.929;459.143,384.722;645.989,540.225;...

910.442,759.147;1285.348,1068.752;1816.634,1506.524;2574.021,2125.419;3663.589,3007.133;...

5224.801,4267.734;7247.452,6070.918;10195.99,8550.934];

px = -2^scale+1:2^scale+1;

%B = Bc;B AH = Bc;stream2=stream; stream=zeros(1,0);

OFFSET = [0]; OFFSET coma = 0; INCR = [1 0]; INCR coma = -1;

OFFSET AH = [0];OFFSET coma AH = 0;INCR AH = [1 0];INCR coma AH = -1;

hist1 = zeros(1,24*Bc); hist2 = hist1;

%hist1 = zeros(1,100*Bc); hist2 = hist1;RANGE=2;

hist11=zeros(1,2*RANGE*scale*Bc); hist22=hist11;

l A = length(line A); l AH = length(line AH);

t AH = floor(length(line AH)/Bc); t A = floor(length(line A)/Bc);

%%%%AMPLITUD HEAD CODINGn variance = 1;Error1=10^5;

while n variance

v = variance table(n variance,2);

p amp head = exp(-abs(px)*sqrt(2/v))./(sqrt(2*v));

Error2=0;

P amp head = p amp head.*max(HIST AMP HEAD)./max(p amp head);

for i=1:length(p amp head)

Error2 = Error2 + abs(P amp head(i)-HIST AMP HEAD(i));

end;

if Error2>Error1

stream2(29+n head:34+n head) = num2str(dec2bin(n variance-1,6));

v = variance table(n variance-1,2);

p amp head = exp(-abs(px)*sqrt(2/v))./(sqrt(2*v));

n variance = 0;

else n variance = n variance + 1;

Error1 = Error2;

end;

end;

Inc=0.001; inc=0;ok=0;

while ~ok

p amp head = p amp head./(1+inc);

i=1;ok=1;

[PROB AH(1,:),PROB AH coma] = num2array(p amp head(1));

while (i<length(p amp head))&(ok)

i=i+1;

[Y,Y coma] = num2array(p amp head(i));

[Y,Y coma] = sum array x(Y,PROB AH(i-1,:),Y coma,PROB AH coma(i-1));

if length(Y)<length(PROB AH(1,:))

PROB AH = [PROB AH(:,:);[zeros(1,length(PROB AH(1,:))-length(Y)),Y]];

Page 228: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

224 Capıtulo 7. Anexos

else

PROB AH = [[zeros(i-1,length(Y)-length(PROB AH(1,:))),PROB AH(:,:)];Y];

end;

PROB AH coma(i) = Y coma;

if Y(length(Y)) ok=0;clear PROB AH, PROB AH coma; end;

end;

inc = inc + Inc;

end;

cont = 0; l ant = Bc*scale;

for j=1:t AH

for i=1:Bc

cont=cont+1;

waitbar(cont/(l A+l AH),h)

AH = line AH(cont);

[INCL AH, INCL coma AH] = mult array x(INCR AH,PROB AH(AH+range,:),INCR coma AH,PROB AH coma(AH+range));

[INCR AH, INCR coma AH] = mult array x(INCR AH,PROB AH(AH+range+1,:),INCR coma AH,PROB AH coma(AH+range+1));

[INCR AH, INCR coma AH] = diff array x(INCR AH,INCL AH,INCR coma AH,INCL coma AH);

[OFFSET AH, OFFSET coma AH] = sum array x(OFFSET AH, INCL AH,OFFSET coma AH,INCL coma AH);

end;%for i=1:Bc[INCR AH, INCR coma AH] = sum array x(OFFSET AH, INCR AH,OFFSET coma AH,INCR coma AH);

bits = calc bin x(OFFSET AH,INCR AH,OFFSET coma AH,INCR coma AH);

l = length(bits); hist1(l)=hist1(l)+1;

cl = calc length(l-l ant);

hist11(l-l ant+RANGE*scale*Bc)=hist11(l-l ant+RANGE*scale*Bc)+1;

l ant = l;

COUNT ARITH AH = COUNT ARITH AH + l + length(cl);

stream = [stream,cl,bits];

OFFSET AH = [0];OFFSET coma AH = 0;INCR AH = [1 0];INCR coma AH = -1;

end;%for j=1:l AHccoonntt = cont;

while (length(line AH)-cont)

cont=cont+1;

waitbar(cont/(l A+l AH),h)

AH = line AH(cont);

[INCL AH, INCL coma AH] = mult array x(INCR AH,PROB AH(AH+range,:),INCR coma AH,PROB AH coma(AH+range));

[INCR AH, INCR coma AH] = mult array x(INCR AH,PROB AH(AH+range+1,:),INCR coma AH,PROB AH coma(AH+range+1));

[INCR AH, INCR coma AH] = diff array x(INCR AH,INCL AH,INCR coma AH,INCL coma AH);

[OFFSET AH, OFFSET coma AH] = sum array x(OFFSET AH, INCL AH,OFFSET coma AH,INCL coma AH);

end;% while(length(line AH)-cont)if (cont>ccoonntt)

[INCR AH, INCR coma AH] = sum array x(OFFSET AH, INCR AH,OFFSET coma AH,INCR coma AH);

bits = calc bin x(OFFSET AH,INCR AH,OFFSET coma AH,INCR coma AH);

l = length(bits); hist1(l)=hist1(l)+1;

cl = calc length(l-l ant);

hist11(l-l ant+RANGE*scale*Bc) = hist11(l-l ant+RANGE*scale*Bc)+1;

COUNT ARITH = COUNT ARITH + l + length(cl);

stream = [stream,cl,bits];

end;%if (cont¿ccoonntt)%%%AMPLITUD PIXEL CODINGn variance = 1; Error1=10^5;

while n variance

v = variance table(n variance,2);

p amp = exp(-abs(px)*sqrt(2/v))./(sqrt(2*v));

Error2=0;

P amp = p amp.*max(HIST AMP)./max(p amp);

for i=1:length(p amp)

Error2 = Error2 + abs(P amp(i)-HIST AMP(i));

end;

if Error2>Error1

stream2(23+n head:28+n head) = num2str(dec2bin(n variance-1,6));

v = variance table(n variance-1,2);

p amp = exp(-abs(px)*sqrt(2/v))./(sqrt(2*v));

n variance = 0;

else n variance = n variance + 1;

Error1 = Error2;

end;

end;

Inc=0.001; inc=0;

ok=0;

while ~ok

p amp = p amp./(1+inc);

i=1;ok=1;

[PROB(1,:),PROB coma] = num2array(p amp(1));

while (i<length(p amp))&(ok)

i=i+1;

[Y,Y coma] = num2array(p amp(i));

[Y,Y coma] = sum array x(Y,PROB(i-1,:),Y coma,PROB coma(i-1));

if length(Y)<length(PROB(1,:))

PROB = [PROB(:,:);[zeros(1,length(PROB(1,:))-length(Y)),Y]];

else

PROB = [[zeros(i-1,length(Y)-length(PROB(1,:))),PROB(:,:)];Y];

end;

PROB coma(i) = Y coma;

if Y(length(Y)) ok=0;clear PROB, PROB coma; end;

end;

inc = inc + Inc;

end;

cont = 0;l ant = Bc*scale;

Page 229: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 225

for j=1:t A

for i=1:Bc

cont = cont+1;

waitbar((cont+l AH)/(l A+l AH),h)

diff = line A(cont);

[INCL, INCL coma] = mult array x(INCR,PROB(diff+range,:),INCR coma,PROB coma(diff+range));

[INCR, INCR coma] = mult array x(INCR,PROB(diff+range+1,:),INCR coma,PROB coma(diff+range+1));

[INCR, INCR coma] = diff array x(INCR,INCL,INCR coma,INCL coma);

[OFFSET, OFFSET coma] = sum array x(OFFSET, INCL, OFFSET coma, INCL coma);

end;%for i=1:Bc[INCR, INCR coma] = sum array x(OFFSET,INCR,OFFSET coma,INCR coma);

bits = calc bin x(OFFSET,INCR,OFFSET coma,INCR coma);

l = length(bits); hist2(l)=hist2(l)+1;

cl = calc length(l-l ant);

hist22(l-l ant+RANGE*scale*Bc) = hist22(l-l ant+RANGE*scale*Bc)+1;

l ant = l;

COUNT ARITH = COUNT ARITH + l + length(cl);

stream = [stream,cl,bits];

OFFSET = [0];OFFSET coma = 0;INCR = [1 0];INCR coma = -1;

end;%for j=1:l Accoonntt = cont;

while(length(line A)-cont)

cont = cont+1;

waitbar((cont+l AH)/(l A+l AH),h)

diff = line A(cont);

[INCL, INCL coma] = mult array x(INCR,PROB(diff+range,:),INCR coma,PROB coma(diff+range));

[INCR, INCR coma] = mult array x(INCR,PROB(diff+range+1,:),INCR coma,PROB coma(diff+range+1));

[INCR, INCR coma] = diff array x(INCR,INCL,INCR coma,INCL coma);

[OFFSET, OFFSET coma] = sum array x(OFFSET, INCL, OFFSET coma, INCL coma);

end;%while(length(line A)-cont)if (cont-ccoonntt)

[INCR, INCR coma] = sum array x(OFFSET,INCR,OFFSET coma,INCR coma);

bits = calc bin x(OFFSET,INCR,OFFSET coma,INCR coma);

l = length(bits); hist2(l)=hist2(l)+1;

cl = calc length(l-l ant);

hist22(l-l ant+RANGE*scale*Bc) = hist22(l-l ant+RANGE*scale*Bc)+1;

COUNT ARITH = COUNT ARITH + l + length(cl);

stream = [stream,cl,bits];

end;%if (ccoonntt¡cont)stream2(42+n head:44+n head+bc) = num2str(dec2bin(cont-ccoonntt,bc+3));

stream=[stream2,stream];

close(h);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ### ### ### ### ### ### %% # # # # # # # # # %% ## ### # # # # # %% # # # # # ### ### ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%c=clock;

C3=c(4)*3600+c(5)*60+c(6);

time2 = C3-C2

%The shannon critery is not roundedif 1

weight H AH M A=[BIT COUNT HEAD/num line,BIT COUNT A H/num line,BIT COUNT MOV/(pixels+num line), ...

BIT COUNT AMP/(pixels-num line)]

RATE = BIT COUNT HEAD+BIT COUNT A H+BIT COUNT MOV+BIT COUNT AMP;

rate H AH M A = [BIT COUNT HEAD, BIT COUNT A H, BIT COUNT MOV, BIT COUNT AMP, RATE] ./ (d1*d2)

E mov=0;E head=0;E head2=0;E amp=0;E amp head=0;

for s=1:8

if HIST MOV(s)

E mov = E mov - HIST MOV(s)*log2(HIST MOV(s)/(pixels));

end; end;

for s=1:length(HIST HEAD)

if HIST HEAD(s)

E head = E head - HIST HEAD(s)*log2(HIST HEAD(s)/num line);

end; end;

for s=0:length(HIST HEAD2)-1

if HIST HEAD2(s+1)

E head2 = E head2 - HIST HEAD2(s+1)*log2(HIST HEAD2(s+1)/num line);

end; end;

for s=1:length(HIST AMP HEAD)

if HIST AMP HEAD(s)

E amp head = E amp head - HIST AMP HEAD(s)*log2(HIST AMP HEAD(s)/num line);

end; end;

for s=1:length(HIST AMP)

if HIST AMP(s)

E amp = E amp - HIST AMP(s)*log2(HIST AMP(s)/(pixels-num line));

end; end;

Arithm RATE = BIT COUNT HEAD+COUNT ARITH AH+COUNT ARITH+BIT COUNT MOV;

Arithm rates = [0, COUNT ARITH AH/num line, 0,COUNT ARITH/(pixels-num line)]

Arithm weight = [0, COUNT ARITH AH, 0, COUNT ARITH, Arithm RATE]./(d1*d2)

Shannon RATE = (E head + E head2 + E mov + E amp head + E amp + 2*num line);

Shannon weight = [(E head+E head2)/num line,E amp head/num line,...

(E mov+2*num line)/(pixels+num line), E amp/(pixels-num line)]

Shannon rate=[E head+E head2, E amp head, E mov+2*num line, E amp, Shannon RATE]./(d1*d2)

%figure(10);%colormap(gray(256));%subplot(2,2,1);% plot(1:length(HIST HEAD),HIST HEAD,’b’);% hold on;

Page 230: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

226 Capıtulo 7. Anexos

% plot(1:length(HIST HEAD2),HIST HEAD2,’r’);% hold off;%subplot(2,2,2);% plot(1:8,HIST MOV,’b’);%subplot(2,2,3);% plot(-2ˆscale+1:2ˆscale+1,HIST AMP HEAD/sum(HIST AMP HEAD),’r’);% hold on;% plot(px,p amp head,’k’);% hold off;%subplot(2,2,4);% plot(-2ˆscale+1:2ˆscale+1,HIST AMP/sum(HIST AMP),’r’);% hold on;% plot(px,p amp,’k’);% hold off;%figure(11);%subplot(2,2,1);plot(1:length(hist1),hist1);

%subplot(2,2,3);plot(1:length(hist2),hist2);%subplot(2,2,2);%plot(-RANGE*Bc*scale:RANGE*Bc*scale-1,hist11);%subplot(2,2,4);plot(-RANGE*Bc*scale:RANGE*Bc*scale-1,hist22);

end;

% LOCAL FUNCTIONS - IMPLEMENTATION CODESfunction [code] = code mov(mov);

switch mov

case 4, code = ’1’ ;

case 3, code = ’011’ ;

case 5, code = ’010’ ;

case 8, code = ’001’ ;

case 6, code = ’0001’ ;

case 2, code = ’00001’ ;

case 7, code = ’000001’ ;

case 1, code = ’000000’ ;

otherwise error(’error coding movement’ );

end;

function [code] = code mov head(mov,i,j,d1,d2);

if i==d1

code = ’’ ;

elseif j==d2

switch mov

case 8, code = ’0’ ;

case 1, code = ’1’ ;

otherwise error(’error coding movement head1’ );

end;

elseif j==1

switch mov

case 6, code = ’1’ ;

case 7, code = ’01’ ;

case 8, code = ’00’ ;

otherwise error(’error coding movement head1’ );

end;

else

switch mov

case 6, code = ’1’ ;

case 7, code = ’01’ ;

case 8, code = ’001’ ;

case 1, code = ’000’ ;

otherwise error(’error coding movement head2’ );

end;

end;

function [code] = code head(head);

if head == 0

code = ’1’ ;

else n = floor(log2(head)) + 1;

switch n

case 1, code1 = ’01’ ;

case 2, code1 = ’001’ ;

case 3, code1 = ’0001’ ;

case 4, code1 = ’00001’ ;

case 5, code1 = ’000001’ ;

case 6, code1 = ’0000001’ ;

case 7, code1 = ’00000001’ ;

case 8, code1 = ’00000000’ ;

otherwise error(’error coding head’ );

end;

if n == 1

code = code1;

else

code2 = num2str(dec2bin(head - 2^(n-1),n-1));

code = [code1,code2];

end;

end;

function [code] = code head2(head);

if head == 0

code = ’000’ ;

else n = floor(log2(head)) + 1;

switch n

case 1, code1 = ’001’ ;

case 2, code1 = ’010’ ;

Page 231: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 227

case 3, code1 = ’011’ ;

case 4, code1 = ’1000’ ;

case 5, code1 = ’1001’ ;

case 6, code1 = ’1010’ ;

case 7, code1 = ’1011’ ;

case 8, code1 = ’11000’ ;

otherwise error(’error coding head’ );

end;

if n == 1

code = code1;

else

code2 = num2str(dec2bin(head - 2^(n-1),n-1));

code = [code1,code2];

end;

end;

function [code] = code amp(amp);

if amp == 0

code = ’1’ ;

else

if amp<0

positive = ’0’ ;

amp = abs(amp);

else positive = ’1’ ;

end;

n = floor(log2(amp)) + 1;

switch n

case 1, code1 = ’001’ ;

case 2, code1 = ’011’ ;

case 3, code1 = ’010’ ;

case 4, code1 = ’00001’ ;

case 5, code1 = ’00011’ ;

case 6, code1 = ’00010’ ;

case 7, code1 = ’000001’ ;

case 8, code1 = ’000000’ ;

otherwise error(’error coding amplitude’ );

end;

if n == 1

code = [code1,positive];

else

code2 = num2str(dec2bin(amp - 2^(n-1),n-1));

code = [code1,positive,code2];

end;

end;

function [code] = calc length(long);

if long == 0

code = ’1’ ;

else

if long<0

positive = ’0’ ;

long = -long;

else positive = ’1’ ;

end;

n = floor(log2(long)) + 1;

switch n

case 1, code1 = ’001’ ;

case 2, code1 = ’011’ ;

case 3, code1 = ’010’ ;

case 4, code1 = ’00001’ ;

case 5, code1 = ’00011’ ;

case 6, code1 = ’00010’ ;

case 7, code1 = ’0000001’ ;

case 8, code1 = ’0000011’ ;

case 9, code1 = ’0000010’ ;

case 10, code1 = ’0000000’ ;

otherwise error(’error coding amplitude’ );

end;

if n == 1

code = [code1,positive];

else

code2 = num2str(dec2bin(long - 2^(n-1),n-1));

code = [code1,positive,code2];

end;

end;

function [I] = Cdecoder Amp(stream);

c=clock; cont = 0;

C1=c(4)*3600+c(5)*60+c(6);

d1=bin2dec(stream(1:11))+1;

d2=bin2dec(stream(12:22))+1;

n head = log2(d1*d2/4);

if floor(n head) ~= n head

n head = floor(n head)+1;

end;

num lines = bin2dec(stream(23:22+n head));

Page 232: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

228 Capıtulo 7. Anexos

I = zeros(d1,d2);

if num lines

n line=num lines;

variance A = bin2dec(stream(23+n head:28+n head));

variance AH = bin2dec(stream(29+n head:34+n head));

scale = bin2dec(stream(35+n head:38+n head))+1;

bc = bin2dec(stream(39+n head:41+n head));

Bc = 2^(3+bc);

FBL = bin2dec(stream(42+n head:44+n head+bc));

if ~FBL FBL = Bc; end;

FIN = 0; cont = 45+n head+bc;

M = 1; N = 1; HM = 1;

h = waitbar(0,’Please wait... decoding skeletons’ );

while num lines

waitbar((N+(M-1)*d2)/(d1*d2),h)

[i, cont] = decode head(stream, cont);

i = i+M;

j = bin2dec(stream(cont:cont+7));

cont = cont+8;

j=j+N;

if j>d2

j = j - d2;

end;

line(HM) = i; line(HM+1) = j; HM = HM+2;

M=i;N=j;

[before, cont] = decode mov head(stream,cont,i,j,d1,d2);

line(HM) = before; HM = HM+1;

mov = 1; num lines = num lines-1;

while mov~=8

[mov, cont] = decode mov(stream, cont);

line(HM) = mov; HM = HM+1;

end;%while ˜finend; %while num linesclose(h);

stream = stream(cont:length(stream));%erase head & movc=clock;

C2=c(4)*3600+c(5)*60+c(6);

time1 = C2-C1

h = waitbar(0,’Please wait... doing Arithmetic Decoding’ );

variance table = [0.023,0.016;0.043,0.033;0.07,0.056;0.108,0.088;0.162,0.133;0.239,0.198;0.348,0.29;0.502,0.419;...

0.718,0.602;1.023,0.859;1.45,1.221;2.046,1.726;2.882,2.433;4.053,3.422;5.693,4.809;7.973,6.747;...

11.17,9.443;15.627,13.219;21.874,18.488;30.635,25.875;42.911,36.235;60.123,50.715;84.237,71.021;...

118.157,99.506;165.814,139.489;232.441,195.569;326.578,273.929;459.143,384.722;645.989,540.225;...

910.442,759.147;1285.348,1068.752;1816.634,1506.524;2574.021,2125.419;3663.589,3007.133;...

5224.801,4267.734;7247.452,6070.918;10195.99,8550.934];

px = -2^scale+1:2^scale+1;

p eof = 1/(1+Bc);

v = variance table(variance A,2);

p amp = exp(-abs(px)*sqrt(2/v))./(sqrt(2*v));

v = variance table(variance AH,2);

p amp head = exp(-abs(px)*sqrt(2/v))./(sqrt(2*v));

cont = 1;tam = length(stream); num lines = n line; range = 2^scale;

%%%%AMPLITUD HEAD DECODINGInc=0.001; inc=0;ok=0;

while ~ok

p amp head = p amp head./(1+inc);

i=1;ok=1;

[PROB AH(1,:),PROB AH coma] = num2array(p amp head(1));

while (i<length(p amp head))&(ok)

i=i+1;

[Y,Y coma] = num2array(p amp head(i));

[Y,Y coma] = sum array x(Y,PROB AH(i-1,:),Y coma,PROB AH coma(i-1));

if length(Y)<length(PROB AH(1,:))

PROB AH = [PROB AH(:,:);[zeros(1,length(PROB AH(1,:))-length(Y)),Y]];

else

PROB AH = [[zeros(i-1,length(Y)-length(PROB AH(1,:))),PROB AH(:,:)];Y];

end;

PROB AH coma(i) = Y coma;

if Y(length(Y)) ok=0;clear PROB AH, PROB AH coma; end;

end;

inc = inc + Inc;

end;

cont AH = 1; Amp Head = 2^(scale-2);

l ant = Bc*scale; B = Bc;

while n line

num = [1 0];coma = -1; off = [0];off coma = 0;

[l,cont] = calc length(stream,cont);

l ant = l+l ant;

for i=cont:cont+l ant-1

[num,coma] = Divide2(num,coma);

if stream(i)==’1’

[off,off coma] = sum array x(off,num,off coma,coma);

end;

end;

[num,coma] = Divide2(num,coma);

[off,off coma] = sum array x(off,num,off coma,coma);

cont = cont+l ant;

n line = n line-B;

if (n line<0)

Page 233: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 229

B=Bc+n line; n line = 0;

end;

INCR AH = [1 0];INCR coma AH = -1;

for j=1:B

Mayor = range;

menor = -range;

while (Mayor-menor)>1

AH = ((Mayor-menor)/2)+menor;

[T,T coma] = mult array x(INCR AH,PROB AH(AH+range,:),...

INCR coma AH,PROB AH coma(AH+range));

if Ismayor(T,off,T coma,off coma)

Mayor = AH;

M = T; M coma = T coma;

else

menor = AH;

m = T; m coma = T coma;

end;

end;%while (Mayor-menor)¿1line AHH(cont AH) = menor;

Amp Head = menor + Amp Head;

line AH(cont AH) = Amp Head; cont AH = cont AH+1;

[off,off coma] = diff array x(off,m,off coma,m coma);

[INCR AH,INCR coma AH] = diff array x(M,m,M coma,m coma);

end;%for i=1:Bwaitbar(cont/tam,h)

end;%while n line%%%AMPLITUD PIXEL DECODINGclear PROB AH, PROB AH coma;

Inc=0.001; inc=0; ok=0;

while ~ok

p amp = p amp./(1+inc);

i=1;ok=1;

[PROB(1,:),PROB coma] = num2array(p amp(1));

while (i<length(p amp))&(ok)

i=i+1;

[Y,Y coma] = num2array(p amp(i));

[Y,Y coma] = sum array x(Y,PROB(i-1,:),Y coma,PROB coma(i-1));

if length(Y)<length(PROB(1,:))

PROB = [PROB(:,:);[zeros(1,length(PROB(1,:))-length(Y)),Y]];

else

PROB = [[zeros(i-1,length(Y)-length(PROB(1,:))),PROB(:,:)];Y];

end;

PROB coma(i) = Y coma;

if Y(length(Y)) ok=0;clear PROB, PROB coma; end;

end;

inc = inc + Inc;

end;

cont A = 1; l ant = Bc*scale; B = Bc;

while (cont<tam)

num = [1 0];coma = -1; off = [0];off coma = 0;

[l,cont] = calc length(stream,cont);

l ant = l+l ant;

for i=cont:cont+l ant-1

[num,coma] = Divide2(num,coma);

if stream(i)==’1’

[off,off coma] = sum array x(off,num,off coma,coma);

end;

end;

[num,coma] = Divide2(num,coma);

[off,off coma] = sum array x(off,num,off coma,coma);

cont = cont+l ant;

if (cont>=tam)

B = FBL;

end;

INCR = [1 0]; INCR coma = -1;

for j=1:B

Mayor = range;

menor = -range;

while (Mayor-menor)>1

diff = ((Mayor-menor)/2)+menor;

[T,T coma] = mult array x(INCR,PROB(diff+range,:),...

INCR coma,PROB coma(diff+range));

if Ismayor(T,off,T coma,off coma)

Mayor = diff;

M = T; M coma = T coma;

else

menor = diff;

m = T; m coma = T coma;

end;

end;%while (Mayor-menor)¿1line A(cont A) = menor; cont A = cont A+1;

[off,off coma] = diff array x(off,m,off coma,m coma);

[INCR,INCR coma] = diff array x(M,m,M coma,m coma);

end;%for i=1:Bwaitbar(cont/tam,h)

end;%while (cont¡tam)clear PROB, PROB coma;

close(h);

%%% SETTING THE PIECES

Page 234: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

230 Capıtulo 7. Anexos

cont = 1;cont AH = 1;cont A = 1;

while num lines

i=line(cont);j=line(cont+1);

before = line(cont+2);

I(i,j) = line AH(cont AH); A = I(i,j);

num lines = num lines-1;

mov = line(cont+3);

cont = cont+4; cont AH = cont AH+1;

while mov~=8

D=mov+before-4;

if D<1

D=8+D;

elseif D>8

D=D-8;

else;

end;

before=D;

switch D

case 8;

i=i+1;

case 1,

i=i+1;

j=j-1;

case 2,

j=j-1;

case 3,

i=i-1;

j=j-1;

case 4,

i=i-1;

case 5,

i=i-1;

j=j+1;

case 6,

j=j+1;

case 7,

i=i+1;

j=j+1;

otherwise, error(’error code format’ );

end;%switchI(i,j) = line A(cont A)+A;

A = I(i,j); cont A = cont A+1;

mov = line(cont); cont = cont+1;

end;%while movend;%while num lines

end;%if n line%showGray(I,2,’DECODED IMAGE’);c=clock;

C3=c(4)*3600+c(5)*60+c(6);

time2 = C3-C2

function [value, cont] = decode mov(array, cont);

ok=0;

i=0;

while (~ok)&(i<6)

switch array(cont:cont+i);

case ’1’ , value = 4;ok=1;

case ’011’ , value = 3;ok=1;

case ’010’ , value = 5;ok=1;

case ’001’ , value = 8;ok=1;

case ’0001’ , value = 6;ok=1;

case ’00001’ , value = 2;ok=1;

case ’000001’ , value = 7;ok=1;

case ’000000’ , value = 1;ok=1;

end;

i = i+1;

end;

cont=cont+i;

if ~ok

error(’error decoding movement!!’ );

end;

function [value, cont] = decode mov head(array, cont,i,j,d1,d2);

ok=1;

if i==d1

value = 6;

cont = cont;

elseif j==d2

switch array(cont)

case ’0’ , value = 8;

case ’1’ , value = 1;

otherwise ok=0;

end;

cont = cont+1;

elseif j==1

inc=0;ok=0;

while (~ok)&(inc<2)

switch array(cont:cont+inc);

case ’1’ , value = 6; ok=1;

case ’01’ , value = 7; ok=1;

case ’00’ , value = 8; ok=1;

Page 235: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 231

end;

inc=inc+1;

end;

cont=cont+inc;

else

inc=0;ok=0;

while (~ok)&(inc<3)

switch array(cont:cont+inc);

case ’1’ , value = 6; ok=1;

case ’01’ , value = 7; ok=1;

case ’001’ , value = 8; ok=1;

case ’000’ , value = 1; ok=1;

end;

inc=inc+1;

end;

cont=cont+inc;

end;

if ~ok

error(’error decoding movement!!’ );

end;

function [value, cont] = decode head(array, cont);

value=0;

while (array(cont+value)==’0’ )&(value<=7)

value = value + 1;

end;

cont=cont+value+1;

if value>1

code=array(cont:cont+value-2);

cont=cont+value-1;

value = 2^(value-1) + bin2dec(code);

end;

function [l,cont] = calc length(array,cont);

i = 0; ok = 0;

while (~ok)&(i<=6)

switch array(cont:cont+i)

case ’1’ ,value = 0;ok=1;l=0;

case ’001’ ,value = 1;ok=1;

case ’011’ ,value = 2;ok=1;

case ’010’ ,value = 3;ok=1;

case ’00001’ ,value = 4;ok=1;

case ’00011’ ,value = 5;ok=1;

case ’00010’ ,value = 6;ok=1;

case ’0000001’ ,value = 7;ok=1;

case ’0000011’ ,value = 8;ok=1;

case ’0000010’ ,value = 9;ok=1;

case ’0000000’ ,value = 10;ok=1;

end;

i = i+1;

end;

%if i==7 error(’error!!!’); end;cont = cont +i;

if value>0

if array(cont)==’1’

l = 1;

else l = -1;

end;

if value > 1

l = l*(bin2dec(array(cont+1:cont+value-1))+2^(value-1));

end;

cont = cont+value;

end;

function Array = Escalar array x(array, num);

Array = Escalar array mex(array,num);

#include "mex.h"

#include "matrix.h"

void Escalar array mex(double *Array output,double *Array input,int number, int l){

int rest=0,value;

for (int i=0;i<l−1;i++){value = (*(Array input+i))*number + rest;rest = value/10;*(Array output+i) = value − rest*10;

}*(Array output+l−1) = rest;}void mexFunction(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray

Page 236: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

232 Capıtulo 7. Anexos

*prhs[ ]){

int number,l;double *Array input, *Array output;

/*pointers to matrixs*/l = mxGetN(prhs[0]);Array input = mxGetPr(prhs[0]);number = mxGetScalar(prhs[1]);plhs[0] = mxCreateDoubleMatrix(1,l,mxREAL);if (plhs[0]==NULL){mexErrMsgTxt("Memory error!!!");}Array output = mxGetPr(plhs[0]);

Escalar array mex(Array output,Array input,number,l);}

function [ARRAY, coma] = sum array x(array1, array2, coma1, coma2);

ext=1;

while ~array2(ext)

ext=ext+1;

end;

if length(array1)==1

ext=1;

ARRAY=array2(ext:length(array2));

coma = coma2;

else

[ARRAY,ext,coma]=sum array mex(array1,coma1,array2(ext:length(array2)),coma2);

ARRAY = ARRAY(ext:length(ARRAY));

if (ARRAY(length(ARRAY)))&(coma)

ARRAY = [ARRAY,0];

coma = coma-1;

end;

end

#include "mex.h"

#include "matrix.h"

void sum array mex(double *Array output,double *Array A,double *Array B, int l,int lA,int lB, int add,double *ext){

int value,rest=0,i=0;

if (lA==l){while (i<l−lB){value = *(Array A+i);*(Array output+i) = value;i++;

}while (i<l−add){value = *(Array A+i) + *(Array B+i−l+lB) + rest;rest = value/10;*(Array output+i) = value − rest*10;i++;}

while ((i<l)&&(rest)){value = *(Array A+i) + rest;rest = value/10;*(Array output+i) = value − rest*10;i++;}

while (i<l){value = *(Array A+i);*(Array output+i) = value;i++;}

}else {if (lA>add){while (i<l−lA){value = *(Array B+i);*(Array output+i) = value;i++;}

while (i<l−add){value = *(Array A+i−l+lA) + *(Array B+i) + rest;rest = value/10;*(Array output+i) = value − rest*10;i++;}

while ((i<l)&&(rest)){value = *(Array A+i−l+lA)+ rest;rest = value/10;*(Array output+i) = value − rest*10;i++;}

while (i<l){value = *(Array A+i−l+lA);*(Array output+i) = value;i++;}

}else{

Page 237: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 233

while (i<l−add−1){value = *(Array B+i);*(Array output+i) = value;i++;}

while (i<l−lA){*(Array output+i) = 0;i++;}

while (i<l){value = *(Array A+i−l+lA);*(Array output+i) = value;i++;}

}}i=0;while (!*(Array output+i))i++;

*ext = i+1;}void mexFunction(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[ ]){

int lA, lB, l, lb, c;double *Array A, *Array B, *Array output, coma1, coma2, *ext,*coma;

/*pointers to matrixs*/coma1 = mxGetScalar(prhs[1]);coma2 = mxGetScalar(prhs[3]);plhs[2] = mxCreateDoubleMatrix(1,1,mxREAL);if (plhs[2]==NULL){mexErrMsgTxt("Memory error2!!!");}coma = mxGetPr(plhs[2]);if (coma1<coma2){lA = mxGetN(prhs[0]);lB = mxGetN(prhs[2]);Array A = mxGetPr(prhs[0]);Array B = mxGetPr(prhs[2]);c = coma2−coma1; *coma = coma1;

}else{lA = mxGetN(prhs[2]);lB = mxGetN(prhs[0]);Array A = mxGetPr(prhs[2]);Array B = mxGetPr(prhs[0]);c = coma1−coma2; *coma = coma2;

}lb = c+lB;l = (lA > lb)? lA:lb;plhs[0] = mxCreateDoubleMatrix(1,l,mxREAL);plhs[1] = mxCreateDoubleMatrix(1,1,mxREAL);if (plhs[0]==NULL){mexErrMsgTxt("Memory error0!!!");}if (plhs[1]==NULL){mexErrMsgTxt("Memory error1!!!");}Array output = mxGetPr(plhs[0]);ext = mxGetPr(plhs[1]);

sum array mex(Array output,Array A,Array B,l,lA,lb,c,ext);}

function [ARRAY, coma] = diff array x(array1, array2, coma1, coma2);

% array1 must be higher than array2

[ARRAY,ext,coma]= diff array mex(array1,coma1, array2,coma2);

ARRAY = ARRAY(ext:length(ARRAY)-coma);

coma = coma + coma1;

#include "mex.h"

#include "matrix.h"

void diff array mex(double *Array output,double *Array 1,double *Array 2,int add,int l,int l1,int l2,double *ext,double *coma, double coma1){

int rest=0,value,i=0;

if (l1==l){while (i<l−l2−add){value =*(Array 1+i);*(Array output+i) = value;i++;}

while (i<l−add){value = (10+ *(Array 1+i)) − *(Array 2+i−l+l2+add) − rest;rest = 1−value/10;*(Array output+i) = value − (1−rest)*10;i++;}

while ((i<l)&&(rest)){value = (10+ *(Array 1+i)) − *(Array 2+i−l+l2+add) − rest;rest = 1−value/10;*(Array output+i) = value − (1−rest)*10;

Page 238: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

234 Capıtulo 7. Anexos

i++;}

while (i<l){

value = *(Array 1+i);

*(Array output+i) = value;

i++;}

}else{

if (l1>add){

while (i<l−l1){

value = 10 − *(Array 2+i) − rest;

rest = 1−value/10;

*(Array output+i) = value − (1−rest)*10;

i++;}

while (i<l−add){

value = (10+ *(Array 1+i−l+l1)) − *(Array 2+i) − rest;

rest = 1−value/10;

*(Array output+i) = value − (1−rest)*10;

i++;}

while ((i<l)&&(rest)){

value = (10+ *(Array 1+i−l+l1)) − *(Array 2+i) − rest;

rest = 1−value/10;

*(Array output+i) = value − (1−rest)*10;

i++;}

while (i<l){

value = *(Array 1+i−l+l1);

*(Array output+i) = value;

i++;}

}else{

while (i<l2){

value = 10 − *(Array 2+i) − rest;

rest = 1−value/10;

*(Array output+i) = value − (1−rest)*10;

i++;}

while (i<l−l1){

value = 10 − rest;

rest = 1−value/10;

*(Array output+i) = value − (1−rest)*10;

i++;}

while ((i<l)&&(rest)){

value = (10+ *(Array 1+i−l+l1)) − rest;

rest = 1−value/10;

*(Array output+i) = value − (1−rest)*10;

i++;}

while (i<l){

value = *(Array 1+i−l+l1);

*(Array output+i) = value;

i++;}

}

}

i=l−2;

while (!*(Array output+i))

i−−;

*coma = l−(i+2);

i=0;

while (!*(Array output+i))

i++;

*ext=i+1;

}

void mexFunction(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray

*prhs[ ]){

int l,l1,l2,add;

double *Array 1,*Array 2,*Array output,*ext,*coma, coma1, coma2;

/*pointers to matrixs*/

Array 1 = mxGetPr(prhs[0]);

Array 2 = mxGetPr(prhs[2]);

coma1 = mxGetScalar(prhs[1]);

coma2 = mxGetScalar(prhs[3]);

add = coma2−coma1;

l1 = mxGetN(prhs[0]);

l2 = mxGetN(prhs[2]);

l = (l1>(l2+add))? l1:(l2+add);

plhs[0] = mxCreateDoubleMatrix(1,l,mxREAL);

plhs[1] = mxCreateDoubleMatrix(1,1,mxREAL);

plhs[2] = mxCreateDoubleMatrix(1,1,mxREAL);

if (plhs[0]==NULL){mexErrMsgTxt("Memory error0!!!");}

if (plhs[1]==NULL){mexErrMsgTxt("Memory error1!!!");}

Array output = mxGetPr(plhs[0]);

ext = mxGetPr(plhs[1]);

coma = mxGetPr(plhs[2]);

diff array mex(Array output,Array 1,Array 2,add,l,l1,l2,ext,coma,coma1);

}

Page 239: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 235

function [ARRAY,coma] = mult array x(array1, array2, coma1, coma2);

l1 = length(array1);

l2 = length(array2);

ext=1;

while ~(array2(ext))&(ext<l2)

ext=ext+1;

end;

if ext==l2

ARRAY = [0 0]; coma=0;

else

[ARRAY,ext,leng] = mult array mex(array1,array2(ext:l2-1));

coma = length(ARRAY)-leng+coma1+coma2;

ARRAY = ARRAY(ext:leng);

end;

#include "mex.h"

#include "matrix.h"

void mult array mex(double *Array output,double *Array input1,double *Array input2,int N,int n,double *ext,double *leng){

int rest=0,value,i=0;

for (int i=0;i<N+n;i++){*(Array output+i) = 0;

}for (int s=0;s<n;s++){rest=0;for (int i=0;i<N−1;i++){value = (*(Array input1+i))*(*(Array input2+s))+(*(Array output+i+s))+rest;rest = value/10;*(Array output+i+s) = value − rest*10;

}*(Array output+N−1+s) = rest;

}*(Array output+N+n−2) = rest;i=1;while (!*(Array output+i−1))i++;

*ext = i;i = N+n;while (!*(Array output+i−2))i−−;

*leng = i;}

void mexFunction(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray*prhs[ ]){

int N, n;double *Array input1,*Array input2,*Array output,*ext,*leng;

/*pointers to matrixs*/N = mxGetN(prhs[0]);n = mxGetN(prhs[1]);Array input1 = mxGetPr(prhs[0]);Array input2 = mxGetPr(prhs[1]);plhs[0] = mxCreateDoubleMatrix(1,N+n,mxREAL);plhs[1] = mxCreateDoubleMatrix(1,1,mxREAL);plhs[2] = mxCreateDoubleMatrix(1,1,mxREAL);if (plhs[0]==NULL){mexErrMsgTxt("Memory error1!!!");}if (plhs[1]==NULL){mexErrMsgTxt("Memory error2!!!");}if (plhs[2]==NULL){mexErrMsgTxt("Memory error3!!!");}Array output = mxGetPr(plhs[0]);ext = mxGetPr(plhs[1]);leng = mxGetPr(plhs[2]);

mult array mex(Array output,Array input1,Array input2,N,n,ext,leng);}

function [array,coma] = num2array(num);

if num == 0

array = 0;

coma = 0;

else

i = 1;

while ~floor(num*10^i)

i = i + 1;

end;

coma=i-1;

num = num + 10^-(6+coma);

for i=1:5

array(6-i) = floor(num*10^(i+coma));

Page 240: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

236 Capıtulo 7. Anexos

num = num - array(6-i)*10^(-i-coma);

end;

array = [array,0];

end;

i = 1;

while ~array(i)

i = i + 1;

end;

array = array(i:length(array));

function [out] = Ismayor(array1,array2,coma1,coma2);

[out] = Ismayor mex(array1,array2,coma1,coma2);

#include "mex.h"

#include "matrix.h"

void sum array mex(double *Array 1, double *Array 2, double coma1,double coma2, double *out, int l1, int l2){

int i=3;double a;

if (coma1>coma2){*out = 0;

}else{if (coma1<coma2){

*out = 1;}else{a=*(Array 1+l1−2)−*(Array 2+l2−2);while ((!a)&&(l1−i+1)&&(l2−i+1)){a=*(Array 1+l1−i)−*(Array 2+l2−i);i++;

}if ((a>0)| |((!a)&&(l1>=l2))) {*out = 1;}else{ *out = 0;}

}}}void mexFunction(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[ ]){

int l1, l2;double *Array 1, *Array 2, *out, coma1, coma2;

/*pointers to matrixs*/Array 1 = mxGetPr(prhs[0]);Array 2 = mxGetPr(prhs[1]);l1 = mxGetN(prhs[0]);l2 = mxGetN(prhs[1]);coma1 = mxGetScalar(prhs[2]);coma2 = mxGetScalar(prhs[3]);plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);if (plhs[0]==NULL){mexErrMsgTxt("Memory error!!!");}out = mxGetPr(plhs[0]);

sum array mex(Array 1,Array 2,coma1,coma2,out,l1,l2);}

function bin array = calc bin x(EOF, INCR, EOF coma, INCR coma);

bin array = zeros(1,0);

EOF = [EOF,zeros(1,EOF coma)];

INCR = [INCR,zeros(1,INCR coma)];

lE=length(EOF);

lI=length(INCR);

input = zeros(1,0);

while EOF(lE)==INCR(lI)

EOF(lE)=0;INCR(lI)=0;

EOF = Escalar array x(EOF,2);

INCR = Escalar array x(INCR,2);

bin array = [bin array,input];

if INCR(lI)

input = ’1’ ;

else

input = ’0’ ;

end;

end;

Page 241: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

7.4. Anexo D: Funciones de la Codificacion de Cadenas 237

function bin array = dec2bin array(dec array,num);

%the binary stream go leftest to rigthest

l = length(dec array);

if dec array(l)

error(’error input array’ );

end;

bin array = zeros(1,num);

for i=1:num

dec array = Escalar array(dec array,2);

if dec array(l)

dec array(1) = 0;

bin array(i) = 1;

end;

end;

Page 242: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

238 Capıtulo 7. Anexos

Page 243: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

PLIEGO DE CONDICIONES

Este documento contiene las condiciones legales que guiaran la realizacion del presenteproyecto. En lo que sigue, se supondra que el proyecto ha sido encargado por una empresacliente a una empresa consultora. Supuesto que la utilizacion industrial de los metodosrecogidos en el presente proyecto haya sido decidida por parte de la empresa cliente o deotros, la obra a regularizar, se regulara por las siguientes:

Condiciones generales y legales.

• Artıculo 1: Se abonara al contratista la obra que realmente realice con sujecion alproyecto que sirve de base a la misma, a las modificaciones del mismo autorizadaspor la superioridad o a las ordenes con arreglo a las facultades le sean comunicadaspor escrito al Ingeniero Director de la produccion, si dicha produccion se hace segunlo ajustado en los pliegos de condiciones, con arreglo a los cuales se haran las medidasy valoraciones de las diversas unidades de obra sin que su importe total puedaexceder de la suma total de los presupuestos aprobados. Por consiguiente, el numerode unidades que se corrija en el presupuesto no podra servir de fundamento paraentablar reclamaciones de ninguna especie, salvo en el caso de rescision.

• Artıculo 2: Tanto en las certificaciones de obra como en la liquidacion final, seabonaran al Contratista las obras hechas a precios de ejecucion material que figure enel presupuesto de cada unidad de obra.

• Artıculo 3: Si, excepcionalmente, se hubiese ejecutado algun trabajo que no se hayaajustado a las condiciones de contrata pero que, sin embargo, sea beneficioso oaceptable segun el Director, se dara conocimiento a la autoridad adjudicataria,proponiendo ademas la rebaja del precio que estime justa dicho ingeniero. Si la obraes acertada, quedara el Contratista obligado a conformarse con la rebaja acordada.

• Artıculo 4: Cuando se juzgue necesario emplear materiales o ejecutar obras que nofiguren en el presupuesto, se valorara su importe a los precios que se asignan a talesobras o materiales analogos, si los hubiera, y cuando no, se discutiran entre elIngeniero Director y el Contratista.

• Artıculo 5: Cuando el Contratista, con autorizacion del Ingeniero Director, emplearamateriales de mas esmerada preparacion, de mayores dimensiones que los estimadosen el proyecto o sustituyera una clase de fabrica por otra que tuviese asignado mayorprecio o, en general, introdujera cualquier mejora en la produccion que fuese mejora ajuicio de la Direccion de Obra, no tendra derecho, sin embargo, a lo que correspondesi lo ha hecho con estricta sujecion a lo proyectado o contratado.

• Artıculo 6: El Contratista queda obligado a pagar al Ingeniero Director del Proyectoy al Director de Obra, ası como a los ayudantes, el importe de los honorarios

239

Page 244: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

facultativos de acuerdo con las tarifas ofrecidas por formacion de proyecto, direcciony administracion.

• Artıculo 7: Una vez finalizada la produccion, las unidades seran inspeccionadas porun Ingeniero de Telecomunicacion que designe la empresa adjudicataria.

A las condiciones generales de la empresa cliente pueden anadirse nuevas condicionesimpuestas por la empresa consultora. Esas condiciones particulares se resumen en lassiguientes:

Condiciones particulares.

• Artıculo 8: La propiedad intelectual del trabajo reflejado en el presente proyectopertenece a la empresa consultora representada por el Ingeniero Jefe del Proyecto.

• Artıculo 9: Cualquier tipo de reproduccion, ya sea para uso particular o paracualquier otra aplicacion, debera contar con la autorizacion del Ingeniero Jefe delProyecto, que actuara en nombre de la empresa consultora.

• Artıculo 10: En la autorizacion se hara constar la aplicacion a la que se destinan lasreproducciones, ası como su cantidad.

• Artıculo 11: En todas las reproducciones se indicara su procedencia mostrandoexplıcitamente el nombre del proyecto, el del Ingeniero Jefe del Proyecto y el de laempresa consultora.

• Artıculo 12: El Ingeniero Jefe sera el responsable de la direccion de la aplicacionindustrial, siempre que la empresa consultora lo considere oportuno. En casocontrario, la persona asignada debera contar con la autorizacion del mismo, quiendelegara en el la autoridad que ostente.

240

Page 245: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

Lista de equipos y materiales.

Los medios utilizados para la realizacion del proyecto son los que a continuacion seespecifican:

- Estacion de trabajo Sun Enterprise 450 (2 X UltraSPARC-II 400MHz) de SunMicrosystems con SunOS 5.6 y con 512 Mbytes de RAM y 9 Gbytes en disco.- Ordenador personal Pentium III 700 MHz.- Impresora Lexmark Optra S con 1200x1200 ppp.- Software de procesado y visualizacion cientıfica MATLAB 5.3.1- Procesador de textos LATEX.- Conversores de textos ML2LATEX y LGRIND.- Programa de Dibujo TGIF.- Programa de tratamiento de imagenes XV y IrfanView 3.61.- Editor de textos postcript GHOSTVIEW.

241

Page 246: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

242

Page 247: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

PRESUPUESTO

El coste total del proyecto ha sido calculado atendiendo a los siguientes conceptos:Costes de Uso de Equipos Informaticos.Costes de Personal.Costes de Material Fungible y de Oficina.Gastos Generales, Beneficio Industrial e I.V.A.La duracion estimada del proyecto es de 14 meses, incluyendo el tratamiento de textos.

Presupuesto de Ejecucion Material.

El Presupuesto de Ejecucion Material se elabora a partir de los Costes de Uso de EquiposInformaticos, Costes de Personal y Costes de Material Fungible y de Oficina.

Costes de Uso de Equipos Informaticos

Alquiler de estacion de trabajo Sun( 14 meses a 600 euros/mes) 8.400 eurosOrdenador personal Pentium III 700 MHz 1.620 eurosLicencias de Software (MATLAB) 240 eurosSuma 10.260 euros

Costes de Personal

Ingeniero Superior de Telecomunicacion(1.750 horas a 30 euros/hora) 52.502 eurosSuma 52.502 euros

Costes de Material Fungible y de Oficina

Toner de impresora 90 eurosFotocopias 60 eurosOtros materiales de oficina 120 eurosSuma 270 euros

El Presupuesto de Ejecucion Material se calcula como la suma de cada uno de los costesque acabamos de especificar:

Equipo informatico 10.260 eurosPersonal 52.502 eurosMaterial fungible y oficina 270 eurosSuma 63.032 euros

Gastos Generales y Beneficio Industrial

En este apartado se incluyen los gastos obligados para disponer de una instalacion dondellevar a cabo los trabajos, amortizaciones, cargas fiduciarias, etc., mas el beneficio

243

Page 248: DesarrollodeAlgoritmosde …optica.csic.es/papers/pfc-rredondo.pdf · Otro gran bloque del proyecto es la implentaci¶on del un Toolbox gr¶aflco para Matlab ... 2.33 Movimientos

industrial. Para estos conceptos se establece un recargo del 22% sobre el importe delPresupuesto de Ejecucion Material:

Gastos generales (16%) 10.085 eurosBeneficio Industrial (6%) 3.781 eurosSuma 13.866 euros

Presupuesto de Contrata

Se calcula como la suma del Presupuesto de Ejecucion Material, de los Gastos Generales ydel Beneficio Industrial:

Presupuesto de Ejecucion Material 63.032 eurosGastos Generales y Beneficio Industrial 13.866 eurosSuma 76.898 euros

Presupuesto Total del Proyecto

Se calcula sumando el 16% de I.V.A al Presupuesto de Contrata:

Presupuesto de Contrata 76.898 eurosI.V.A. (16%) 12.304 eurosSuma 89.202 euros

El Presupuesto Total del Proyecto asciende a OCHENTA Y NUEVE MIL DOSCIENTOSDOS EUROS.

Madrid, *** de Junio de 2002,

El Ingeniero

Fdo.: Rafael Redondo Tejedor

244