Sei sulla pagina 1di 93

Practicas de Vdeo Digital

Escuela Universitaria Politecnica de Cuenca


2
Indice general

1. Captura de imagenes 11
1.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 11

2. Tratamiento de imagenes con MATLAB 13


2.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.1. Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.2. Definicion de variables . . . . . . . . . . . . . . . . . . . . . . 15
2.3.3. Ejecucion de funciones . . . . . . . . . . . . . . . . . . . . . . 15
2.3.4. Funciones para trabajar con ficheros de imagenes . . . . . . . 17
2.3.5. Acceso a elementos de una matriz . . . . . . . . . . . . . . . 18
2.3.6. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . 20
2.3.7. Creacion de funciones personalizadas . . . . . . . . . . . . . . 21
2.3.8. Sentencias de control de flujo de programa . . . . . . . . . . . 23
2.3.9. Detalles para mejorar el rendimiento de MATLAB . . . . . . 25
2.4. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 26

3. Operadores puntuales 29
3.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.1. Conversion a niveles de gris . . . . . . . . . . . . . . . . . . . 30
3.3.2. Posterizacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.3. Cambios de brillo y contraste . . . . . . . . . . . . . . . . . . 32
3.3.4. Desplazamientos . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.5. Rotaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 36

4. Operadores Locales 39
4.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.3. Conceptos teoricos previos . . . . . . . . . . . . . . . . . . . . . . . . 39
4.3.1. Filtros FIR digitales . . . . . . . . . . . . . . . . . . . . . . . 39
4.3.2. Propiedad de separabilidad . . . . . . . . . . . . . . . . . . . 41
4.4. Desplazamiento en frecuencia . . . . . . . . . . . . . . . . . . . . . . 43
4.5. Desarrollo de la practica . . . . . . . . . . . . . . . . . . . . . . . . . 44

3
4 INDICE GENERAL

4.5.1. Filtro paso bajo con enventanado rectangular . . . . . . . . . 44


4.5.2. Filtro paso bajo con otros enventanados . . . . . . . . . . . . 45
4.5.3. Filtro paso alto mediante desplazamiento en frecuencia . . . . 46
4.6. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 46

5. Operadores globales 49
5.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.3.1. Visualizacion de la informacion contenida en la FFT . . . . . 50
5.3.2. Eliminacion de componentes frecuenciales . . . . . . . . . . . 52
5.3.3. Eliminacion de componentes suavizada . . . . . . . . . . . . . 52
5.3.4. Filtrado a partir de una respuesta en frecuencia . . . . . . . . 53
5.4. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 53

6. Diezmado e interpolacion 55
6.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.3.1. Diezmado de imagenes . . . . . . . . . . . . . . . . . . . . . . 56
6.4. Interpolacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.5. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 57

7. Interfaces de comunicacion 59
7.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2. Objetivos y motivacion . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.3. Forma de evaluacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.4. Plan de actividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.4.1. Recomendacion UIT-R BT.656 . . . . . . . . . . . . . . . . . 61
7.4.2. Formato del tren de datos comun a los dos interfaces . . . . . 61
7.4.3. Recomendacion UIT-R BT.799 . . . . . . . . . . . . . . . . . 67
7.4.4. Recomendacion UIT-R BT.1120 . . . . . . . . . . . . . . . . 70
7.4.5. Resumen comparativo de los diferentes interfaces . . . . . . . 74
7.5. Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.5.1. Bibliografa basica . . . . . . . . . . . . . . . . . . . . . . . . 75
7.5.2. Bibliografa complementaria . . . . . . . . . . . . . . . . . . . 75

8. Potencial de compresion de la DCT 77


8.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.2. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
8.3.1. Distribucion de la informacion en la DCT de una imagen . . 78
8.3.2. Aplicacion de la DCT a la compresion intracuadro . . . . . . 79
8.4. Resultados de la practica . . . . . . . . . . . . . . . . . . . . . . . . 82

9. Compensacion de movimiento 85
9.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.2. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.3.1. Codificacion de una imagen P . . . . . . . . . . . . . . . . . . 86
INDICE GENERAL 5

9.3.2. Codificacion de una imagen B . . . . . . . . . . . . . . . . . . 89


9.3.3. Comprobacion de funcionamiento de las funciones . . . . . . 92
6 INDICE GENERAL
Indice de figuras

2.1. Dos ejemplos de visualizacion del interfaz de ususarios de Matlab. . 15


2.2. Definicion de variables en la ventana de comandos de Matlab. . . . . 16
2.3. Ejecucion de comandos de la librera y disenados por el usuario. . . . 16
2.4. Acceso a elementos del interior de una matriz. . . . . . . . . . . . . . 19
2.5. Acceso a submatrices. . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.6. Operaciones basicas con matrices. . . . . . . . . . . . . . . . . . . . . 20
2.7. Generacion y ejecucion de funciones de procesamiento por lotes. . . . 21
2.8. Detalle del editor de Matlab. Al detener el cursor del raton sobre
una variable, el programa nos muestra el valor de dicha variable o su
tamano. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.9. Generacion y ejecucion de funciones con paso de parametros. . . . . 22
2.10. El negativo de una imagen se consigue mediante un operador que
denominaremos puntual. . . . . . . . . . . . . . . . . . . . . . . . . . 23

3.1. Operadores puntuales: correspondencia entre pxeles. . . . . . . . . . 29


3.2. Conversion a niveles de gris. . . . . . . . . . . . . . . . . . . . . . . . 30
3.3. La posterizacion tiene una funcion de transferencia E/S en escalera. 31
3.4. Los cambios de brillo y contraste se consiguen con funciones de trans-
ferencia lineales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.5. Al aumentar el contraste en una imagen se hacen mas evidentes los
contornos de los objetos. . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.6. Al disminuir el contraste de una imagen se disimulan los contornos. . 33
3.7. Los desplazamientos unicamente implican cambio de posicion en los
pxeles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.8. Ejemplo de desplazamiento en x de valor N = 1. . . . . . . . . . . . 35

4.1. Mediante el enventanado rectangular limitamos la duracion de la res-


puesta al impulso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2. El Efecto Gibbs es evidente en filtrados paso bajo implementados con
enventanados rectangulares. . . . . . . . . . . . . . . . . . . . . . . . 41
4.3. El enventanado Hamming suaviza la terminacion de la ventana y mi-
nimiza el efecto Gibbs. . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.4. Respuesta en frecuencia de un filtro paso bajo abrupto bidimensional
con forma rectangular. . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.5. La respuesta al impulso del filtro de la figura 4.4 es separable. . . . . 42
4.6. El filtrado paso alto realza los contornos de os objetos. . . . . . . . . 43
4.7. Implementacion de filtrados paso alto a partir de la propiedad de
desplazamiento en frecuencia. . . . . . . . . . . . . . . . . . . . . . . 44

7
8 INDICE DE FIGURAS
Indice de tablas

7.1. Inicio y final de intervalos de supersion vertical. . . . . . . . . . . . . 62


7.2. Bits F, V y H de los codigos SAV y EAV. . . . . . . . . . . . . . . . 63

9
10 INDICE DE TABLAS
Practica 1

Captura de imagenes

1.1. Objetivo
El objetivo de esta practica es comprobar lo habitual y cotidiano que es la imagen
digital y el video digital en el entorno tecnologico en el que nos movemos actual-
mente. Para ello, por una parte se buscaran aplicaciones y sistemas relacionados con
la imagen digital y por otra, se obtendra todo aquel material de vdeo e imagenes
que se utilizara en las practicas de procesado de imagenes a lo largo de todo el
cuatrimestre. Todo este material se podra grabar en el dico duro del servidor tele-
co.uclm.es disponible en el laboratorio de imagen, aunque no esta de mas disponer
de un disquete o PenDrive para transportar los algoritmos o las imagenes que se
desee para la realizacion de las memorias.

1.2. Desarrollo
La primera parte de esta practica consiste en realizar un analisis de los posibles
sistemas y aplicaciones relacionadas con la imagen y el vdeo digital. Los alumnos
haran una lista de aplicaciones y sistemas que obtengan o utilicen en su funciona-
miento imagenes o secuencias digitales, comentandolos muy brevemente.
En segundo lugar, se trata de obtener algunas imagenes digitales con el fin de
utilizarlas en las practicas relacionadas con el procesado digital de imagenes a lo
largo del cuatrimestre. Para dichas practicas, se necesitara el siguiente material:

Una imagen fotografica digitalizada en un formato sin comprimir (por ejemplo


BMP).

Tres fotogramas consecutivos a partir de una secuencia de vdeo, tambien sin


comprimir.

Los alumnos deberan conseguir este material de la forma que estimen oportuna.
Es aconsejable utilizar tamanos de imagenes del orden de 640x480, tamanos mas
grandes seran mas lentos de procesar, aunque tambien se puede trabajar con ellos.

1.3. Resultados de la practica


Al final de la practica se realizara una memoria breve (no mas de dos paginas)
que contenga:

11
12 PRACTICA 1. CAPTURA DE IMAGENES

En primer lugar, una lista con las formas de adquirir imagenes y secuencias
de vdeo digitales y las aplicaciones y sistemas que las utilicen comentandolas
brevemente.

Finalmente, se explicara de forma esquematica la manera en que se ha obtenido


el material que se pide en el apartado 1.2.

La entrega de memorias para su correccion se realizara insertando los ficheros


correspondientes en un directorio llamado vdfinal (todo con minusculas) en la
cuenta del alumno en el servidor teleco.uclm.es; directorio que sera creado por el
alumno, y utilizado para cada una de las practicas de video digital que se realicen.
El plazo para entregar esta memoria sera de una semana.
Practica 2

Tratamiento de imagenes con


MATLAB

2.1. Objetivos
MATLAB es un software orientado al calculo matricial. En esta practica se van
repasar sus caractersticas mas destacables y su manejo basico, tratando de poner
de manifiesto cuales son las aplicaciones en las que resulta mas adecuada su utili-
zacion. Dentro de estas aplicaciones aparece el desarrollo de algoritmos orientados
al procesamiento digital de imagenes, aunque como veremos no su fase de imple-
mentacion. Asimismo, en esta practica se hara un repaso de su forma de uso con el
fin de facilitar el desarrollo de las practicas de esta asignatura relacionadas con el
procesamiento de imagenes.

2.2. Introduccion
La herramienta de calculo matricial MATLAB es, probablemente, la aplicacion
matematica mas utilizada en las fases iniciales del tratamiento digital de senales.
En esta introduccion se apuntan las caractersticas mas importantes que han hecho
posible este exito.
MATLAB esta orientado al calculo eficiente basado en vectores y matrices de
cualquier tamano. Al ser posible representar las senales digitales como vectores y las
imagenes como matrices, se hace muy directo su procesamiento mediante algorit-
mos matematicos en este entorno. El propio MATLAB, ademas, contiene una gran
cantidad de funciones matematicas ya implementadas dispuestas para realizar proce-
samientos complejos. Estas funciones no sera necesario mas que aplicarlas a nuestras
variables matriciales y vectoriales para observar rapidamente sus resultados. Estas
funciones ya implementadas se encuentran organizadas en libreras denominadas
Toolbox.
Ademas de las funciones incluidas en el programa, MATLAB permite al usuario
escribir sus propias funciones para realizar las operaciones que desee. Para ello,
MATLAB utiliza un lenguaje de programacion de muy alto nivel, muy alejado del
lenguaje de la maquina, pero muy sencillo de interpretar por nosotros y por tanto
muy potente y flexible, capaz de expresar en una sola sentencia procesamientos muy
complejos.
Pero MATLAB, a pesar de todas estas ventajas, no es la panacea de los progra-
mas de procesamiento de imagenes. De hecho, este programa es muy poco eficiente

13
14 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

en cuanto a la utilizacion de la memoria. En las imagenes digitales, cada pxel queda


representado por un valor binario de 8 bits. En cambio, MATLAB, para sus pro-
cesamientos, utiliza operaciones en coma flotante con 32 bits de resolucion. Esto es
ciertamente un derroche que afecta a las necesidades de memoria, y a la velocidad
de procesamiento de los algoritmos. Por otra parte, MATLAB utiliza un lenguaje de
programacion interpretado. La diferencia entre un lenguaje interpretado y un len-
guaje compilado radica en que momento se realiza la conversion del codigo escrito al
lenguaje de la maquina. Mientras que los lenguajes compilados utilizan un proceso
de compilacion anterior e independiente a la ejecucion siendo por tanto mas rapidos
de procesar, los programas escritos en un lenguaje interpretado como MATLAB se
compilan en tiempo de ejecucion haciendo esta considerablemente mas lenta, su uti-
lizacion en tiempo real solo es posible con algoritmos sencillos computacionalmente
y mediante un hardware muy potente.
Todo esto, que iremos viendo a lo largo de este apartado de manera muy sencilla
hace que MATLAB sea muy eficiente en la etapa de simulacion de algoritmos de
procesado y para la etapa de desarrollo de nuevos algoritmos; aunque en la etapa
de implementacion es mas apropiado utilizar lenguajes compilados como puede ser
el lenguaje C.

2.3. Desarrollo
A continuacion se van a ofrecer una serie de nociones sobre la utilizacion de
MATLAB. Estas nociones seran de cinco tipos fundamentales:

Nociones de generacion acceso y utilizacion de vectores y matrices.

Utilizacion de funciones de la librera.

Generacion de funciones especficas por parte del usuario.

Manejo y tratamiento de imagenes.

Eficiencia computacional.

A lo largo de este apartado se iran proponiendo ejercicios y cuestiones teoricas


con el fin de aclarar los recursos y tecnicas aqu planteados que seran de utilidad
para las siguientes practicas.

2.3.1. Interfaz de usuario


El interfaz de usuario de MATLAB Permite visualizar diferentes ventanas. En
los dos ejemplos que aparecen en la figura 2.1, a la derecha aparece la ventana de
comandos en la que iremos escribiendo todos los mandatos y funciones que queramos
ejecutar, ya sean propias de la aplicacion o hechas por nosotros.
En el ejemplo izquierdo de la figura 2.1 podemos ver en su parte izquierda una
ventana de directorios en la que podemos acceder a ayudas de las funciones de cada
Toolbox. En el caso del ejemplo estan desplegados los puntos de acceso de la Toolbox
de procesado de imagen. Tambien bajo la anterior aparece otra ventana para escoger
el directorio actual en el que se buscaran las funciones a ejecutar. En la figura de la
derecha aparece otro ejemplo en el que podemos ver una ventana con informacion
de las variables utilizadas en el programa, y un historico de comandos ejecutados.
2.3. DESARROLLO 15

Figura 2.1: Dos ejemplos de visualizacion del interfaz de ususarios de Matlab.

La ventana de comandos de MATLAB, situada en los dos casos anteriores a la


derecha, es realmente un interprete de comandos en el que nosotros podemos ejecutar
cualquier operacion sobre una o mas variables y nos devolvera el resultado de dicha
operacion. En este apartado veremos como definir variables matriciales, veremos
como realizar operaciones, como aplicar funciones a las variables, y finalmente como
crear nuestras propias rutinas.

2.3.2. Definicion de variables

La definicion de variables se realiza en MATLAB mediante la expresion:


Variable = [fila1; fila2; fila3; ...]
utilizandose espacios en blanco o ,para separar los elementos de una fila, y
;para separar las filas entre s.
En la figura 2.2 podemos observar las formas mas habituales de definir variables.
La variable var_01 es una matriz de tamano 1x1, es decir un numero real, de valor
18. La variable var_02 es una matriz con tres filas y tres columnas en la que se
definen cada uno de sus terminos. Finalmente, la variable var_03 es una matriz 4x3
construida a partir de anadirle a var_02 la cuarta fila.
En el caso en que no sepamos el tamano que va a alcanzar una matriz, podemos
definirla como vaca, como en el ejemplo var_04; de esta manera, posteriormente,
podemos ir situando elementos en la matriz y el programa la redimensionara segun
las necesidades. Hay que tener cuidado con esta opcion ya que consume mucha
memoria, y mucho tiempo de acceso en las operaciones que se realicen sobre ellas.

2.3.3. Ejecucion de funciones

Las funciones implementadas en las libreras o toolbox de MATLAB se utilizan


atendiendo al siguiente formato:
resultado = funcion(parametro1, parametro2, ...)
En el caso en que se omita el nombre de la variable resultado, se creara una
variable llamada ans que contendra la salida de la funcion utilizada. En la figura 2.3
podemos contemplar algunos ejemplos.
16 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

Figura 2.2: Definicion de variables en la ventana de comandos de Matlab.

Figura 2.3: Ejecucion de comandos de la librera y disenados por el usuario.


2.3. DESARROLLO 17

Ejercicio:
(a) Definir una variable de matlab que contenga la raiz cuadrada de 27016839424
(para ello puede consultarse la ayuda de la funcion de Matlab sqrt()).

2.3.4. Funciones para trabajar con ficheros de imagenes


MATLAB tiene capacidad de leer ficheros de imagenes y convertirlos a variables
matriciales del entorno de trabajo. La informacion de una imagen se convierte pues
en una matriz de numeros, a la que posteriormente se le puede aplicar cualquier fun-
cion o algoritmo matematico, ya sea de los contenidos en la librera o uno disenado
a medida. Una vez procesada una matriz, MATLAB nos permite visualizar los re-
sultados en la pantalla, o volver a almacenarla en el disco como fichero de imagen.
Los formatos compatibles con estas funciones son:

jpg or jpeg Joint Photographic Experts Group (JPEG)

tif or tiff Tagged Image File Format (TIFF)

gif Graphics Interchange Format (GIF)

bmp Windows Bitmap (BMP)

png Portable Network Graphics

hdf Hierarchical Data Format (HDF)

pcx Windows Paintbrush (PCX)

xwd X Window Dump (XWD)

cur Windows Cursor resources (CUR)

ico Windows Icon resources (ICO)

El comando para leer una imagen de un fichero y convertirla a matriz numerica


es imread, y un ejemplo de funcionamiento es este.
>> matriz_imagen = imread(nombre_fichero, formato);
donde matriz_imagen es el nombre de variable que almacenara el contenido
de la imagen, nombre_fichero es el nombre del fichero que contiene la imagen, y
formato es el formato del fichero imagen, que puede ser cualquiera de los vistos
en la tabla anterior.
Los datos contenidos en las matrices asociadas a imagenes que definen cada pxel,
pueden ser enteros sin signo de tamano 8 (tipo uint8) o numeros en coma flotante de
32 bits (tipo double). En el primer caso, la informacion de cada pxel estara definida
por valores entre 0 y 255. En el segundo caso, el margen de valores sera entre 0 y 1.
El tipo uint8 es el tipo por defecto cuando se utiliza imread(), pero no es compatible
con la mayora de las operaciones matematicas, por lo que sera necesario pasar las
variables matriciales a tipo double (ver ayuda de la funcion double()) y una vez
hechas las operaciones volver a pasar a uint8 (ver ayuda de la funcion uint8() Para
mas informacion consultar la ayuda de MATLAB.
Para visualizar una matriz como una imagen se utilizan los mandatos imshow,
e image. El formato habitual de uso es:
>> imshow(matriz_imagen)
18 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

con el se visualiza el contenido de la variable en forma de imagen, que sera en


escala de grises si la matriz es bidimensional o en color si se trata de una matriz
tridimensional de tamano MxNx3.
Si queremos almacenar una matriz resultado como un fichero grafico utilizaremos
el comando imwrite. Un ejemplo de utilizacion puede ser:
>> imwrite(matriz_imagen, nombre_fichero, formato):
Puede encontrarse informacion sobre parametros de cada formato en la ayuda
de Matlab.

Ejercicios:
(a) Convertir el fichero armario.bmp a una variable de matlab y obtener el
tamano de la matriz resultado mediante la funcion size() (ver la ayuda de
Matlab).

(b) Convertir el fichero armarioBN.bmp a una variable de matlab y obtener


nuevamente e tamano de la matriz resultado mediante la funcion size().

(c) Que diferencias encuentras en ellas?.

2.3.5. Acceso a elementos de una matriz


El acceso a elementos de una matriz se realiza mediante la expresion:
variable = matriz(fila, columna, plano, ...)
siendo fila, la primera dimension de la matriz, columna la segunda, plano la
tercera, etc.
En los ejemplos de la figura 2.4 tenemos una matriz de tamano 3x3, y en primer
lugar, con var_05 accedemos al elemento de la fila 2 y columna 3. Con var_06
accedemos al elemento de la segunda fila y primera columna; Se puede observar que
la columna 1 se toma por defecto. En var_07 accedemos a toda la fila 2, utilizando
en el campo de las columnas en comodn :. Finalmente, en var_08 accedemos a
varios elementos de la fila 2; en concreto a los elementos entre la columna 2 y la
3. El uso del signo : tambien realiza las mismas funciones si se aplica a las filas,
como en la figura 2.5, dando como resultado vectores columna; y si se aplica en las
dos dimensiones, da como resultado submatrices.

Ejercicios:
Para conocer el contenido de las matrices asociadas a imagenes en color se rea-
lizaran las siguientes pruebas:

(a) Convertir el fichero armario.bmp a una variable de matlab.

(b) Como se ha visto en la seccion 2.3.4 las imagenes en color estan compuestas
por tres planos. En este ejercicio se pondran a cero los planos 2 y 3 de la
variable obtenida en el ejercicio (a), y se visualizara el resultado mediante la
funcion imshow().

(c) De la misma manera que en el ejercicio (b), poner a cero los planos 1 y 3 de
la variable obtenida en el ejercicio (a) y visualizar el resultado mediante la
funcion imshow().
2.3. DESARROLLO 19

Figura 2.4: Acceso a elementos del interior de una matriz.

Figura 2.5: Acceso a submatrices.


20 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

(d) Nuevamnte, a partir de la variable obtenida en el ejercicio (a), poner a cero


los planos 1 y 2 y visualizar el resultado mediante la funcion imshow().

(e) Que conclusiones se pueden obtener de los resultados anteriores?.

2.3.6. Operaciones con matrices


Los operadores mas habituales son los clasicos suma (+), resta (-), multiplicacion
(*), y division (/). Estos operadores se aplican, por defecto, de forma matricial. En el
caso en que se quiera por ejemplo realizar un producto entre los elementos homologos
de dos matrices, o lo que es lo mismo considerando las matrices como un array, en
vez de el operador (*) debemos usarlo con un punto delante (.*).
En el ejemplo de la figura 2.6, se define la matriz var_11 de 6x3 que sera utilizada
como dos matrices de 3x3 en las siguientes operaciones. La variable var_12 es la suma
de las dos matrices, y por tanto la suma de sus elementos. La variable var_13 es
el resultado del producto matricial de las dos matrices 3x3. Por ultimo, la variable
var_14 es el resultado de multiplicar las matrices elemento a elemento.

Figura 2.6: Operaciones basicas con matrices.

Ademas de los operadores aritmeticos podemos utilizar los operadores logicos


and (&), or (|), etc.

Ejercicios:

(a) A partir de un fichero imagen, realizar la operacion salida=255-imagen en


matlab, donde imagen es la variable de matlab que representa a la imagen
del fichero. Visualizar y analizar el resultado obtenido (esta operacion puede
realizarse pxel a pxel o con la matrz completa).

(b) A partir de un fichero de imagen, multiplicar independientemente cada uno


de los planos por un factor, entre 0 y 3. Visualizar y analizar el resultado
obtenido.
2.3. DESARROLLO 21

2.3.7. Creacion de funciones personalizadas


MATLAB tambien permite al usuario definir sus propias funciones. En primer
lugar, hemos de considerar que las funciones de MATLAB pueden ser funciones
escritas en lenguaje C y compiladas, que no se contemplaran en estas practicas; y
funciones escritas en el propio lenguaje de MATLAB, que son las que nos interesan.
Existen dos tipos de funciones en lenguaje MATLAB: unas son, realmente, fiche-
ros de procesamiento por lotes, y no se les pueden pasar parametros pero devuelven
un resultado; las otras, son funciones propiamente dichas a las que se les pasan los
parametros necesarios, devolviendo tambien el resultado de las operaciones realiza-
das. Ambos tipos de funciones se implementan como ficheros de texto ASCII que
deben tener extension .m.
MATLAB posee su propio editor ASCII que se abre desde la ventana de coman-
dos mediante el mandato edit. De esta manera se abre el editor con una nueva
funcion en blanco. Tambien es posible abrir una funcion ya implementada para edi-
tarla escribiendo el comando edit mi_funcion, siendo mi_funcion.m el fichero que
contiene la funcion a editar. En la figura 2.7 podemos ver ejemplos de funciones de
procesamiento por lotes y su ejecucion, as como su modo de utilizacion.

Figura 2.7: Generacion y ejecucion de funciones de procesamiento por lotes.

Por su parte, en la figura 2.8 aparece un detalle del editor que permite ver el
valor de las variables simplemente superponiendo el cursor en ellas.
Finalmente, en la figura 2.9 podemos observar el detalle de la implementacion de
una funcion con parametros en el editor y su utilizacion en la ventana de comandos.

Ejercicios:
(a) Una imagen es el negativo de otra cuando los pxeles homologos de cada una de
ellas tienen colores complementarios. A partir del ejercicio (a) realizado en el
apartado 2.3.6, implementar una funcion que llamaremos negativo(). Dicha
funcion tendra el formato matriz_negativo = negativo(matriz_imagen).
En esta funcion, el parametro matriz_imagen es una variable matricial de
MATLAB que representa a una imagen leda previamente con la funcion
22 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

Figura 2.8: Detalle del editor de Matlab. Al detener el cursor del raton sobre una
variable, el programa nos muestra el valor de dicha variable o su tamano.

Figura 2.9: Generacion y ejecucion de funciones con paso de parametros.


2.3. DESARROLLO 23

imread(), y el resultado matriz_negativo de esta funcion sera otra varia-


ble matricial que representa a la imagen negativo de matriz_imagen y es
visualizable mediante laq funcion imshow(). En la figura 2.10 pueden verse
una imagen y su negativo.

(b) Igualmente, a partir del ejercicio (b) del apartado 2.3.6, implementar una fun-
cion que llamaremos cambiacolor() que tenga como entradas, cuatro parame-
tros: en primer lugar una matriz imagen fichero de imagen, y los tres siguientes
los tres factores que se aplicaran a cada uno de los planos de la matriz de entra-
da. Esta funcion devolvera a la salida una matriz imagen visualizable mediante
imshow().

(a) Original (b) Negativo

Figura 2.10: El negativo de una imagen se consigue mediante un operador que de-
nominaremos puntual.

2.3.8. Sentencias de control de flujo de programa


Las sentencias de control de flujo de programa de MATLAB estan inspiradas
en el lenguaje C y por tanto tienen formatos y utilidades muy parecidas. En este
apartado se hace un esbozo de su funcionamiento; puede obtenerse mas informacion
en la ayuda.

El comando if comprueba una condicion para elegir entre dos grupos de sen-
tencias a ejecutar. La condicion se expresa en base a operadores logicos, como
, , =, ==, =, &, etc. Todos estos y mas pueden encontrarse
en la ayuda. Un ejemplo es el siguiente:

if I == J
A(I,J) = 2;
elseif abs(I-J) == 1
A(I,J) = -1;
else
A(I,J) = 0;
end
24 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

Observese que el operador = es un operador de asignacion, mientras que ==


es un operador logico. El operador es muy utilizado en America y aparece en
los teclados de esta procedencia. En los teclados europeos tenemos que buscarlo por
su codigo ASCII, que es el 126. As pues, para escribirlo debemos pulsar la tecla
Alt y, sin soltarla, marcar el numero 126 en el bloque numerico de la derecha del
teclado.
El comando for se utiliza para repetir un conjunto de sentencias un numero
especfico de veces. Algunos ejemplos de utilizacion son los siguientes.
FOR I = 1:N,
FOR J = 1:N,
A(I,J) = 1/(I+J-1);
END
END
En los casos anteriores, I y J se incrementan de unidad en unidad. Si que-
remos que los incrementos sean diferentes podemos utilizar el ejemplo siguiente.
FOR S = 1.0: -0.1: 0.0,
. . . ;
END
en este caso S se incrementa en pasos de -0.1, o lo que es lo mismo, se decrementa
en pasos de valor 0.1.
El comando while repite un conjunto de sentencias un numero indefinido de
veces. Un ejemplo de utilizacion es el siguiente.
n=1; a=3;
while a < 100000,
a = a^2;
n = n+1;
end
Los comandos switch y case van asociados para escoger entre varios gru-
pos de sentencias, basandonos en una expresion. Un ejemplo, asumiendo que
METODO es una cadena de caracteres, es el siguiente.
switch lower(METODO)
case {lineal,bilineal}
disp(Metodo es lineal)
case cubico
disp(Metodo es cubico)
otherwise
disp(Metodo desconocido.)
end

Ejercicio:
(a) Mejorar la funcion cambiacolor() del apartado anterior de manera que, cuan-
do la matriz de entrada sea en color realice el procesamiento encomendado, y
cuando la matriz de entrada sea en niveles de gris (blanco y negro) devuelva la
misma imagen que se paso como entrada sin aplicarle ningun procesamiento.
Esta funcion se debera llamarcambiacolor2().
2.3. DESARROLLO 25

2.3.9. Detalles para mejorar el rendimiento de MATLAB


En primer lugar, tenemos que decir que MATLAB visualiza por defecto todos los
resultados intermedios de las operaciones que se realizan. La representacion en pan-
talla de datos intermedios es realmente util en las fases de desarrollo y comprobacion
del funcionamiento de los algoritmos, para detectar errores, pero una vez terminada
esa fase, dado que dicha visualizacion consume mucho tiempo de ejecucion, es acon-
sejable anadir un signo ; al final de los comandos de los que no necesitamos ver
sus resultados. De esta manera se indica al programa que no los visualice
Por otra parte, MATLAB utiliza dos tipos de funciones:

Todas las funciones escritas en ficheros *.m son funciones escritas en un


lenguaje interpretado, que se deben compilar en el momento de ser ejecutadas,
lo que las hace mas lentas.

En cambio, otras operaciones como los productos de matrices, estan imple-


mentadas, y compiladas, en el nucleo de la aplicacion, lo que las hace mucho
mas rapidas.

En este sentido, por ejemplo, para calcular el resultado de un sumatorio de pro-


ductos, es mucho mas eficiente utilizar el producto escalar de dos vectores (vector1 .*
vector2), y el comando suma acumulada (sum(vector)), que implementar un bucle
for realizando cada producto y la suma acumulada.
As, una operacion como esta:

300
X
y= ai x[i]
i=1

puede resolverse facilmente de esta manera

y=0;
for i = 1:300
y = y + (a(i) * x(i));
end

pero es mucho mas eficiente utilizar


y = sum(a .* x);
Como norma general, cuando sea posible debe evitarse el uso de bucles for o
while en funciones de MATLAB; pero, si el uso de bucles es imprescindible por
cualquier razon, es conveniente sacar de el todo aquello que no sea necesario hacer
reiterativamente. Por ejemplo, el siguiente es un desarrollo valido:

for i=1:(62.5 * 4.8)


. . .;
B = B + 35 * sqrt(2) * x(i);
. . . ;
end

pero es mucho mas eficiente utilizar:


26 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB

factor1 = 35 * sqrt(2); fin=62.5 * 4.8;


for i=1:fin
. . .;
B = B + factor1 * x(i);
. . . ;
end

ya que en el primer caso el producto 35 * sqrt 2se realizara 300 veces, y en el


segundo una sola.
Por ultimo, es importante saber que la utilizacion en MATLAB de las llamadas
matrices vacas, que se van redimensionando conforme se las usa, son muy poco
eficientes. Las matrices vacas conforme se les van anadiendo elementos, estos se van
situando mediante punteros a una lista, haciendo complicado el acceso independiente
a sus elementos. Estas matrices vacas son utiles cuando no se puede saber de ninguna
manera el tamano que va a tomar una matriz; y esto es raro que suceda; siempre se
suele tener una estimacion del tamano maximo. Otra posibilidad es cuando la matriz
a utilizar va a tener solo un 10 % de los elementos distintos de cero. En este ultimo
caso, se puede justificar el empleo de matrices vacas por economa de memoria.

Ejercicios:
(a) Ejecutar la funcion eficiencia_no2.m y anotad el tiempo requerido para su
ejecucion.
(b) Analizar la operacion que se esta realizando a partir del listado de la misma.
(c) Ejecutar la funcion eficiencia_no1.m y anotad el tiempo requerido para su
ejecucion.
(d) Analizar lo que ha cambiado respecto a eficiencia_no2.m a partir de los
listados de las funciones.
(e) Ejecutar la funcion eficiencia_no.m y anotad el tiempo requerido para su
ejecucion.
(f) Analizar lo que ha cambiado respecto a eficiencia_no1.m a partir de los
listados de las funciones.
(g) Ejecutar la funcion eficiencia_si.m y anotad el tiempo requerido para su
ejecucion.
(h) Analizar lo que ha cambiado respecto a eficiencia_no.m a partir de los lis-
tados de las funciones.

2.4. Resultados de la practica


Al final de la practica se realizara una memoria breve contestando a las cuestio-
nes que se han venido planteando a lo largo del desarrollo y aportando los listados de
las funciones .m solicitadas. Todos los ficheros *.m que se han solicitado seran
probados mediante la siguiente funcion de test para comprobar su funcionamiento.
Dicha funcion esta disponible para su uso por parte de los alumnos, siendo aconseja-
ble que sea comprobado el funcionamiento de todas las funciones pedidas, de forma
previa a la entrega del material para su correccion.
2.4. RESULTADOS DE LA PRACTICA 27

La entrega de memorias para su correccion se realizara insertando los ficheros


correspondientes en un directorio llamado vdfinal (todo con minusculas) en la
cuenta del alumno en el servidor teleco.uclm.es; directorio que sera creado por el
alumno, y utilizado para cada una de las practicas de video digital que se realicen.
El plazo para entregar esta memoria sera de una semana.

function error = repaso(fichero_imagen)

% ---------------------------------------------------------------
% La entrada a esta funcion es un nombre de fichero de imagen con
% el formato nombre_fich.ext.
%
% ESTE FICHERO NO SE DEBE MODIFICAR BAJO NINGUN CONCEPTO.
% SE DEBEN ADAPTAR LAS FUNCIONES PARA QUE FUNCIONEN CON ESTE
% FICHERO TAL Y COMO ESTA.
%----------------------------------------------------------------

matriz = imread(fichero_imagen);

% Obtencion del negativo


figure(4);
subplot(1,2,1);
imshow(matriz);
title(Original)

subplot(1,2,2);
imshow(negativo(matriz));
title(Negativo)

% Cambio de colores
figure(2);
subplot(2,2,1);
imshow(cambiacolor(matriz, 100, 100, 100));
title(R=100, V=100, A=100)

subplot(2,2,2);
imshow(cambiacolor(matriz, 200, 100, 100));
title(Rojo=200, V=100, A=100)

subplot(2,2,3);
imshow(cambiacolor(matriz, 100, 150, 100));
title(R=100, Verde=150, A=100)

subplot(2,2,4);
imshow(cambiacolor(matriz, 100, 100, 50));
title(R=100, V=100, Azul=50)
28 PRACTICA 2. TRATAMIENTO DE IMAGENES CON MATLAB
Practica 3

Procesado digital de imagenes:


Operadores puntuales

3.1. Introduccion
Para el procesamiento digital de imagenes podemos utilizar diferentes funciones
que se clasifican como: operadores puntuales, operadores locales, operadores por
bloques, y operadores globales. De todas estas los mas sencillos son los operadores
puntuales.
Los operadores puntuales, como puede apreciarse en la figura 3.1 producen en
la salida una imagen en las que cada pxel es funcion exclusivamente de un pxel
de la imagen de entrada. Con estas operaciones son posibles transformaciones de
intensidad y de geometra. Ejemplos de transformaciones de intensidad que se pueden
hacer con este tipo de operadores son: el calculo del el negativo de una imagen,
modificar el brillo y el contraste, el cambio de la profundidad del color (operacion
que en algunos programas se denomina posterizacion). Por su parte algunas de
las transformaciones geometricas pueden ser traslaciones, giros y deformaciones.

Figura 3.1: Operadores puntuales: correspondencia entre pxeles.

3.2. Objetivo
El objetivo de esta practica es aplicar diversos operadores puntuales a alguna
de las imagenes obtenidas en la practica 1. Con ello, se persigue, ademas, el conoci-
miento de las posibilidades que ofrecen estos operadores tan sencillos.

3.3. Desarrollo
Las funciones que se piden durante el desarrollo de esta practica tendran un
nombre de funcion y un formato especfico. Dicho formato debe ser respetado escru-

29
30 PRACTICA 3. OPERADORES PUNTUALES

pulosamente, ya que las funciones seran probadas todas y cada de ellas una mediante
otra funcion de MATLAB que las ira ejecutando, y mostrara sus resultados de forma
automatica. Dicha funcion de prueba, que para esta practica se llama puntuales()
estara disponible en la pagina web de la asignatura, con el fin de que los alumnos
comprueben el funcionamiento de sus algoritmos antes de entregar los resultados
para su correccion.
Por otra parte, deben disenarse las funciones para que procdesen las imagenes
con independencia del tamano de la matriz de entrada. En aquellos casos en los que
sea necesario conocer el tamano para realizar algun procesamiento, dicho tamano se
obtendra con la funcion size().

3.3.1. Conversion a niveles de gris


Una transformacion de intensidad sencilla con imagenes en color es convertirlas a
imagenes en niveles de gris. Para ello, debemos obtener el nivel de brillo de cada uno
de los pxeles, a partir de sus niveles de color. El resultado de esta transformacion
se puede ver en la figura 3.2

Figura 3.2: Conversion a niveles de gris.

Partimos de imagenes compuestas por tres planos, plano de rojo, plano de verde
y plano de azul, en las que el margen dinamico de cada uno de los colores primarios
va desde 0 a 255, correspondiendo 0 al nivel de intensidad mas bajo, y 255 al mas
alto. A partir de esta informacion hemos de extraer el nivel de brillo de cada pxel
multiplicamdo el nivel de intensidad de cada color primerio por el factor correspon-
diente y sumando. Como expresion que relaciona el nivel de brillo de un pxel con los
niveles de intensidad de cada primario se puede utilizar la que aparece en la norma
UIT-R BT.601, que es la suguiente:

Y = 0, 45 R + 0, 37 G + 0, 11 B

Ejercicio:
(a) Implementar una funcion con el formato siguiente:

matriz_gris = gris(matriz_imagen)

Esta funcion convertira la matriz matriz_imagen de tamano NxMx3 que con-


tiene la informacion de una imagen en color, en una matriz bidimensional de
3.3. DESARROLLO 31

tamano NxM, que represente a la misma imagen pero en niveles de gris. Debe
tenerse en cuenta que la matriz de salida debe estar compuesta por elementos
enteros sin signo de longitud 8 (ver funcion uint8()) para poder ser visuali-
zada con la funcion imshow().

3.3.2. Posterizacion
La posterizacion permite disminuir el numero de niveles de tono (colores), o
valores de luminosidad para la imagen a procesar. Por ejemplo, si se escogen dos
niveles tonales en una imagen RGB, se limita la profundidad de color a ocho colores:
000-Negro, 001-Azul, 010-Verde, 011-Cian, 100-Rojo, 101-Magenta, 110-Amarillo y
111-Blanco.
Este procesamiento es util para crear efectos especiales como areas grandes y
planas en una fotografa. Los efectos de este comando resultan mas evidentes si se
reduce el numero de niveles de gris en una imagen de escala de grises. Sin embargo,
tambien se puede utilizar este comando para producir algunos efectos interesantes
en imagenes en color.
Basicamente lo que hace la posterizacion es cuantificar los niveles de intensidad
de cada color con menos bits; de forma que los colores y los niveles de intensidad se
reducen dependiendo de dicha cuantificacion. Algoritmicamente puede entenderse el
proceso ilustrandolo con la figura 3.3.

Se calcula el numero de niveles de entrada que corresponden a cada nivel de


salida, dividiendo el nuvel maximo a la entrada por el numero de niveles a la
salida.
Se situa cada nivel de entrada en el nivel de salida que le corresponde dividiendo
cada valor de entrada por la cantidad de anterior y truncando la parte decimal.
se recupera el margen dinamico multiplicando por el nivel maximo a la salida
y dividiendo por el numero de niveles discretos de salida.

Figura 3.3: La posterizacion tiene una funcion de transferencia E/S en escalera.

Todo este proceso se resume en la siguiente expresion:


" #
V Smax Entrada
Salida = entero V Emax
N Smax NS max
32 PRACTICA 3. OPERADORES PUNTUALES

donde Salida es cada uno de los valores de los pxeles de salida, V Smax es el
valor de salida maximo posible, N Smax es el numero de niveles discretos posibles a
la salida (numero de niveles de cuantificacion), Entrada es cada uno de los valores
de los pxeles de entrada y V Emax es el valor maximo a la entrada.

Ejercicios:
(a) Implementar una funcion con el formato siguiente:

matriz_posterizada = posteriza(matriz_imagen, niveles)

Esta funcion convertira la matriz matriz_imagen que contiene la informacion


de una imagen en color, en otra matriz del mismo tamano que represente a
la misma imagen pero con una profundidad de color dada por el parametro
niveles Debe tenerse en cuenta que la matriz de salida debe estar compuesta
por elementos enteros sin signo de longitud 8 (ver funcion uint8()) para poder
ser visualizada con la funcion imshow().

(b) Comprobar que para un valor de 2 niveles en la imagen de salida solo apa-
recen los ocho colores posibles vistos en parrafos anteriores.

(c) Analizar para que valor mnimo de niveles deja de apreciarse claramente el
efecto porducido por la perdida de profundidad de color.

3.3.3. Cambios de brillo y contraste


Mediante los cambios de brillo y contraste podemos conseguir resaltar un objeto
aumentando su iluminacion o las diferencias de intensidad dentro de unos margenes
determinados, o disimularlo oscureciendolo o disminuyendo el margen de niveles de
intensidad existentes. La relacion entre la entrada y la salida de un sistema que
modifica el brillo o el contraste es una relacion lineal semejante a la que puede verse
en la figura 3.4.

Figura 3.4: Los cambios de brillo y contraste se consiguen con funciones de transfe-
rencia lineales.

Las ecuaciones que definen la relacion entre la entrada y la salida en esta grafica
es la siguiente:
3.3. DESARROLLO 33

y = ya + m (x xa )
Donde m es la pendiente de la recta y (xa , ya ) es un punto contenido en dicha
recta. En la figura 3.5 puede verse el resultado de aumentar el contraste a una
imagen, y en la figura 3.6 la disminucion del mismo.

Figura 3.5: Al aumentar el contraste en una imagen se hacen mas evidentes los
contornos de los objetos.

Figura 3.6: Al disminuir el contraste de una imagen se disimulan los contornos.

En este proceso han de tenerse en cuenta las siguientes consideraciones:

El cambio de brillo que se produce en una imagen de entrada a traves de este


procesamiento podemos considerarlo proporcional a la variacion de superficie
de la parte inferior de la funcion de transferencia de la figura 3.4. As pues,
un aumento en el valor de ya sin variar m ni xa implicara un aumento en el
brillo.

Por su parte, un cambio en la pendiente m de la funcion de transferencia im-


plicara un cambio de contraste. Puede verse que dicho cambio en la pendiente
implica variaciones diferentes en los margenes de intensidad a la entrada y a
la salida.

Si se quiere modificar el contraste sin alterar el brillo de la imagen de entrada


sera necesario buscar un punto (xa , ya ) en el cual, modificando la pendiente m
no vare la superficie inferior de la funcion de transferencia de la figura 3.4.
34 PRACTICA 3. OPERADORES PUNTUALES

Ejercicios:
(a) En este apartado se implementara una funcion de cambio de brillo y contraste
con el formato: matriz_contraste = contraste(matriz_imagen, m, Y_a);
donde m es la pendiente de la funcion de transferencia entrada/salida e Ymed
es el valor de salida que corresponde con la entrada Xmed=128 de la grafica.
Con ellos se configurara la curva que aumentando m.aumentara el contraste
sin variar el brillo y aumentando Ymed aumentara el brillo sin afectar al con-
traste. Debe tenerse en cuenta que la matriz de salida debe estar compuesta
por elementos enteros sin signo de longitud 8 (ver funcion uint8()) para poder
ser visualizada con la funcion imshow().

(b) Comprobar que para valores de m = 2 y m = 0, 5 con valores de Y med = 128


aumenta y disminuye respectivemente el contraste sin afectar al brillo.

(c) Comprobar que para valores de Y med = 192 e Y med = 64 con valores de
m = 1 aumenta y disminuye respectivemente el brillo sin afectar al contraste..

3.3.4. Desplazamientos
Hasta ahora, las funciones que hemos disenado trabajaban siempre sin que los
pxeles sufrieran ningun cambio de posicion. Las transformaciones geometricas van
a afectar unicamente a dichas posiciones, sin tener porque cambiar niveles de inten-
sidad.
La transformacion de desplazamiento es la transformacion geometrica mas sen-
cilla. Simplemente consiste en cambiar las posiciones de los pxeles en una cantidad
fija tanto en la direccion x como en la y. En la figura 3.7 puede verse algunose
ejemplos de desplazamientos en cada una de las direcciones.

Figura 3.7: Los desplazamientos unicamente implican cambio de posicion en los


pxeles.
3.3. DESARROLLO 35

Como ejemplo de implementacion del desplazamiento, a continuacion se muestra


el caso de tener que desplazar la imagen un pixel a la derecha. Puede verse en la
figura 3.8 que un desplazamiento de valor N en la direccion x implica situar a la
salida en las posiciones x = (N +1 : Xmax ) lo que hay en la entrada en las posiciones
x = (1 : Xmax 1).

Figura 3.8: Ejemplo de desplazamiento en x de valor N = 1.

Ejercicios:
(a) En este apartado se va a implementar una funcion que ofrezca a la salida
la misma imagen pasada como parametro a la entrada, pero desplazada una
cierta cantidad en las direcciones x e y. El formato de esta funcion sera este:
matriz_desplaza = desplaza(matriz_imagen, desp_x, desp_y); donde la
variable matriz_imagen es la variable matricial asociada a la imagen a proce-
sar, y desp_x y desp_y son los desplazamientos dados en pxeles. Debe tenerse
en cuenta que los desplazamientos de x positivos seran hacia la derecha, y los
desplazamiento de y positivos seran hacia abajo.

(b) Probar la funcion implementada anteriormente con valores de desplazamientos


positivos y negativos indistintamente en cada direccion.

Una vez desarrollada esta funcion sera sencillo aplicarle al desplazamiento de


cada pixel funciones lineales, senoidales o de cualquier otro tipo para conseguir
diferentes efectos, pero esto queda mas alla del objetivo de esta practica y por tanto
no se implementara aqu.

3.3.5. Rotaciones
De forma general para implementar una rotacion de una imagen, la primera
idea que se nos puede ocurrir es transformar las coordenadas cartesianas en polares,
anadir el angulo de rotacion al angulo de cada pixel, y volver a coordenadas car-
tesianas de nuevo para representar. Este proceso, que conceptualmente es sencillo,
matematicamente tiene algunas complicaciones; por ello, no vamos a implementar
una transformacion de giro general. A cambio de esto vamos a utilizar directamente
algunas funciones de MATLAB que nos realizan algunos giros concretos.
36 PRACTICA 3. OPERADORES PUNTUALES

En este apartado, se probaran las funciones fliplr(), flipud(), el operador


trasponer (0 ) y la funcion rot90 con la variable matricial que representa a la imagen,
comprobandose finalmente los resultados obtenidos, mediante imshow().
La funcion fliplr() voltea la imagen en horizontal cambiando las columnas
de la parte derecha a la izquierda y viceversa.
La funcion flipud() realiza el volteo vertical.
El operador trasponer, cambia filas por columnas, lo que significa una rotacion
y un volteo.
Y finalmente, la funcion rot90() gira la imagen en angulo recto.
Todas esta funciones de MATLAB actuan sobre matrices bidimensionales, por lo
tanto, sera necesario crear nuevas funciones que apliquen las funciones anteriores a
cada uno de los planos NxM de la matriz tridimensional que representa a la imagen
RGB.

Ejercicios:
Asi pues se escribiran cuatro funciones con los siguiente formatos:
(a) matriz_salida = voltea_h(matriz_imagen);
(b) matriz_salida = voltea_v(matriz_imagen);
(c) matriz_salida = trasponer(matriz_imagen):
(d) matriz_salida = rotacion90(matriz_imagen);
Cada una de estas funciones solo necesitaran aplicar las funciones originales de
MATLAB a cada canal de la imagen.

3.4. Resultados de la practica


Al final de la practica se realizara una memoria breve y se guardara, junto con
los ficheros de MATLAB pedodos en el directorio vdfinal de la cuenta del alumno
en el servidor teleco.
Todos los ficheros *.m que se han solicitado seran probados mediante la siguien-
te funcion de test para comprobar su funcionamiento. Dicha funcion esta disponible
para su uso por parte de los alumnos, siendo aconsejable que sea comprobado el
funcionamiento de todas las funciones pedidas, de forma previa a la entrega del
material para su correccion.
El plazo para entregar esta memoria sera de dos semanas.
function error = puntuales(ficheroImagen)
% ---------------------------------------------------------------
% La entrada a esta funcion es un nombre de fichero de imagen con
% el formato nombrefich.ext.
%
% ESTE FICHERO NO SE DEBE MODIFICAR BAJO NINGUN CONCEPTO.
% SE DEBEN ADAPTAR LAS FUNCIONES PARA QUE FUNCIONEN CON ESTE
% FICHERO TAL Y COMO ESTA.
%----------------------------------------------------------------
3.4. RESULTADOS DE LA PRACTICA 37

matriz = imread(ficheroImagen);

% Rotacion
figure(11);
subplot(1,2,1);
imshow(matriz);
title(Original)

subplot(1,2,2);
imshow(rotacion90(matriz));
title(rotacion90)

figure(10);
subplot(1,2,1);
imshow(matriz);
title(Original)

subplot(1,2,2);
imshow(trasponer(matriz));
title(traspuesta)

figure(9);
subplot(1,2,1);
imshow(matriz);
title(Original)

subplot(1,2,2);
imshow(voltea_v(matriz));
title(voltea v => flipud)
figure(8);
subplot(1,2,1);
imshow(matriz);
title(Original)

subplot(1,2,2);
imshow(voltea_h(matriz));
title(voltea h => fliplr)

% Desplazamientos
figure(7);
subplot(2,2,1);
imshow(desplaza(matriz, 100, 100));
title(x=100, y=100)

subplot(2,2,2);
imshow(desplaza(matriz, -100, 100));
title(x=-100, y=100)

subplot(2,2,3);
imshow(desplaza(matriz, 100, -100));
title(x=100, y=-100)
38 PRACTICA 3. OPERADORES PUNTUALES

subplot(2,2,4);
imshow(desplaza(matriz, -100, -100));
title(x=-100, y=-100)

% Contraste
figure(6);
subplot(2,2,1);
imshow(matriz);
title(Original)

subplot(2,2,2);
imshow(contraste(matriz, 1, 192));
title(m=1, Ymed=192)

subplot(2,2,3);
imshow(contraste(matriz, 4, 128));
title(m=4, Ymed=128)

subplot(2,2,4);
imshow(contraste(matriz, 0.25, 128));
title(m=125, Ymed=128)

% Posterizacion
figure(5);
subplot(2,2,1);
imshow(matriz);
title(Original)

subplot(2,2,2);
imshow(posteriza(matriz, 64));
title(Posterizada 64)

subplot(2,2,3);
imshow(posteriza(matriz, 16));
title(Posterizada 16)

subplot(2,2,4);
imshow(posteriza(matriz, 2));
title(Posterizada 2)

% Conversion a niveles de gris


figure(3);
subplot(1,2,1);
imshow(matriz);
title(Original)

subplot(1,2,2);
imshow(gris(matriz));
title(gris)
Practica 4

Procesado digital de imagenes:


Operadores locales

4.1. Introduccion
Una vez conocidos los operadores puntuales dentro del procesamiento digital de
imagenes, en esta practica, nos vamos a centrar en una serie de operadores algo mas
complejos, que son los operadores locales. Mediante estos operadores, cada pxel
de la imagen de salida es funcion de varios pxeles, pero no todos, de la imagen
de entrada. Dentro de estos operadores podemos considerar la convolucion para la
aplicacion de filtros FIR.

4.2. Objetivo
El objetivo de esta practica es conocer y aplicar operaciones locales a alguna de
las imagenes obtenidas en la practica 1. Mediante esta practica, se tomara contacto
con diferentes algoritmos de filtrado digital de senales, y su aplicacion en el ambito
de las imagenes.

4.3. Conceptos teoricos previos


4.3.1. Diseno de filtros FIR digitales mediante la digitalizacion de
respuestas impulsionales analogicas
Existen muchos metodos de diseno de filtros digitales; unos calculan la respuesta
en frecuencia directamente de las caractersticas que se quiere que tenga el filtro,
y otros parten del diseno de filtros analogicos para posteriormente conseguir un
equivalente digital.
Dentro del segundo tipo de metodos, se trata de partir de la respuesta impulsional
de un filtro analogico, y discretizarla con una cierta frecuencia de muestreo. Con ello
se obtiene la respuesta al impulso de un filtro digital, con la frecuencia de corte digital
marcada por la frecuencia de corte analogica, y el valor del periodo de muestreo Ts
de la digitalizacion. La relacion entre estas tres variables viene dada por la expresion
vista en teora = Ts . Este es el metodo que utilizaremos en esta practica.
Partimos de la respuesta al impulso de un filtro paso bajo ideal analogico con
ganancia A y frecuencia de corte analogica fca .
Su respuesta en frecuencia sera la siguiente

39
40 PRACTICA 4. OPERADORES LOCALES

Y f
H() = A
2fca
Y su respuesta al impulso la podremos calcular a partir de la Transformada De
Fourier Inversa, que es el conocido sinc

h(t) = A 2fca sinc(2fca t)


Para pasar esta respuesta impulsional de analogico a digital, lo mas sencillo es
considerar que el periodo de muestreo es Ts = 1 con lo que tendramos = y las
frecuencias de corte analogicas y digitales coincidiran. De este modo conseguiramos
filtrar digitalmente una secuencia con la respuesta en frecuencia siguiente
Y fd
j
H(e ) = A
2fcd
convolucionando la secuencia de entrada con la respuesta impulsional.

h[n] = A 2fcd sinc(2fcd n)


La respuesta impulsional h[n] anterior, como sabemos, tiene una duracion infini-
ta, y ademas no es causal. Al tener una duracion infinita, el numero de operaciones
hace que sea imposible la convolucion. Una forma posible de conseguir una respuesta
impulsional finita es recortar esta respuesta al impulso, quedandonos con la parte
central. Esto se muestra graficamente en la figura 4.1. Cuanto mas larga sea la ven-
tana que se aplique, mas se parecera la respuesta impulsional real a la ideal, y por
tanto, mas se acercara la respuesta del filtro digital a la respuesta ideal.

Figura 4.1: Mediante el enventanado rectangular limitamos la duracion de la res-


puesta al impulso.

El hecho de que la respuesta impulsional recortada no sea causal se puede solu-


cionar simplemente retardandola, de manera que la primera muestra no nula, sea la
de ndice n = 0. Esto unicamente producira, como plantean las propiedades de los
sistemas lineales e invariantes, un retardo a la salida
De esta manera conseguimos una respuesta al impulso que no es la verdadera
pero que se puede aproximar mucho a ella, todo lo que queramos, haciendola mas
larga. La utilizacion de la ventana rectangular (llamada as por su forma constante
en el intervalo central, y nulo en el resto) elimina las oscilaciones del espectro en los
extremos del sinc, produciendo un efecto llamado Efecto Gibbs que se observa en
la figura 4.2.
Para minimizar este Efecto Gibbs diversos autores han probado diferentes
formas de enventanado que ofrecen diferentes caractersticas de filtrado. Algunas de
estas formas de ventana tienen los nombres de Ventana Triangular, Ventana de
4.3. CONCEPTOS TEORICOS PREVIOS 41

Figura 4.2: El Efecto Gibbs es evidente en filtrados paso bajo implementados con
enventanados rectangulares.

Hamming, Ventana de Hanning y pueden verse en la bibliografa aconsejada en


la teora. Un ejemplo de enventanado Hamming puede verse en la figura 4.3

Figura 4.3: El enventanado Hamming suaviza la terminacion de la ventana y mini-


miza el efecto Gibbs.

Las respuestas al impulso finitas h[n] a partir de las respuestas impulsionales


infinitas se obtendran mediante el producto muestra a muestra de dicha respuesta
al impulso infinita h[n] con la ventana correspondiente W[n].

hi[n] = h[n] W [n]


En el filtrado por convolucion de senales unidimensionales, la amplitud de la
respuesta al impulso afecta a la amplitud de la senal de salida filtrada. Esto en
imagenes supone un incremento en la luminosidad de la imagen, que se puede evitar
haciendo que la respuesta impulsional del filtro cumpla la expresion

X
h[n] = 1
n=

4.3.2. Aplicacion de la propiedad de separabilidad de la Transfor-


mada de Fourier Bidimensional
La propiedad de separabilidad de la Transformada de Fourier Multidimensional
indica que si una senal multidimensional se separable, es decir que si

f (x1 , x2 , . . . , xn ) = f1 (x1 ) f2 (x2 ) . . . fn (xn )


42 PRACTICA 4. OPERADORES LOCALES

su transformada de Fourier tambien lo es, lo que significa que

F (ej1 , ej2 , . . . , ejn ) = F1 (ej1 ) F2 (ej2 ) . . . Fn (ejn )


En el caso bidimensional, consideramos el filtro 2D con la respuesta en frecuencia
con forma rectangular de la figura 4.4, En este caso, la respuesta en frecuencia pode-
mos considerarla como una funcion separable, por lo tanto, la respuesta impulsional
del filtro tambien lo sera como puede verse en la figura 4.5.

Figura 4.4: Respuesta en frecuencia de un filtro paso bajo abrupto bidimensional


con forma rectangular.

Figura 4.5: La respuesta al impulso del filtro de la figura 4.4 es separable.

As pues si queremos filtrar una imagen mediante un filtro paso bajo bidimensio-
nal rectangular con frecuencias de corte conocidas seguiremos el siguiente proceso:
Primero calculamos, aplicando la propiedad de separabilidad de la Transfor-
mada de Fourier la respuesta impulsional de cada filtro digital unidimensional
en las direcciones x e y.
Despues tomamos las respuestas al impulso para cada direccion, y las multi-
plicamos entre s resultando una respuesta al impulso matricial como esta.


hx [1] hy [1] hx [2] hy [1] ... hx [n] hy [1]
hx [1] hy [2] hx [2] hy [2] ... hx [n] hy [2]

h[n1 , n2 ] = .. .. .. ..
. . . .
hx [1] hy [m] hx [2] hy [m] . . . hx [n] hy [m]
Si hx [n] y hy [n] son vectores columna, como suele ser habitual, esta matriz se
conseguira mediante el producto matricial siguiente.

h[n1 , n2 ] = hx [n] hy [m]T


4.4. DESPLAZAMIENTO EN FRECUENCIA 43

Finalmente, realizaremos la convolucion entre la imagen y la repuesta impul-


sional 2D

En cuanto al tamano de la senal de salida filtrada, para cada una de las dimen-
siones se cumple la relacion

Lf iltrada = Loriginal + T amh[n] 1


donde Lf iltrada es el tamano de la secuencia final, Loriginal es el tamano de la
secuencia a filtrar y T am es el tamano de la respuesta al impulso.
Este aumento en el tamano se produce por la operacion de convolucion en los
extremos de la secuencia original. Esta caracterstica se muestra, en el filtrado de
imagenes por convolucion, a traves de un contorno en la imagen de salida; contorno
que, si se desea, se puede eliminar, quedandonos exclusivamente con la parte central
de la salida.

4.4. Aplicacion de la propiedad de desplazamiento en


frecuencia de la Transformada de Fourier
En ocasiones estamos interesados en disenar un filtro distinto del paso bajo; ya
sea paso banda, paso alto (4.6), etc. Existen formas directas de implementar este
tipo de filtros, pero una posibilidad es, una vez obtenida la respuesta frecuencial de
un filtro paso bajo, desplazarla en frecuencia la cantidad deseada f0 (ver figura 4.7.
Esto, en virtud de la propiedad de desplazamiento en frecuencia de la Trasformada de
Fourier, significa multiplicar la respuesta impulsional por una exponencial compleja.

hpa [n] = hpb [n] ej0 n

Figura 4.6: El filtrado paso alto realza los contornos de os objetos.

Este metodo para pasar de un filtro paso bajo a uno paso alto es muy comodo,
ya que ej = 1 y as

ejn = (1)n
lo que implica, simplemente, cambiar de signo las muestras impares de la res-
puesta impulsional.
44 PRACTICA 4. OPERADORES LOCALES

Figura 4.7: Implementacion de filtrados paso alto a partir de la propiedad de des-


plazamiento en frecuencia.

Al implementar un filtro paso alto a partir de un filtro paso bajo hemos de tener
en cuenta lo que pasa con la frecuencia de corte al desplazar el espectro en 0,5. Esto
queda patente en la figura 4.7.
La frecuencia de corte del filtro paso alto fca resultante de este desplazamiento
no tiene el valor fcb , sino que cumple la expresion fca = 0, 5 fcb . Esta expresion
debe tenerse en cuenta para el diseno del filtro paso bajo inicial.
La implementacion de un filtro paso banda o banda eliminada puede tambien
hacerse de forma directa o mediante combinaciones de filtros paso bajo y paso alto
del orden deseado.

4.5. Desarrollo de la practica


Al igual que en la practica anterior, las funciones que se realicen durante este
desarrollo, seran probadas mediante otra funcion test hecha en MATLAB que las
ira ejecutando, y mostrara sus resultados automaticamente. Al final de esta practica
se puede encontrar el listado de esta funcion de prueba. Como en la vez anterior,
se recuerda la necesidad de respetar al maximo los formatos de las funciones que se
proponen en cada caso. Ademas, algunas de las funciones pedidas en esta practica
se reutilizaran en practicas posteriores, haciendo mas necesario todava este respeto
a los formatos.
Deben disenarse las funciones con independencia del tamano de la imagen de en-
trada, y en aquellos casos en los que sea necesario conocer el tamano, se obtendra este
mediante la funcion size()

4.5.1. Implementacion de un filtro FIR paso bajo con enventanado


rectangular
Comenzamos la parte practica de esta sesion implementando un filtro paso bajo
bidimensional para aplicarlo a nuestras imagenes. Para ello utilizaremos el metodo
de ventanas con una ventana rectangular. Esto va a implicar varios pasos que a
continuacion se recuerdan:

Para cada direccion, x e y, podemos tener diferentes frecuencias de corte, lo


que significa que deberemos calcular las respuestas al impulso de los filtros
vertical y horizontal a partir de las frecuencias de corte deseadas.
Para que las respuestas al impulso que utilicemos en la convolucion sean finitas
y causales, deberemos tener en cuenta dos cosas: en primer lugar, recortar
4.5. DESARROLLO DE LA PRACTICA 45

dichas respuestas impulsionales, haciendolas del tamano deseado, que puede


ser distinto para cada dimension; y en segundo lugar, debemos conseguir que
la primera muestra no nula sea h[n=0] lo que implica un retardo.
Finalmente, compondremos la matriz respuesta impulsional bidimensional me-
diante el producto de los vectores respuesta al impulso unidimensionales y
calcularemos la convolucion.
El formato de la funcion de MATLAB que se disenara sera el siguiente:
matriz_filtrada = fpb_rect(matriz_imagen, fcx, fcy, tamx, tamy)
donde matriz_imagen es la matriz que representa la imagen de entrada, y la
matriz matriz_filtrada es el resultado del filtrado, fcx y fcy son las frecuencias de
corte digitales que se aplicaran y tamx y tamylos tamanos horizontal y vertical de
la ventana que limita en el tiempo la matriz respuesta impulsional.
Para simplificar un poco el trabajo, las tareas que debe hacer esta funcion son
las siguientes:
(a) Calcular la respuesta impulsional unidimensional del filtrado en la direccion x.
(b) Para evitar cambios en el brillo de la imagen despues de ser filtrada se norma-
lizara la respuesta impulsional mediante la operacion en MATLAB
h[n]
h[n] = PT amx
n=0 (h[n])
Con ello estamos haciendo que la suma de todas las muestras de h[n] tenga el
valor 1, y as que la convolucion no vare la luminosidad de la imagen
(c) Repetir los pasos 1 y 2 para la direccion y.
(d) Multiplicar las respuestas al impulso unidimensionales para obtener la matriz
respuesta al impulso bidimensional buscada.
(e) Realizar la convolucion 2D (MATLAB: conv2()), para cada uno de los planos
R, G y B de la imagen.

4.5.2. Aplicacion de diversos enventanados para la implementacion


del filtro paso bajo anterior
Un inconveniente de la utilizacion de la ventana rectangular con imagenes es que
el Efecto Gibbs es bastante evidente y disminuye considerablemente la calidad de fi-
nal de la imagen filtrada. Para minimizar este Efecto Gibbs diversos autores han pro-
bado con otras formas de enventanado que ofrecen diferentes caractersticas de filtra-
do. Nosotros aqu vamos a probar las ventanas Triangular, (MATLAB: triang())
Hamming(MATLAB: hamming()), y Hanning(MATLAB: hanning()). Sus ca-
ractersticas teoricas pueden verse en la bibliografa recomendada en teora.
As, en este apartado se modificara la funcion fpb_rect() escrita con anterio-
ridad para aplicar en cada caso una ventana diferente de las tres anteriores. Las
funciones a desarrollar tendran los formatos siguientes:
matriz_filtrada = fpb_tria(matriz_imagen, fcx, fcy, tamx, tamy);
matriz_filtrada = fpb_hamm(matriz_imagen, fcx, fcy, tamx, tamy);
matriz_filtrada = fpb_hann(matriz_imagen, fcx, fcy, tamx, tamy);
46 PRACTICA 4. OPERADORES LOCALES

Cuestion:
(a) Buscar el valor mnimo de frecuencia de corte de un filtro paso bajo que,
aplicado simultaneamente en horizontal y en vertical, hace perder la calidad
de la imagen de manera evidente.

4.5.3. Implementacion de un filtro paso alto mediante desplaza-


miento en la frecuencia de la respuesta al impulso
En este apartado, se escribira una funcion de MATLAB que realice el filtrado pa-
so alto de una imagen con una determinada frecuencia de corte. Para ello, en primer
lugar, se modificara de nuevo la funcion fpb_rect() de manera que aqu unicamente
se tiene que anadir el desplazamiento en frecuencia de dichas respuestas al impulso.
La funcion a implementar tendra el formato siguiente:

matriz_filtrada = fpa_rect(matriz_imagen, fcx, fcy, tamx, tamy);

A continuacion se implementara el mismo filtro paso alto, pero en este caso utilizan-
do para ello el enventanado triangular. As mismo, se implementara tambien otra
funcion con el formato:

matriz_filtrada = fpa_tria(matriz_imagen, fcx, fcy, tamx, tamy);

Cuestiones:
(a) Comparar los resultados obtenidos con una misma imagen de entrada, con
las funciones fpa_rect() y fpa_tria() utilizando las frecuenicas de corte
fcd = 0, 01, fcd = 0, 015 y fcd = 0, 025 y con tamanos de respuesta al impulso
de T amx = T amy = 41. Indicar si se detecta algun resultado extrano en
alguno de los casos.

(b) Buscar el valor mnimo de frecuencia de corte de un filtro paso alto que, apli-
cado simultaneamente en horizontal y en vertical, hace perder la calidad de
la imagen de manera evidente y comparar este valor con el obtenido en las
cuesiones del apartado 4.5.2. Puede sacarse alguna conclusion de este hecho.

4.6. Resultados de la practica


Al final de la practica se realizara una memoria breve comentando los resultados
obtenidos en cada caso, y se guardara, junto con los ficheros de MATLAB en el
directorio vdfinalde la cuenta del alumno en el servidor teleco.uclm.es
Com en practicas anteriores, se aconseja probar los algoritmos implementados
mediante la funcion de test que se ofrece antes de entregarlos para su correccion. La
funcion de test que se utilizara para la correcion sera la siguiente.

function locales(n_fichero)

matriz = imread(n_fichero);

% Filtro paso alto con diferentes anchos de banda x e y


4.6. RESULTADOS DE LA PRACTICA 47

figure(15);
imshow(fpa_tria(matriz, .015, 0, 41, 41));
title(Filtro Paso Alto: fcx=0,02, fcy=0, Tamx=Tamy=41)

figure(14);
imshow(fpa_tria(matriz, 0, .015, 41, 41));
title(Filtro Paso Alto: fcx=0, fcy=0.02, Tamx=Tamy=41)

% Filtro paso alto con iguales anchos de banda x e y

figure(13);
imshow(fpa_rect(matriz, .05, .05, 41, 41));
title(Filtro Paso Alto: fcx=fcy=0.05, Tamx=Tamy=41)

figure(12);
imshow(fpa_rect(matriz, .025, .025, 41, 41));
title(Filtro Paso Alto: fcx=fcy=0.025, Tamx=Tamy=41)

figure(11);
imshow(fpa_rect(matriz, .015, .015, 41, 41));
title(Filtro Paso Alto: fcx=fcy=0.015, Tamx=Tamy=41)

figure(10);
imshow(fpa_rect(matriz, .01, .01, 41, 41));
title(Filtro Paso Alto: fcx=fcy=0.01, Tamx=Tamy=41)

% Filtro paso bajo con ventana de Hanning

figure(9);
imshow(fpb_hann(matriz, .1, .1, 41, 41));
title(Hanning: fcx=fcy=0.1, Tamx=Tamy=41)

% Filtro paso bajo con ventana de Hamming

figure(8);
imshow(fpb_hamm(matriz, .1, .1, 41, 41));
title(Hamming: fcx=fcy=0.1, Tamx=Tamy=41)

% Filtro paso bajo con ventana triangular

figure(7);
imshow(fpb_tria(matriz, .1, .1, 41, 41));
title(Triangular: fcx=fcy=0.1, Tamx=Tamy=41)

% Filtro paso bajo con ventana rectangular

figure(6);
imshow(fpb_rect(matriz, .1, .1, 41, 41));
title(Rectangular: fcx=fcy=0.1, Tamx=Tamy=41)

% Filtro paso bajo con ventana rectangular diferentes anchos de banda


48 PRACTICA 4. OPERADORES LOCALES

figure(5);
imshow(fpb_rect(matriz, .1, .001, 41, 41));
title(Rectangular: fcx=0.1, fcy=0.001, Tamx=41, Tamy=41)

figure(4);
imshow(fpb_rect(matriz, .001, .1, 41, 41));
title(Rectangular: fcx=0.001, fcy=0.1, Tamx=41, Tamy=41)

%con longitud de 141 muestras tarda MAS de 15 min.


%t0 = clock;
%figure(3);
%imshow(fpb_rect(matriz, .01, .01, 141, 141));
%title(Rectangular: fcx=fcy=0.01, Tamx=Tamy=141)
%T141 = etime(clock,t0)

t0 = clock;
figure(2);
imshow(fpb_rect(matriz, .01, .01, 41, 41));
title(Rectangular: fcx=fcy=0.01, Tamx=Tamy=41)
T41 = etime(clock,t0)

figure(1);
imshow(matriz);
title(Original)
Practica 5

Procesado digital de imagenes:


Operadores globales

5.1. Introduccion
La utilizacion de la convolucion para tareas de filtrado es una solucion teorica-
mente correcta, pero en la practica la cantidad de calculos necesarios con respuestas
impulsionales relativamente largas, hacen que este tipo de filtrado sea costoso en
tiempo de proceso. Para acelerar en lo posible el proceso de filtrado, se recurre a
dominios transformados en los que la cantidad de calculos a realizar disminuye, y
con ello el tiempo de procesamiento.
En el caso de las imagenes se recurre al dominio de la frecuencia. Este trabajo
en el dominio de la frecuencia implica el calculo de la Transformada de Fourier Bi-
dimensional de la imagen que queramos procesar. Dicha Transformada de Fourier es
una funcion continua, que necesita ser discretizada para poder utilizarla en el orde-
nador. De esta manera, se hace necesario el desarrollo de la Transformada Discreta
de Fourier (DFT - Discrete Fourier Transform).
Para el calculo de la DFT de secuencias, se han desarrollado algoritmos de calculo
rapido que forman un conjunto al que se llama globalmente Transformada Rapida de
Fourier (FFT - Fast Fourier Transform). La utilizacion de la FFT con secuencias de
duracion infinita tiene algunas complicaciones, puesto que para calcular la FFT de
una secuencia debemos conocer toda ella, o en su caso trocearla, y trabajar con los
trozos independientemente. Estas complicaciones no vienen al caso en esta practica,
ya que nosotros vamos a tratar con imagenes de tamano finito, de las que conocemos
todos sus pxeles.
Como la FFT son algoritmos en los que el calculo de cada coeficiente de la
transformada se hace a partir de toda la informacion a transformar, su uso esta den-
tro de lo que llamamos operadores globales en el ambito del tratamiento digital de
imagenes.

5.2. Objetivos
Los objetivos de esta practica son, por un lado, analizar la informacion que
contiene la FFT de una imagen, y por otro aplicar esta transformada como operador
global a alguna de las imagenes obtenidas en la practica 1. En esta practica, tambien
se trataran diferentes procesos de filtrado digital de imagenes.

49
50 PRACTICA 5. OPERADORES GLOBALES

5.3. Desarrollo
Esta practica, esta dividida en dos partes. En la primera no habra que desa-
rrollar ningun algoritmo, sino que se tratara exclusivamente de visualizar diferentes
informaciones, y sacar conclusiones a partir de ellas. En la segunda parte, habra que
desarrollar alguna funcion de MATLAB para filtrar imagenes en el dominio de la fre-
cuencia. Para esta segunda parte, como ya estamos acostumbrados, se dispondra de
una funcion de test para comprobar que todas las funciones estan hechas de acuerdo
con los formatos pedidos. El listado de esta funcion de test aparece en el anexo de
este enunciado. Ademas, alguna de las funciones pedidas se podran reutilizar en la
siguiente practica sobre diezmado e interpolacion.
De nuevo se insiste en la necesidad de disenar las funciones con independencia
del tamano de la imagen de entrada, y en aquellos casos en los que sea necesario
conocer el tamano para procesar, este se obtendra mediante la funcion "size()".

5.3.1. Visualizacion de la informacion contenida en la FFT


En este apartado, se va a analizar la informacion contenida en la Transformada
de Fourier de una imagen. Este analisis se realizara a partir de la funcion cont_fft()
que se ofrece desarrollada a continuacion.

function cont_fft(n_fichero)

matriz = imread(n_fichero);
tam = size(matriz);
mat_fft=fft2(matriz);

figure(5);
elimina_modulo = mat_fft ./ abs(mat_fft);
imagen = ifft2(elimina_modulo);
imagen_normalizada = imagen / max(max(max(imagen)));
imagen_positiva = max(0, real(imagen_normalizada));
imagen_final = contraste(imagen_positiva*255, 0, 5, 0, 255);
imshow(real(imagen_final));
title(Imagen obtenida de la fase de la FFT: CONTRASTE REALZADO);

figure(4);
imagen = ifft2(abs(mat_fft));
imshow(uint8(real(imagen)));
title(Imagen obtenida a partir del modulo de la FFT);

figure(3);
imagen = ifft2(imag(mat_fft));
imshow(uint8(real(imagen)));
title(Imagen obtenida a partir de la parte imaginaria de la FFT);

figure(2);
imagen = ifft2(real(mat_fft));
imshow(uint8(real(imagen)));
title(Imagen obtenida a partir de la parte real de la FFT);
5.3. DESARROLLO 51

figure(1);
x=linspace(0,1,tam(2));
y=linspace(0,1,tam(1));
mesh(x, y, log10(abs(mean(mat_fft, 3))));
title(Visualizacion del log10 del modulo de la FFT2 de la imagen);

A esta funcion se le debe pasar como parametro el nombre de un fichero de


imagen, y de esta imagen se muestra la siguiente informacion:

En la figura 1 se visualiza el modulo en unidades logartmicas de la Transfor-


mada de Fourier de la imagen.

En la figura 2 aparece la informacion de una imagen contenida en la parte real


de su FFT. Dicho de otra manera, se representa el resultado de realizar la FFT
inversa a la parte real del espectro asociado a la imagen

En la figura 3 aparece la informacion contenida en la parte imaginaria de la


FFT.

En la figura 4 se muestra el resultado de eliminar la informacion de fase de la


FFT conservando exclusivamente la informacion de modulo.

Por ultimo, en la figura 5 se muestra el resultado de eliminar la informacion


del modulo de la FFT de la imagen, quedandonos exclusivamente con la infor-
macion de la fase. En esta visualizacion se ha tenido que aumentar el contraste
para hacer visibles todos los detalles contenidos en el resultado.

Ejercicios:

(a) En la memoria final se debe explicar de forma general el funcionamiento de la


funcion cont_fft().

(b) Comenta el resultado contenido en la figura 1: Indica en que margenes de


frecuencia se encuentra la mayor cantidad de informacion de una imagen.

(c) Observa la figura 2, y trata de explicar el resultado obtenido. Para ello se debe
tener en cuenta las propiedades de simetra de la Transformada de Fourier, y
que
1
Re X(ej ) = X(ej ) + X (ej )
2

(d) Observa la figura 5, e indica que informacion esta contenida sobre todo en la
fase de una imagen. Se debe tener presente que errores en la fase impleicaran
errores en dicha informacion.

(e) A la vista de las figuras 2, 3, 4 y 5, indica si para recuperar una imagen


correctamente es suficiente con su informacion de modulo. Es suficiente con
la informacion de fase?, y con la parte real?, y con la imaginaria?
52 PRACTICA 5. OPERADORES GLOBALES

5.3.2. Filtrados en la frecuencia: Eliminacion de componentes fre-


cuenciales
En los siguientes apartados de esta practica se implementaran y se probaran algu-
nos algoritmos para comprobar los efectos que produce el filtrado de imagenes en el
dominio de la frecuencia. Concretamente seran tres algoritmos, cuyas caractersticas
se analizan en los siguientes parrafos.
La primera opcion que se nos puede ocurrir para filtrar una senal en el dominio
de la frecuencia, es obtener su Transformada de Fourier, y eliminar aquellas compo-
nentes frecuenciales que no nos interesen. Esta va a ser la idea del primer algoritmo
a desarrollar con MATLAB.

Ejercicio:

(a) Se implementara una funcion que ponga a cero aquellas componentes de la


Transformada Discreta de Fourier bidimensional que esten fuera de la banda
de paso. El formato de la funcion sera este:

matriz_filtrada = fpb_fft_abr(matriz_entrada, fcx, fcy);

5.3.3. Filtrados en la frecuencia: Eliminacion de componentes sua-


vizada
Con la solucion anterior estamos tratando de implementar un filtro no causal
que sera el que proporcionara un filtrado abrupto ideal. Como puede comprobarse,
el resultado no es el deseado, produciendose una cierta distorsion en la fase, lo que
genera una serie de contornos repetidos. Para evitar estos efectos, podemos tratar de
realizar un filtrado del mismo tipo pero menos abrupto, haciendo que la respuesta
en frecuencia caiga con una pendiente finita, a ambos lados de la frecuencia de corte.
En la siguiente figura se trata de representar esta idea para el caso unidimensional.
Esta segunda opcion se ofrece implementada debido a su complejidad. En este
caso, solo se necesitara comprobar el funcionamiento de esta idea. Su formato es
este:

matriz_filtrada = fpb_fft_sua(matriz_entrada, fcx, fcy, tranx, trany);

donde los valores de las transiciones entre la banda de paso y la atenuada en cada
direccion tranx y trany estan dados en tanto por uno del margen frecuencial res-
pectivamente en horizontal y vertical. Estas transiciones estan colocadas de manera
que la frecuencia de corte del filtro caiga en el centro de la zona de transicion, por lo
tanto el valor maximo de las transiciones debe ser menor que dos veces la frecuencia
de corte utilizada. El listado de esta funcion se ofrece en un fichero aparte.

Ejercicio:

(a) Comentar en la memoria final los resultados obtenidos al aplicar esta funcion
con diferentes frecuencias de corte y diferentes tamanos de transicion.
5.4. RESULTADOS DE LA PRACTICA 53

5.3.4. Filtrados en la frecuencia: Filtrado a partir de la respuesta


en frecuencia de un filtro
Una vez hechas las pruebas anteriores, debemos entrar en la realizacion de un
filtrado mas parecido a la realidad, es decir, calcular una respuesta en frecuencia a
partir de la FFT de la respuesta al impulso, y multiplicarla miembro a miembro por
la Transformada de Fourier de la imagen.
En este apartado, se implementara una funcion en MATLAB con el siguiente
formato:

matriz_filtrada = fpb_fft_tria(matriz_entrada, fcx, fcy, tamx, tamy);

Esta funcion realizara las operaciones que se indican a continuacion.

(a) En primer lugar calculara la respuesta al impulso h[n1,n2] con frecuencias de


corte fcx y fcy y tamanos tamx y tamy en cada una de las direcciones. Para ello
se utilizara un enventanado triangular, por lo tanto es aconsejable utilizar como
punto de partida la funcion fpb_tria() desarrollada en la practica anterior.

(b) Seguidamente, se calculara la Transformada de Fourier bidimensional de la


imagen, y la Transformada de Fourier Bidimensional de la respuesta impulsio-
nal. Esta ultima debe tener el mismo tamano de la imagen para posteriormente
poder realizar el producto elemento a elemento de ambas (ver la informacion
sobre la funcion fft2() en la ayuda de MATLAB).

(c) Finalmente hemos de compensar el retardo producido por la forma de uso de la


respuesta impulsional. Como al hacer la FFT de la respuesta al impulso, esta
estaba retardada con el fin de hacer causal el sistema, este retardo aparecera a
la salida como distorsion de desplazamiento. Esta distorsion habra que com-
pensarla para ofrecer como resultado la imagen sin desplazamientos. Para esta
correccion del retardo, puede utilizarse la funcion de MATLAB circshift().

5.4. Resultados de la practica


Al final de la practica se realizara una memoria breve comentando los resultados
obtenidos para distintos parametros, y se guardara, junto con los ficheros realiza-
dos en MATLAB en el directorio vdfinalde la cuenta del alumno en el servidor
teleco.uclm.es.
La duracion prevista para esta practica es de dos semanas.
Como en practicas anteriores, en la correccion de las practicas se utilizara una
funcion de test para comprobar el correcto funcionamiento de las funciones pedidas.
Para ello se utilizara la funcion que se expone a continuacion. Una vez mas, se
recomienda que se compruebe el funcionamiento de los algoritmos disenados antes
de su entrega para corregir

function globales(n_fichero)

matriz = imread(n_fichero);

figure(5);
imshow(fpb_fft_tria(matriz, .1, .1, 11, 11));
title(Filtrado en frecuencia: enventanado triangular tama~
no 11.);
54 PRACTICA 5. OPERADORES GLOBALES

figure(4);
imshow(fpb_fft_tria(matriz, .1, .1, 41, 41));
title(Filtrado en frecuencia: enventanado triangular tama~
no 41.);

figure(3);
imshow(fpb_fft_tria(matriz, .1, .1, 141, 141));
title(Filtrado en frecuencia: enventanado triangular tama~
no 141.);

figure(1);
imshow(fpb_fft_abr(matriz, .1, .1));
title(Filtrado en la frecuencia con corte abrupto.);
Practica 6

Procesado digital de imagenes:


Diezmado e interpolacion

6.1. Introduccion
En las dos practicas anteriores se ha analizado la problematica existente en el
filtrado de imagenes, y en esta trabajaremos con algunos de los filtros disenados
hasta aqu aplicandolos a los procesos de diezmado e interpolacion.
El diezmado trata de reducir la frecuencia de muestreo asociada a una secuencia
de muestras, dividiendola por un factor entero. Para entender mejor este proceso, lo
mejor es verlo a traves de un ejemplo. Si queremos reducir la frecuencia de mues-
treo fs por un factor entero M , lo que tendremos que hacer es eliminar de nuestra
secuencia M 1 de cada M muestras. Con ello conseguiremos otra secuencia, que
representara a la misma senal analogica que la anterior, pero como si la hubiesemos
muestreado a una frecuencia
fs
fs0 =
M
En el proceso de diezmado, de la misma manera que en el proceso de muestreo,
hemos de evitar que en la secuencia obtenida aparezca el efecto del solapamiento
espectral. Es decir, hemos de tener cuidado que fs0 2 B, donde B es el ancho de
banda de la senal analogica. En el caso que esto no sea cierto, tendremos que aplicar
a la entrada del diezmador un filtro paso bajo digital.
La interpolacion es el proceso contrario del diezmado en el sentido que, lo que
tratamos es de aumentar la frecuencia de muestreo por un valor entero, obteniendo
a la salida un numero de muestras L veces mayor que en la entrada; donde L es
el factor de interpolacion. Si lo queremos ver a traves de un ejemplo, lo que tenemos
que hacer es insertar L1 muestras entre cada dos de la secuencia original. Con ello,
estamos obteniendo una nueva secuencia que representa a la misma senal analogica
pero como si la hubieramos tomado con una frecuencia de muestreo fs0 = L fs .
Al tener una frecuencia de muestreo mayor a la salida de interpolador, podemos
asegurar que en el proceso de interpolacion nunca se produce solapamiento espectral.
El proceso de interpolacion se divide conceptualmente en dos partes: una primera
en la que se introducen L 1 muestras de valor cero entre cada dos muestras de
entrada, y una segunda parte que es un filtrado paso bajo con frecuencia de corte
1
fcd =
2L
y ganancia en amplitud G = L.

55
56 PRACTICA 6. DIEZMADO E INTERPOLACION

6.2. Objetivos
Esta practica tiene dos objetivos. El primero es reconocer, mediante visualizacion
en el dominio espacial, la existencia de solapamiento espectral despues de realizar un
proceso de diezmado sobre una imagen. En segundo lugar se aplicara la tecnica de
interpolacion a la implementacion de un zoom digital sencillo aplicable a imagenes.

6.3. Desarrollo
En esta practica se implementaran en Matlab los algoritmos de diezmado e in-
tepolacion y se reutilizaran las funciones de filtrado implementadas en las practicas
anteriores. Como siempre, se dispondra de una funcion de test para comprobar que
todas estan hechas de acuerdo con los formatos pedidos. El listado de esta funcion
de test aparece en el apartado final de esta practica.
Asimismo, se recuerda la necesidad de disenar las funciones con independencia
del tamano de la imagen de entrada, y en aquellos casos en los que sea necesario
conocer el tamano de dicha imagen para procesarla, este se obtendra mediante la
funcion size().

6.3.1. Diezmado de imagenes


La funcion a implementar en este apartado realizara un diezmado por M , consi-
deradolo como exclusivamente la eliminacion de las M 1 muestras de cada M . El
formato de la funcion sera el siguiente:
matriz_salida = diezma(matriz_entrada, M);
donde M es el factor de diezmado.
Como es de esperar el tamano en pxeles de la imagen de salida sera M veces
menor, por tanto esta imagen aparecera mas pequena en la pantalla. Esto es porque
Matlab dedica el mismo tamano de pxel a la imagen de entrada que a la de salida.
En la realidad, el diezmado debe llevar consigo un cambio en el periodo de muestreo
y por tanto en la recuperacion, siendo el periodo de recuperacion a la salida Ts0 =
Ts M . Esto, en sonido implicara una separacion temporal de las muestras, y en
imagen supondra que cada pixel tenga un tamano M veces mayor. De esta manera,
el tamano de la imagen no variara debido al proceso de diezmado.
Como puede comprobarse, el filtrado previo al diezmado se ha considerado in-
dependiente, de forma que podremos aplicarlo o no a nuestra conveniencia. Concre-
tamente, en este apartado se pretende comparar los resultados del caso en el que
aplicamos filtro antisolapamiento y del caso en el que no.

Ejercicio:

(a) Comparar el resultado de diezmar por 10 una imagen de las obtenidas en la


practica 1 directamente con la funcion diezma(), y el resultado de el mis-
mo diezmado, pero habiendo aplicado previamente el filtro antisolapamiento
correspondiente. Para realizar el filtrado, lo propio es utilizar alguna de las fun-
ciones de filtrado desarroladas en las dos practicas anteriores. Las conclusiones
que se obtengan de esta comparacion se incluiran en la memoria.
6.4. INTERPOLACION 57

6.4. Implementacion de un zoom digital aplicando in-


terpolacion
En este apartado se implementara un zoom digital basado en un interpolador.
El interpolador, como sabemos se compone de dos bloques funcionales diferentes.

El primer bloque se dedica a insertar L 1 muestras de valor 000 entre cada


dos muestras de entrada. Esto, aplicado a una imagen implica insertar L 1
ceros en la direccion horizontal y L 1 ceros en la vertical.

El segundo bloque es un filtro paso bajo que para imagenes sera bidimensional
y que tendra como frecuencias de corte
1
fcx = fcy =
2L
y como ganancia en amplitud, recordando que estamos interpolando en las dos
direcciones, tendremos G = L2 .

La funcion de MATLAB a implementar tendra el formato siguiente


matriz_salida = zoom(matriz_entrada, L);
donde L es el factor de interpolacion.
Esta funcion debera ampliar la parte central de la imagen, de tamano (Xmax /L)
(Ymax /L) eliminando todo lo demas. En esta expresion, Xmax correspondera al
tamano horizontal de la imagen, e Ymax correspondera al tamano vertical de la
imagen. Al interpolar la porcion de imagen descrita, el tamano de la imagen final
sera el mismo que el de la imagen original pero ampliando la region elegida.
El filtrado paso bajo se puede realizar mediante cualquiera de las funciones de
filtrado vistas en las dos practicas anteriores, aunque es aconsejable probar con uno
de los enventanados no rectangulares para obtener una mayor calidad. Por otra parte
la colocacion de la multiplicacion por el factor de ganancia tambien debe cuidarse
para que no se produzca ningun efecto de redondeo de la etapa de filtrado.

6.5. Resultados de la practica


Al final de la practica se realizara una memoria breve comentando los resultados
obtenidos en cada apartado, y se guardara, junto con los ficheros de MATLAB en
el directorio vdfinalde la cuenta del alumno en el servidor teleco.uclm.es.
La duracion prevista para esta practica es de 1 semana.
A continuacion se muestra la funcion de test que se utilizara para comprobar el
correcto funcionamiento de los algoritmos. Es aconsejable que dicho funcionamiento
sea comprobado previamente a la entrega del material para su correccion.

function interpola(n_fichero)

matriz = imread(n_fichero);
tam = size(matriz);

figure(6)
imshow(zoom(matriz, 8));
title(Imagen ampliada por 8.);
58 PRACTICA 6. DIEZMADO E INTERPOLACION

figure(5)
imshow(zoom(matriz, 5));
title(Imagen ampliada por 5.);

figure(4)
imshow(zoom(matriz, 4));
title(Imagen ampliada por 4.);

figure(3)
imshow(zoom(matriz, 2));
title(Imagen ampliada por 2.);

figure(2);
filtrada = fpb_tria(matriz, .05, .05, 41, 41);
recorte = filtrada(21:20+tam(1), 21:20+tam(2), :);

subplot(1,2,1);
imshow(diezma(recorte, 10));
title(Imagen diezmada por 10 con filtro fcd=0,5/M.);

subplot(1,2,2);
imshow(diezma(matriz, 10));
title(Imagen diezmada por 10 sin filtro.);

figure(1);
imshow(matriz);
title(Imagen original.);
Practica 7

Interfaces de comunicacion a
nivel de estudio

7.1. Introduccion
Con posterioridad a la aplicacion de la tecnologa digital en diversas tareas del
campo de la television, se hizo necesario conformar un modo de transmision digital
del vdeo. De esta manera, la comunicacion entre los equipos de estudio se realizara
tambien en el dominio digital; evitando la cascada de conversiones D/A y A/D que
existan en la cadena de produccion, considerando la transmision analogica. As,
en 1986 la Union Internacional de Telecomunicaciones publico la recomendacion
UIT-R BT.656. En ella se defina el interfaz paralelo, para la transmision digital
de informacion de vdeo codificado segun la norma 4:2:2, dentro de los estudios. En
esta primera version de la recomendacion, ademas se describio la estructura del tren
de datos asociado a este interfaz. Anos mas tarde se anadira a esta recomendacion
la definicion del interfaz serie. Este presenta como ventajas fundamentales el bajo
coste del cable, y la posibilidad de cubrir distancias mucho mas grandes, a cambio
de una ligera complicacion en la electronica asociada.
Dentro del tren de datos definido en la recomendacion UIT-R BT.656 se habla
de determinados espacios libres que estan asociados a los espacios de sincronismo del
vdeo analogico. Estos espacios pueden ser utilizados para transmitir, opcionalmente,
informacion de sonido u otras informaciones auxiliares, aprovechando as dichos
huecos. Para ello, la UIT elaboro en 1997 las recomendaciones UIT-R BT.1305,
y 1364, en las que se plasma el formato que deben tener los datos a multiplexar
con la informacion de video. No obstante, dentro de un estudio es habitual que la
informacion de vdeo y audio dentro de los estudios viaje por vas independientes,
puesto que ademas llevan consigo procesos tambien distintos.
Posteriormente, la definicion de la television digital de alta definicion, que lleva
consigo un cambio en el formato de la pantalla y una mejora en la resolucion de
la imagen, hizo necesaria la especificacion de unos interfaces de comunicacion apro-
piados. Estos interfaces, se definieron en la recomendacion UIT-R BT.1120. Para
este caso de television de alta definicion tambien se definio el formato de las infor-
maciones auxiliares, como el audio, que se transmitiran por multiplexacion en el
tiempo, junto con la informacion de video. Esta definicion aparece a su vez en la
recomendacion UIT-R BT.1365.
Las recomendaciones UIT-R BT.1305, 1364 y 1365 no van a ser objeto de nuestro
estudio, pero su conocimiento puede ser interesante en diversas aplicaciones y por

59
60 PRACTICA 7. INTERFACES DE COMUNICACION

ello se mencionan aqu.

7.2. Objetivos y motivacion


El conocimiento de las formas de transmision de la informacion de vdeo en el
ambito de los estudios de television se considera basico para un buen aprovecha-
miento de esta asignatura. Por ello, se ha credo conveniente utilizar la tecnica del
estudio dirigido, con el fin de que, a traves de el y de la consulta de normativas
reales, se descubran y analicen los aspectos basicos involucrados en la transmision
de la senal de vdeo a nivel de un estudio de television.
En el siguiente apartado referente al plan de actividades, se encontrara el camino,
a traves de las citadas normas, para conseguir el objetivo que se persigue.
Es conveniente advertir que no se trata de estudiar las normas en su totalidad, ni
comprenderlas al 100 %. El analisis exhaustivo de estas normas llevara probablemen-
te un tiempo considerable debido al lenguaje tecnico utilizado, y a la profundidad
con que estan planteados ciertos conceptos. Lo que se trata en este trabajo es de
localizar y extraer aquella informacion basica que nos permita tener una vision ge-
neral de los distintos procesos involucrados en la transmision de las senales digitales
de vdeo. Por ello, se realizara una tarea de busqueda de los datos concretos que se
piden en cada momento, se elaborara un cuadro resumen con los datos obtenidos, y
finalmente se pediran unas conclusiones.

7.3. Forma de evaluacion


La evaluacion de esta practica se realizara en dos fases. Por una parte, se eva-
luara el cuestionario individual presentado por cada alumno con los resultados pe-
didos; y por otra parte, en los examenes de Junio y Septiembre, aparecera alguna
pregunta o conjunto de preguntas con un valor no superior al 10 %, referentes a este
trabajo.
Este trabajo sera entregado en papel para su evaluacion, con el fin de que se
puedan senalar individualmente aquellas preguntas que esten mal contestadas, o
que deban ser revisadas. Para realizar esta practica se dispondra de dos semanas
contadas a partir de la entrega del enunciado. El ultimo da de practicas de la
segunda semana se recogeran todas las memorias para su evaluacion.
En este trabajo, se encontraran preguntas de localizacion de datos, marcadas con
el signo (L), y preguntas de razonamiento marcadas con el smbolo (R). Para aprobar
esta practica, sera obligatoria la contestacion correcta del 90 % de las preguntas
teoricas marcadas con (L). En esta cantidad de respuestas correctas estara la
barrera del 5. Una vez superada esta barrera, las calificaciones entre el 5 y el 10
vendran determinadas, en primer lugar por el 10 % restante de preguntas teoricas (L),
en segundo lugar, por la totalidad de las preguntas de razonamiento, que supondran
un 25 % de la nota final; y finalmente, el apartado de tabla resumen y conclusiones,
que tendra un peso del 20 %. Una vez corregidas las memorias, estas seran devueltas
a los alumnos para el estudio del examen. A aquellos que no hayan superado el 90 %
de las preguntas (L) tendran un segundo plazo para corregirlas y volver a entregar
la memoria.
7.4. PLAN DE ACTIVIDADES 61

7.4. Plan de actividades


En este apartado se atendera sobretodo a la norma UIT-R BT.656 referente a
los interfaces de comunicacion para sistemas de television de 525 y 625 lneas que
funcionan en el nivel 4:2:2 de la recomendacion UIT-R BT.601 parte A; es decir
sistemas con formatos de pantalla 4/3 y 16/9 muestreados a 13,5 Mhz. Tambien se
dedicara un tiempo, aunque menor, a la recomendacion UIT-R BT.799 que se refiere
a sistemas que utilizan el nivel 4:4:4 de codificacion, y por ultimo a la recomendacion
UIT-R BT.1120 para senales de estudio de television de alta definicion.

7.4.1. Interfaz de comunicacion para television mejorada en el nivel


4:2:2: Recomendacion UIT-R BT.656
Antes de comenzar, hemos de leer con atencion las consideraciones que se expo-
nen y la recomendacion inicial.
(L) 1.- A que sistemas esta dirigida esta recomendacion?

En la introduccion se divide el contenido de la recomendacion en tres partes, una


referente al tren de datos comun a los dos interfaces, las otras dos referentes a las
caractersticas concretas de los interfaces paralelo y serie.

7.4.2. Formato del tren de datos comun a los dos interfaces


(L) 2.- Que tipo de interconexion entre equipos proporcionan estos interfaces?

(L) 3.- Que tipo de informacion binaria pueden transportar estos interfaces?
62 PRACTICA 7. INTERFACES DE COMUNICACION

En el cuadro 1 del apartado 2 se definen los intervalos de tramas.


(R) 4.- Completa la tabla 7.1, considerando unicamente los sistemas de 625 lneas,
en el que se muestran los inicios y finales de los intervalos de supresion de trama y
de vdeo activo para un cuadro completo.

Inicio Fin
Campo 1 Supresion Lnea 1
Vdeo activo
Supresion Lnea 312
Campo 2 Supresion Lnea 313
Vdeo activo
Supresion Lnea 625

Tabla 7.1: Inicio y final de intervalos de supersion vertical.

(L) 5.- En el apartado 2.2 de la recomendacion se reservan ciertos codigos para


fines de identificacion de datos. Expresa estos datos en codigo hexadecimal.

(L) 6.- Indica a que velocidad se transmiten los datos, y de que manera se mul-
tiplexan en el tiempo.

(L) 7.- En el apartado 2.4 se establecen dos codigos de temporizacion llamados


SAV (Start of Active Video) y EAV (End of Active Video). En que lugares del tren
de datos van situados.
7.4. PLAN DE ACTIVIDADES 63

(L) 8.- Indica la estructura general en bits de estos codigos para interfaces de 10
bits.

(R) 9.- Rellena la tabla 7.2 indicando en que lugares se situan las distintas
combinaciones de los bits F, V, y H.

F V H Posiciones en las que se encuentra


0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

Tabla 7.2: Bits F, V y H de los codigos SAV y EAV.

(L) 10.- Explica que mision tienen los bits P.

(R) 11.- Que sentido puede tener enviar codigos 80h, 10h, 80h, 10h durante la
supresion de trama.
64 PRACTICA 7. INTERFACES DE COMUNICACION

Interfaz paralelo
Se trata en la parte 2 de esta recomendacion.
(L) 12.- Que estructura debe tener el medio de transmision (cable y conectores)
que utiliza este interfaz?

(L) 13.- Indica la frecuencia a la que debe oscilar el reloj de transmision.

(R) 14.- El apartado 3 hace referencia a posibles variaciones en la fase del reloj y
establece un lmite maximo para el funcionamiento efectivo del interfaz. Sabras de-
cir porque este lmite maximo no es adecuado para la temporizacion de la conversion
D/A o la conversion serie-paralelo?
7.4. PLAN DE ACTIVIDADES 65

(R) 15.- En la figura 4 de la recomendacion se habla de una herramienta sencilla


para la medida de la calidad en la comunicacion. Esta herramienta es el diagrama
de ojos. Indica que instrumento se puede utilizar para tomar estas medidas, y de
que manera se utiliza con este proposito.

(L) 16.- El apartado 5 habla de detalles mecanicos del conector, pero solo nos
vamos a detener en el tipo de conector que se utiliza en el interfaz paralelo. Cual
es?

Interfaz serie
Se describe en la parte 3 de esta recomendacion.
(L) 17.- En el apartado 5 se describe el medio de transmision. Que estructura
debe tener el medio de transmision que utiliza este interfaz?
66 PRACTICA 7. INTERFACES DE COMUNICACION

(L) 18.- Si no hay posibilidad de una senal de reloj expresamente dispuesta en


este medio de transmision, de que manera se consigue la sincronizacion del emisor
y el receptor.

(R) 19.- Indica a que frecuencia de bit se envan los datos mediante este interfaz.

(L) 20.- En el apartado 6.3.3 se habla de caractersticas del conector utilizado


en el interfaz electrico, pero solo nos vamos a detener en el tipo de conector que se
utiliza. Cual es?
7.4. PLAN DE ACTIVIDADES 67

7.4.3. Interfaz de comunicacion para television mejorada en el nivel


4:4:4: Recomendacion UIT-R BT.799
Esta recomendacion tiene una estructura similar a la 656 vista anteriormente por
lo tanto solo nos detendremos en aquellos detalles especficos que las diferencian.
(L) 1.- En las consideraciones y la recomendacion previa, se trata de justificar el
establecimiento de esta norma. Indica a que tipo de informacion va orientado este
interfaz.

(L) 2.- En la introduccion general de esta recomendacion se plantea la solucion


que se adopta para implementar el interfaz para el nivel 4:4:4, a partir del desarro-
llado para el nivel 4:2:2. Cual es esta solucion?

(L) 3.- Que senales de vdeo se pueden transmitir por los interfaces a los que se
refiere esta norma?
68 PRACTICA 7. INTERFACES DE COMUNICACION

Formato del tren de datos


Se describe en la parte 1 de esta recomendacion.
(L) 4.- En los apartados 2.3 y 2.4 se explica de que manera se multiplexan los
datos en el tiempo para la transmision. Indica que datos y en que orden se transmiten
por cada uno de los enlaces.

(L) 5.- Comenta las similitudes que veas en los codigos de referencia de tempo-
rizacion respecto del interfaz descrito en la recomendacion 656.

Interfaz paralelo
Se describe en la parte 2 de esta recomendacion
(L) 6.- Una caracterstica propia de este interfaz es la relacion de temporizacion
entre los dos enlaces, que aparece en el apartado 3. Indica el retardo maximo que se
permite entre ambos.

(L) 7.-Comenta las similitudes que encuentres en la senal de reloj respecto del
interfaz descrito en la recomendacion 656.
7.4. PLAN DE ACTIVIDADES 69

Interfaz serie
Se describe en la parte 3 de esta recomendacion.
(L) 8.- Tambien en el interfaz serie se especifica la relacion de temporizacion
entre los dos enlaces en el apartado 2. Cual es el retardo maximo que se permite?.
70 PRACTICA 7. INTERFACES DE COMUNICACION

7.4.4. Interfaz de comunicacion para television de alta definicion:


Recomendacion UIT-R BT.1120
La recomendacion UIT-R BT.1120, en concordancia con la 709 de codificacion de
la senal de television de alta definicion, establece dos tipos de interfaces: en la parte
1 se describe un interfaz adecuado a la codificacion de television convencionales,
haciendo la distincion entre sistemas de 1125 lneas y 1250 lneas. En cambio, la
parte 2 describe un interfaz comun para los sistemas codificados segun el formato
comun de imagen para alta definicion(HD-CIF).

Interfaces para senales de TVAD relacionados con los sistemas conven-


cionales: Formato del tren de datos
El formato del tren de datos se describe en la parte 1.
En el apartado 2 se describe el interfaz digital. Como en casos anteriores se
pretende transmitir, tanto informacion de vdeo y temporizacion como senales auxi-
liares.
(L) 1.- Indica de que manera se transmiten las senales Y , CB y CR en este tren
de datos.

(L) 2.- Comenta las similitudes que observes en los codigos de referencia de
temporizacion SAV y EAV, respecto de los interfaces anteriores.
7.4. PLAN DE ACTIVIDADES 71

Interfaces para senales de TVAD relacionados con los sistemas conven-


cionales: Interfaz paralelo
El interfaz paralelo se describe a partir del apartado 3.
(L) 3.- Describe las diferentes estructuras del cable de transmision que utiliza
este interfaz.

(L) 4.- Describe el funcionamiento del reloj en cada uno de los casos.

En el apartado 3.3 se describen las caractersticas mecanicas de los conectores y


cables.
(L) 5.- Identifica el tipo de conector en cada caso.
72 PRACTICA 7. INTERFACES DE COMUNICACION

Interfaces para senales de TVAD relacionados con los sistemas conven-


cionales: Interfaz serie
El interfaz serie se describe en el apartado 4 de esta parte.
(L) 6.- Indica la forma en que se multiplexan los datos segun el contenido de los
apartados 4.1 y 4.2.1.

(L) 7.- Cual es la frecuencia de reloj que se utiliza en el interfaz serie?

(L) 8.- Describe el tipo de cable y los conectores del interfaz electrico segun el
apartado 4.3.
7.4. PLAN DE ACTIVIDADES 73

Interfaz para formato comun de imagen de alta definicion (CIF): Formato


del tren de datos
El interfaz para el formato comun de imagen se describe en la parte 2 de esta
recomendacion comenzando con el formato del tren de datos.
(L) 9.- Indica de que manera se tratan las senales Y , CB y CR en el tren de datos
del interfaz CIF segun el apartado 2.1.

(L) 10.- Comenta las diferencias que observes en los codigos de referencia de
temporizacion SAV y EAV respecto de los interfaces anteriores.

Interfaz para formato comun de imagen de alta definicion (CIF): Interfaz


paralelo
El interfaz paralelo se describe en el apartado 3.
(L) 11.- En los apartados 3 y 3.1 se describe la senal de reloj adoptada para el
interfaz paralelo. Indica de que senal se trata y en que momento se producen las
transiciones.
74 PRACTICA 7. INTERFACES DE COMUNICACION

(L) 12.- Describe el tipo de cable y los conectores del interfaz paralelo segun el
apartado 3.3.

Interfaz para formato comun de imagen de alta definicion (CIF): Interfaz


serie
El apartado 4 describe el interfaz serie.
(L) 13.- Indica la forma en que se multiplexan los datos segun el contenido de
los apartados 4.1 y 4.2.1.

(L) 14.- Cual es la frecuencia de reloj que se utiliza en el interfaz serie?

(L) 15.- Describe el tipo de cable y los conectores del interfaz electrico segun el
apartado 4.3.

7.4.5. Resumen comparativo de los diferentes interfaces


Una vez vistos los diferentes interfaces digitales de vdeo se realizara un resumen
comparandolos entre s. Se tratara de comparar la manera de formatear los datos,
el transporte y recepcion de la senal de reloj, etc., as como la estructura logica y
fsica de los interfaces serie y paralelo, y su modo de funcionamiento.
7.5. BIBLIOGRAFIA 75

7.5. Bibliografa
7.5.1. Bibliografa basica
Recomendacion UIT-R BT.656-4. Interfaces para las senales de vdeo con com-
ponentes digitales en sistemas de television de 525 lneas y 625 lneas que
funcionan en el nivel 4:2:2 de la recomendacion UIT-R BT.601 (parte A).

Recomendacion UIT-R BT.799-3. Interfaces para las senales de vdeo con com-
ponentes digitales en sistemas de television de 525 y 625 lneas que funcionan
en el nivel 4:4:4 de la recomendacion UIT-R BT.601 (parte A).

Recomendacion UIT-R BT.1120-3. Interfaces digitales para las senales de es-


tudio de TVAD.

7.5.2. Bibliografa complementaria


Recomendacion UIT-R BT.601-5. Parametros de codificacion de television di-
gital para estudios con formatos de imagen normal 4:3 y de pantalla ancha
16:9.

Recomendacion UIT-R BT.709-4. Valores de los parametros de la norma de


TVAD para la produccion y el intercambio internacional de programas.

Rodrguez Vazquez, J.L. Vdeo digital. Ed: SP-EUITT-UPM. Madrid (1996)

Watkinson, J. Vdeo digital, Ed. Paraninfo. (1996)

Watkinson, J. El arte del vdeo digital, Ed. IORTV. (1992)

Bethencourt, T. Sistemas de television: clasicos y avanzados. Ed. IORTV.


(1992).
76 PRACTICA 7. INTERFACES DE COMUNICACION
Practica 8

Potencial de compresion de la
DCT en imagenes estaticas

8.1. Objetivo
Comprobar en la practica algunas de las propiedades de la Transformada Discreta
del Coseno (DCT), que hacen posible conseguir la compresion subjetivamente sin
perdidas en secuencias de vdeo. Se va a analizar la importancia de los distintos
coeficientes de la DCT, con el fin de considerar su eliminacion, consiguiendo as la
compresion intracuadro. Tambien se aplicara una matriz de cuantificacion real, de
las utilizadas por el metodo de compresion JPEG, para comprobar sus resultados

8.2. Introduccion
La gran cantidad de informacion digital que aparece a partir del muestreo de
secuencias de vdeo hace necesaria su compresion, para poder almacenar o transmitir
dicha informacion con un coste razonable. Esta compresion es posible debido a la
existencia de informacion redundante en las secuencias de vdeo y que por tanto se
puede eliminar para volver a recuperarla en recepcion a partir de la informacion
real.
Podemos clasificar la informacion redundante segun su naturaleza en tres cate-
goras. La redundancia espacial aparece dentro de cada fotograma, y hace referencia
a que los objetos poseen una cierta continuidad. Esta continuidad hace que en los
fotogramas existan grandes superficies en las que los pxeles son casi identicos. La re-
dundancia temporal se estudia entre fotogramas consecutivos. Se fundamenta en que
en el tiempo en que se toman dos fotogramas consecutivos (habitualmente 40ms.), no
existen grandes cambios entre las imagenes. Esto hace que en la mayora de los casos
dos pxeles homologos de dos fotogramas consecutivos sean practicamente iguales.
Por ultimo, la redundancia estadstica trata de aprovechar la distinta frecuencia con
que aparecen los smbolos a codificar, para ahorrar unos cuantos bits en aquellos
smbolos que aparecen con mayor frecuencia.
Los metodos de compresion tratan de detectar esta informacion redundante y
eliminarla, codificando exclusivamente y de forma adecuada, la informacion mnima
para recuperar con un nivel de calidad apropiado. Existen varias formas de codifica-
cion para minimizar cada tipo de redundancia, consiguiendo niveles de compresion
moderados. Sin embargo, el uso de un dominio transformado en vez del dominio

77
78 PRACTICA 8. POTENCIAL DE COMPRESION DE LA DCT

espacio-temporal a que estamos acostumbrados, multiplica los factores de compre-


sion, afectando solo de forma ligera a la calidad.
La transformacion que se utiliza mas habitualmente en tratamiento de imagenes
es la transformada discreta del coseno (DCT); no por ser la unica, ni quiza la mejor,
sino porque los metodos MPEG de compresion, que estan basados en la DCT han
sido aceptados ampliamente por todo el mundo. Al estudio de esta transformacion,
y mas concretamente a sus propiedades, va dirigida esta practica.

8.3. Desarrollo
Los algoritmos de compresion son bastante complejos de desarrollar. No obstante,
en esta practica se han elegido, de todos los aspectos involucrados en la compresion
de vdeo, aquellos que son mas representativos, y cuya dificultad no es excesiva, de
forma que el desarrollo de esta no lleve mas tiempo del disponible en una sesion.
Los cuatro aspectos que se van a analizar son estos:

En primer lugar. la distribucion de la informacion, en el dominio de la DCT,


de una imagen. Se comprobara que la mayor parte de la informacion reside en
los coeficientes de baja frecuencia.

Despues, entrando ya en el terreno de la compresion, veremos que la elimina-


cion de gran parte de los coeficientes de la DCT en realizaciones de tamano
8x8 no degrada en exceso la calidad de las imagenes.

En cambio, se observara que la cuantificacion del coeficiente DC s puede afec-


tar apreciablemente a dicha calidad, en el llamado efecto bloque(o bloc-
king).

Finalmente, se utilizara una matriz de cuantificacion real, la matriz de cuan-


tificacion por defecto del metodo JPEG para cuantificar los coeficientes de la
DCT y se comentaran los resultados.

8.3.1. Distribucion de la informacion en la DCT de una imagen


Al aplicar la transformada discreta del coseno a una imagen, la mayor parte
de la informacion se concentra en los coeficientes que representan a las frecuencias
mas bajas. En este apartado, se va a comprobar este hecho a partir de una imagen
completa. Para realizar este apartado puede utilizarse cualquiera de las imagenes
que se tomaron en la practica 1.
En este apartado se codificara una funcion de MATLAB que tendra como en-
trada una variable de tipo matriz que representa a una imagen en niveles de gris
(blanco y negro). Para pasar una imagen en color a niveles de gris puede utilizarse la
funcion de MATLAB rgb2gray(). A esta matriz de entrada, que al ser en niveles de
gris sera bidimensional, se le calculara la DCT 2D mediante la funcion dct2(), y fi-
nalmente se representaran graficamente sus coeficientes mediante la funcion mesh().
Esta representacion grafica de los coeficientes se realizara en dos partes. En
primer lugar se representaran todos los coeficientes, y en segundo lugar unicamente
los primeros 50x50 coeficientes de mas baja frecuencia. Estas dos representaciones se
8.3. DESARROLLO 79

visualizaran a la vez, mediante la orden subplot(), sobre la misma ventana figure


actual.
El formato de esta funcion sera el siguiente:

infoDCT(matriz_entrada);

Puede observarse que no es necesario definir variable de salida, puesto que la


salida de la funcion es la propia representacion grafica

8.3.2. Aplicacion de la DCT a la compresion intracuadro


En este apartado se va a utilizar la DCT de forma similar a la que se utiliza en
los metodos de compresion JPEG, MPEG-2 y otros. En este metodo, se divide la
imagen en pequenos bloques cuadrados de 8x8 pxeles, y posteriormente se aplican
los algoritmos de compresion correspondientes sobre dichos bloques. A la hora de
recuperar, se deben realizar cada una de las DCT inversas a las matrices 8x8, y
recomponer nuevamente la imagen resultado.
Para resolver este apartado, se utilizara como base la funcion de MATLAB ya
codificada .aplicaDCT()cuyo listado aparece a continuacion.

function matriz_salida = aplicaDCT(matriz_entrada)

%----------------------------------------------------------------
% La funcion aplicaDCT, tal y como esta codificada, devuelve a la
% salida la misma matriz que se le ha pasado como parametro de
% entrada. No obstante, aunque operativamente no se obtiene de
% ella ningun resultado, esta preparada para que a partir de ella
% se puedan realizar diferentes pruebas relativas a la
% codificacion intracuadro que se utiliza en los metodos de
% compresion JPEG y MPEG-1 y 2.
%
% Esta funcion divide la variable matriz de entrada en
% submatrices de tama~no 8x8, calcula, de todas ellas, su DCT
% bidimensional y abre la posibilidad de jugar con los
% coeficientes de estas DCTs segun las necesidades.
% Posteriormente vuelve a convertir las matrices DCT al dominio
% espacial mediante la DCT inversa, y recompone la imagen para
% comprobar los efectos de los cambios que se hayan podido
% realizar en los coeficientes.
%----------------------------------------------------------------

tam = size(matriz_entrada); % calculo del tama~


no de la entrada

% Division de la matriz de entrada en submatrices 8x8, y


% construccion de una lista (listaBloques) con todas estas
% submatrices.
n_celdasX = ceil(tam(2)/8); % numero de celdas horizontal
n_celdasY = ceil(tam(1)/8); % numero de celdas vertical
listaBloques = zeros(8, 8, n_celdasX * n_celdasY);
matrizBloques = zeros(n_celdasY * 8, n_celdasX * 8);
matrizBloques(1:tam(1), 1:tam(2)) = matriz_entrada;
80 PRACTICA 8. POTENCIAL DE COMPRESION DE LA DCT

% matrizBloques tiene tama~no multiplo de 8 en x e y.


% A continuacion se rellena la lista de bloques con las
% submatrices 8x8 de la matriz.
for i=1:n_celdasX
for j=1:n_celdasY
listaBloques(:, :, i + (j-1)*n_celdasX) = ...
matrizBloques((j-1)*8 + 1 : j*8, (i-1)*8 + 1 : i*8);
end
end
% calculo de las DCTs 8x8
for k=1:n_celdasX*n_celdasY
listaDCT(:,:,k) = dct2(listaBloques(:,:,k));
end
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% Aqu empieza el procesamiento particular.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
resultado = listaDCT; % sin procesamiento
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% Aqu termina el procesamiento particular.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% Recuperacion de matrices 8x8 al dominio espacial
for k=1:n_celdasX * n_celdasY
listaBloques(:,:,k) = idct2(resultado(:,:,k));
end
% Reconstruccion de la imagen
salida = zeros(size(matrizBloques));
for n=1:n_celdasX
for m=1:n_celdasY
salida((m-1)*8 + 1 : m*8, (n-1)*8 + 1 : n*8) = ...
listaBloques(:,:,n + (m-1)*n_celdasX);
end
end
% Salida de la imagen con el tama~
no original
matriz_salida = uint8(salida(1:tam(1), 1:tam(2)));
Esta funcion realiza las siguientes operaciones:
(a) Divide la variable matriz_entrada en submatrices de tamano 8x8, y almacena
dichas submatrices en una variable listaBloquesde tamano 8x8xN.
(b) A cada una de estas matrices 8x8 se les aplica la DCT bidimensional.
(c) Se establece el lugar del proceso en el que se anadiran los algoritmos de prueba
a codificar por los alumnos. En este punto se realizaran distintas pruebas sobre
las matrices de coeficientes que se indiquen.
(d) Se aplica la DCT inversa a las matrices 8x8.
(e) Se reconstruye la imagen resultante del proceso senalado.
8.3. DESARROLLO 81

Ejercicios:
Las operaciones a realizar con las matrices de coeficientes pueden realizarse to-
mando como base la propia funcion aplicaDCT() y generando a partir de ella las
distintas versiones aplicaDCTn(). Cada una de las pruebas a realizar son indepen-
dientes debiendo partir en cada caso del listado original.

(a) Comprobacion de funcionamiento de la funcion aplicaDCT(). Se aplicara dicha


funcion a una matriz imagen en tonos de gris y se comprobara que a la salida
se obtiene la imagen original.

(b) Eliminacion de todos los coeficientes AC. En la parte dedicada al procesa-


miento particular, se pondran a cero todos los coeficientes distintos del DC
(C(0,0)) en cada una de las matrices 8x8. Esta funcion se guardara con el
nombre aplicaDCT1()".

(c) Solo cuatro coeficientes de baja frecuencia. Modificar la funcion aplicaDCT()


para que en la parte de procesamiento particular se eliminen todos los coefi-
cientes distintos de los cuatro de mas baja frecuencia, es decir, DC y los tres
de alrededor. Esta funcion se guardara con el nombre aplicaDCT2().

(d) Solo nueve coeficientes de baja frecuencia. Modificar la funcion aplicaDCT()


para que en la parte de procesamiento particular se eliminen todos los coefi-
cientes excepto los nueve de mas baja frecuencia, es decir, los cuatro del apar-
tado anterior y los cinco siguientes. Esta funcion se guardara con el nombre
aplicaDCT3().

(e) Cuantificacion del coeficiente DC. En la parte de procesamiento particular


de aplicaDCT(), sin eliminar ningun coeficiente, realizar una cuantificacion
a 4 bits (16 niveles posibles) sobre el coeficiente DC para observar el efecto
bloque. Guardar la funcion completa con el nombre aplicaDCT4().

(f) Cuantificacion mediante matriz. En este apartado se cuantificaran las matrices


de coeficientes tal y como se hace en la realidad. Las matrices de coeficientes
originales se dividen por una matriz de cuantificacion, y el resultado se re-
dondea al entero mas cercano. Esta cuantificacion producira largas cadenas de
ceros al final de las matrices de coeficientes, lo que permitira conseguir una
mayor compresion tanto en el caso de grabacion como de transmision.
En el extremo receptor, o en el momento de recuperar la informacion alma-
cenada, las matrices cuantificadas se multiplicaran de nuevo por su matriz de
cuantificacion, restableciendo as los valores mas aproximados a los originales.
En este apartado, se simulara todo este proceso. Para ello podemos partir de
la funcion aplicaDCT() ofrecida. En la zona de procesamiento particular se
dividiran las matrices de coeficientes por una matriz de cuantificacion, redon-
deando posteriormente al entero mas cercano, y volviendo a multiplicar de
nuevo por la misma matriz de cuantificacion. De esta manera, podemos ha-
cernos una idea de los efectos que tiene esta forma de cuantificacion con las
imagenes que utilicemos.

A continuacion se presentan dos matrices de cuantificacion diferentes que se


utilizaran en este apartado con el fin de comparar sus resultados.
82 PRACTICA 8. POTENCIAL DE COMPRESION DE LA DCT


16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55

14 13 16 24 40 57 69 56

14 17 22 29 51 87 80 62
JP EG =



18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92

49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99

8 16 19 22 26 27 29 34
16 16 22 24 27 29 34 37

19 22 26 27 29 34 34 38

22 22 26 27 29 34 37 40
M P EG =



22 26 27 29 32 35 40 48
26 27 29 32 35 40 48 58

26 27 29 34 38 46 56 69
27 29 35 38 46 56 69 83

Ambas matrices se encuentran almacenadas en el fichero de variables de MAT-


LAB llamado cuantifica.mat que se ofrecera durante la practica. Para cargar estas
variables al entorno de trabajo se utilizara el comando load(). La primera matriz
expuesta tiene el nombre cuantif_JPEG dentro del fichero, y es la matriz de cuan-
tificacion por defecto, que utilizan los algoritmos de compresion JPEG.
Opcionalmente, como sabemos el formato JPEG puede utilizar otras matrices
de cuantificacion diferentes, pero en esos casos, debe almacenarse o transmitirse
tambien los valores de la matriz utilizada. Si no se almacena nada se entendera que
la matriz utilizada es esta.
La segunda matriz tiene el nombre cuantif_MPEG dentro del fichero, y es una de
las matrices que se utilizan habitualmente en el formato de compresion MPEG. Esta
matriz se utiliza para comprimir tanto las imagenes intracuadro (I) como los errores
de prediccion en los casos en los que se aplique la tecnica de compensacion de mo-
vimiento; por eso puede notarse que sus valores son algo mas bajos que los del caso
JPEG. Tenemos que tener en cuenta, que las imagenes I, al ser referencia para las
imagenes P y B, pueden propagar errores; una compresion excesiva en una imagen I
puede hacer que las predicciones de imagenes posteriores sean de baja calidad, por
su parte, una cuantificacion excesiva del error de prediccion ocasionaria perdidas de
calidad grandes. Por ello se debe tener un cuidado especial y no comprimir dema-
siado, ya que la aparicion de defectos en las imagenes de prediccion pueden mermar
mucho la calidad de la secuencia.
En este ultimo apartado se codificaran dos funciones aplicaDCT5() para el ca-
so JPEG, y aplicaDCT6() para el formato MPEG a partir de aplicaDCT() y se
comentaran los resultados en la memoria de la practica.

8.4. Resultados de la practica


Al final de la practica se realizara una memoria breve comentando los resultados
obtenidos en cada caso, y se guardara, junto con los ficheros de MATLAB en el
directorio vdfinalde la cuenta del alumno en el servidor teleco.uclm.es
8.4. RESULTADOS DE LA PRACTICA 83

Com en practicas anteriores, se aconseja probar los algoritmos implementados


mediante la funcion de test, que se ofrece a continuacion, antes de entregarlos para
su correccion.
La duracion estimada de la practica es de dos semanas.

function salida = intracuadro(fichero_entrada)

matriz_entrada = imread(fichero_entrada);

tam=size(matriz_entrada);
if (tam(1)+tam(2) < sum(tam))
matriz_gris = rgb2gray(matriz_entrada);
else
matriz_gris = matriz_enttrada;
end

figure(8);
imshow(aplicaDCT6(matriz_gris));
title(Matriz de cuantificacion habitual MPEG-2.)

figure(7);
imshow(aplicaDCT5(matriz_gris));
title(Matriz de cuantificacion por defecto en JPEG.)

figure(6);
imshow(aplicaDCT4(matriz_gris));
title(Cuantificacion de coeficientes DC: Efecto "bloque".)

figure(5);
imshow(aplicaDCT3(matriz_gris));
title(Nueve coeficientes de mas baja frecuencia. Factor 64:9)

figure(4);
imshow(aplicaDCT2(matriz_gris));
title(Cuatro coeficientes de mas baja frecuencia. Factor 16:1)

figure(3);
imshow(aplicaDCT1(matriz_gris));
title(Solo coeficientes DC. Factor 64:1.)

figure(2);
imshow(aplicaDCT(matriz_gris));
title(Resultado de aplicaDCT(). Imagen original)

figure(1);
infoDCT(matriz_gris);
84 PRACTICA 8. POTENCIAL DE COMPRESION DE LA DCT
Practica 9

Compensacion de movimiento y
compresion intercuadro

9.1. Objetivos
El objetivo principal de esta practica es acercarnos al proceso de compresion in-
tercuadro de MPEG-2. Este acercamiento se hara observando las diferentes tecnicas
que se llevan a cabo en este tipo de compresion.

La primera tecnica es la de compensacion de movimiento que intenta detectar


el movimiento que se produce entre un fotograma y el siguiente, buscando
posibles desplazamientos de los macrobloques.

En segundo lugar, se utiliza la tecnica de codificacion diferencial DPCM que


tiene su fundamento en la codificacion, no de macrobloques enteros, sino de
la diferencia entre el macrobloque actual y una prediccion del mismo; lo que
sera el error de prediccion.

Finalmente, sobre el error de prediccion se aplica la codificacion intracuadro


abordada de la practica anterior: division en bloques, aplicacion de la DCT,
cuantificacion, lectura en zig-zag, y codificaciones de longitud variable (VLC)
y longitud de recorrido (RLC).

9.2. Introduccion
La maxima potencia de compresion en secuencias de vdeo se produce, no por la
codificacion intracuadro de cada fotograma, sino debido a la aplicacion de procesos
intercuadro que tratan de minimizar la redundancia temporal. Estos procesos inter-
cuadro se basan en trabajar sobre una prediccion de la imagen actual, a partir de
una imagen anterior y/o una imagen siguiente.
Como sabemos, en MPEG-2 existen tres tipos de imagenes: imagenes intracuadro
(I), imagenes de prediccion (P), e imagenes bidireccionales (B). Las imagenes que
utilizan compresion intercuadro son las P y B, con la diferencia que las imagenes
P solo toman como referencia para calcular la prediccion la imagen I o P anterior,
mientras que las imagenes B toman como referencia de prediccion indiferentemente
la imagen I o P anterior o siguiente.

85
86 PRACTICA 9. COMPENSACION DE MOVIMIENTO

Hemos de tener en cuenta que las secuencias de vdeo tratan de mantener una
cierta continuidad en la accion, de manera que el ojo perciba un movimiento cons-
tante. Por ello, en el periodo de tiempo que transcurre entre dos fotogramas, y salvo
un cambio de plano, las diferencias que se producen en las imagenes se deben a lige-
ros movimientos entre los objetos, o en todo caso a movimientos de la camara, que
en definitiva se reflejan tambien en desplazamientos de partes de la imagen. Estos
movimientos trata de contrarrestarlos la compensacion de movimiento. El resultado
de detectar y contrarrestar en parte esos desplazamientos es una prediccion de la
imagen actual, que simplemente se codifica mediante los vectores de movimiento de
los macrobloques.
La imagen de prediccion, resultante de la aplicacion de la compensacion de mo-
vimiento, se diferencia respecto de la imagen actual en el error de prediccion. Este
error de prediccion sera lo que necesitara el decodificador, junto con los vectores
de movimiento, para regenerar la imagen actual al final de la cadena. Pero no es
necesario almacenar todo el error de prediccion, a este tambien podemos aplicar-
le la compresion intracuadro. Por otra parte, el error de prediccion suele ser muy
pequeno, de manera que su codificacion intracuadro con la utilizacion de tecnicas
RLC y VLC se realizara con muy pocos bits, aumentando el factor de compresion
considerablemente, y sin merma de la calidad.
En esta practica se estudiaran los procesos involucrados en la compresion inter-
cuadro. Debido a la dificultad de programacion de estos procesos en el escaso tiempo
disponible, se partira de dos funciones ya codificadas; se analizara su funcionamiento
y posteriormente se evaluaran los resultados que producen.

9.3. Desarrollo
Para esta practica se han preparado dos algoritmos diferentes; uno para las
imagenes P y otro para las imagenes B; a pesar de que como se comprobara las
diferencias son pequenas.

9.3.1. Codificacion de una imagen P


La codificacion de una imagen tipo P parte de la imagen I o P anterior. El co-
dificador MPEG-2 divide la imagen actual y la de referencia en macrobloques de
tamano 16x16, y a partir de ellos calcula sus vectores de movimiento. Mediante es-
tos vectores de movimiento y los macrobloques de la imagen anterior se configura
la imagen de prediccion. La diferencia entre la imagen actual real y la imagen de
prediccion da lugar al error de prediccion. Este error de prediccion se codifica intra-
cuadro; y como hemos visto, necesitara muy pocos bits. Finalmente, la informacion
del error de prediccion se enva junto con los vectores de movimiento de los ma-
crobloques al decodificador, y as, este recompondra la imagen actual a partir de la
imagen anterior de referencia.
Una posible simulacion de este proceso, se describe en la siguiente funcion de
MATLAB. En ella se considera la imagen anterior como una imagen I, por simplifi-
car.

function matriz_salida = imagenP(matrizI, matrizP)

tam = size(matrizI);
9.3. DESARROLLO 87

% Division de la matriz de entrada en submatrices 16x16, y


% construccion de una lista (listaMacroB) con todas estas
% submatrices.
n_celdasX = ceil(tam(2)/16);
n_celdasY = ceil(tam(1)/16);
listaMacroBI = zeros(16, 16, n_celdasX * n_celdasY);
listaMacroBP = zeros(16, 16, n_celdasX * n_celdasY);
matrizMacroBI = zeros(n_celdasY * 16, n_celdasX * 16);
matrizMacroBP = zeros(n_celdasY * 16, n_celdasX * 16);
matrizMacroBI(1:tam(1), 1:tam(2)) = matrizI;
matrizMacroBP(1:tam(1), 1:tam(2)) = matrizP;

% matrizMacroBx tiene tama~


no multiplo de 16 en x e y. A
% continuacion se rellena la lista de bloques con las
% submatrices 16x16 de la matriz.
for i=1:n_celdasX
for j=1:n_celdasY
listaMacroBI(:, :, i + (j-1)*n_celdasX) = ...
matrizMacroBI((j-1)*16 + 1 : j*16, (i-1)*16 + 1 : i*16);
listaMacroBP(:, :, i + (j-1)*n_celdasX) = ...
matrizMacroBP((j-1)*16 + 1 : j*16, (i-1)*16 + 1 : i*16);
end
end

% Compensacion de movimiento en P sobre I


opera_correla = zeros(n_celdasX*n_celdasY, n_celdasX*n_celdasY);
resulta_correla = zeros(1, n_celdasX*n_celdasY);
for i=1:n_celdasX*n_celdasY
for j=1:n_celdasX*n_celdasY
opera_correla(i, j) = ...
corr2(listaMacroBP(:,:,j), listaMacroBI(:,:,i));
end
end
[maximo, resulta_correla] = max(opera_correla);

% "maximo" contiene el valor de la correlacion entre los


% macrobloques si este valor esta por encima de un umbral, la
% codificacion de macrobloque sera intercuadro, y si esta por
% debajo sera intracuadro "resulta_correla" actua como vector
% de movimiento, ya que es el ndice del macrobloque que en
% cada caso contiene el maximo de correlacion
load cuantifica
macroBloque = zeros(16, 16);
listaBloques = zeros(8, 8, 4);
listaDCT = zeros(8, 8, 4);

% "listaBloques" se utiliza para realizar las codificaciones de


% los bloques, ya sean intracuadro o intercuadro. En ambos
% casos se utilizara la matriz de cuantificacion "cuantif_MPEG"
for i= 1:n_celdasX*n_celdasY
88 PRACTICA 9. COMPENSACION DE MOVIMIENTO

if maximo(i) >= 0.7 % intercuadro


macroBloque = listaMacroBP(:,:,i) - ...
listaMacroBI(:,:,resulta_correla(i));
% division en bloques
listaBloques(:, :, 1) = macroBloque(1:8, 1:8);
listaBloques(:, :, 2) = macroBloque(1:8, 9:16);
listaBloques(:, :, 3) = macroBloque(9:16, 1:8);
listaBloques(:, :, 4) = macroBloque(9:16, 9:16);
for k=1:4
listaDCT(:,:,k) = dct2(listaBloques(:,:,k));
% calculo de las DCTs, cuantificacion mediante matriz
listaDCT(:,:,k) = round(listaDCT(:,:,k)./ ...
cuantif_MPEG).*cuantif_MPEG;
% DCT inversa
listaBloques(:, :, k) = idct2(listaDCT(:, :, k));
end
% reconstruccion Macrobloques
macroBloque(1:8, 1:8) = listaBloques(:, :, 1);
macroBloque(1:8, 9:16) = listaBloques(:, :, 2);
macroBloque(9:16, 1:8) = listaBloques(:, :, 3);
macroBloque(9:16, 9:16) = listaBloques(:, :, 4);
listaMacroBP(:, :, i) = macroBloque + ...
listaMacroBI(:,:,resulta_correla(i));
else
macroBloque = listaMacroBP(:,:,i);
% division en bloques
listaBloques(:, :, 1) = macroBloque(1:8, 1:8);
listaBloques(:, :, 2) = macroBloque(1:8, 9:16);
listaBloques(:, :, 3) = macroBloque(9:16, 1:8);
listaBloques(:, :, 4) = macroBloque(9:16, 9:16);
for k=1:4
% calculo de las DCTs
listaDCT(:,:,k) = dct2(listaBloques(:,:,k));
% cuantificacion mediante matriz
listaDCT(:,:,k) = round(listaDCT(:,:,k)./ ...
cuantif_MPEG).*cuantif_MPEG;
%DCT inversa
listaBloques(:, :, k) = idct2(listaDCT(:, :, k));
end
% reconstruccion MacroB
macroBloque(1:8, 1:8) = listaBloques(:, :, 1);
macroBloque(1:8, 9:16) = listaBloques(:, :, 2);
macroBloque(9:16, 1:8) = listaBloques(:, :, 3);
macroBloque(9:16, 9:16) = listaBloques(:, :, 4);
listaMacroBP(:, :, i) = macroBloque;
end
end

% Reconstruccion de la imagen
salida = zeros(size(matrizMacroBP));
9.3. DESARROLLO 89

for n=1:n_celdasX
for m=1:n_celdasY
salida((m-1)*16 + 1 : m*16, (n-1)*16 + 1 : n*16) = ...
listaMacroBP(:,:,n + (m-1)*n_celdasX);
end
end

% Salida de la imagen con el tama~


no original
matriz_salida = uint8(salida(1:tam(1), 1:tam(2)));

Ejercicios:
Sobre este listado se tratara de dar respuesta a las siguientes preguntas en la
memoria:

(a) En el fragmento de codigo entre las lneas 29 a 36 se simula el calculo de


los vectores de movimiento. Que procedimiento se sigue para realizar este
calculo? Cual es la zona de busqueda de cada macrobloque?; es decir, Que
zona de la imagen I anterior se utiliza para buscar cada macrobloque de la
imagen actual?

(b) Entre las lneas 57 y 73 se simula el procesamiento intercuadro que se realiza


cuando la semejanza entre el macrobloque actual de la imagen P y el mas
parecido de la imagen I esta por encima de un umbral. De que manera se
produce el proceso de compresion-descompresion?.

(c) Entre las lneas 75 y 91 se simula el procesamiento intracuadro, cuando no se


encuentra un macrobloque semejante al actual en la imagen de referencia, o la
semejanza es pequena. De que manera se produce, en este caso, el proceso de
compresion-descompresion?. Comparar las lneas 58 y 75.

9.3.2. Codificacion de una imagen B


El listado que aparece a continuacion es muy similar al visto hasta ahora. Basica-
mente, las diferencias estan en que, en vez de buscar los macrobloques de la imagen
actual en la imagen anterior unicamente, tambien se buscaran en la imagen posterior.
Ambas imagenes, anterior y posterior se consideran del tipo I para simplificar.
Este aumento de la busqueda de macrobloques en ambas imagenes complica con-
siderablemente el proceso, sobretodo en el tiempo de ejecucion, pero tiene la ventaja
de que posiblemente se encuentren mas coincidencias entre bloques, las diferencias
sean mas pequenas, y por tanto la compresion sea muy alta para estas imagenes.
La funcion siguiente trata de simular el proceso de codificacion y decodificacion
de una imagen B.

function matriz_salida = imagenB(matrizI1, matrizB, matrizI2)

tam = size(matrizI1);

% Division de la matriz de entrada en submatrices 16x16, y


% construccion de una lista (listaMacroB) con todas estas
% submatrices.
n_celdasX = ceil(tam(2)/16);
90 PRACTICA 9. COMPENSACION DE MOVIMIENTO

n_celdasY = ceil(tam(1)/16);
listaMacroBI = zeros(16, 16, 2 * n_celdasX * n_celdasY);
listaMacroBB = zeros(16, 16, n_celdasX * n_celdasY);
matrizMacroBI1 = zeros(n_celdasY * 16, n_celdasX * 16);
matrizMacroBI2 = zeros(n_celdasY * 16, n_celdasX * 16);
matrizMacroBB = zeros(n_celdasY * 16, n_celdasX * 16);
matrizMacroBI1(1:tam(1), 1:tam(2)) = matrizI1;
matrizMacroBI2(1:tam(1), 1:tam(2)) = matrizI2;
matrizMacroBB(1:tam(1), 1:tam(2)) = matrizB;

% matrizMacroBx tiene tama~no multiplo de 16 en x e y. A


% continuacion se rellena la lista de bloques con las
% submatrices 16x16 de la matriz.
desplaza2 = n_celdasX * n_celdasY;
for i=1:n_celdasX
for j=1:n_celdasY
listaMacroBI(:, :, i + (j-1)*n_celdasX) = ...
matrizMacroBI1((j-1)*16 + 1 : j*16, (i-1)*16 + 1 : i*16);
listaMacroBI(:,:,desplaza2+i+(j-1)*n_celdasX) = ...
matrizMacroBI2((j-1)*16+1 : j*16, (i-1)*16+1 : i*16);
listaMacroBB(:, :, i + (j-1)*n_celdasX) = ...
matrizMacroBB((j-1)*16 + 1 : j*16, (i-1)*16 + 1 : i*16);
end
end

% Compensacion de movimiento en B sobre I1 e I2


opera_correla = zeros(2*n_celdasX*n_celdasY, n_celdasX*n_celdasY);
resulta_correla = zeros(1, n_celdasX*n_celdasY);
for i=1:2*n_celdasX*n_celdasY
for j=1:n_celdasX*n_celdasY
opera_correla(i, j) = ...
corr2(listaMacroBB(:,:,j), listaMacroBI(:,:,i));
end
end
[maximo, resulta_correla] = max(opera_correla);

% "maximo" contiene el valor de la correlacion entre los


% macrobloques si este valor esta por encima de un umbral, la
% codificacion de macrobloque sera intercuadro, y si esta por
% debajo sera intracuadro "resulta_correla" es el ndice que
% contiene el maximo de correlacion hace las veces de vector
% de movimiento
load cuantifica
macroBloque = zeros(16, 16);
listaBloques = zeros(8, 8, 4);
listaDCT = zeros(8, 8, 4);

% "listaBloques" se utiliza para realizar las codificaciones de


% los bloques, ya sean intracuadro o intercuadro. En ambos
% casos se utilizara la matriz de cuantificacion "cuantif_MPEG"
9.3. DESARROLLO 91

for i= 1:n_celdasX*n_celdasY
if maximo(i) >= 0.7 % intercuadro
macroBloque = listaMacroBB(:,:,i) - ...
listaMacroBI(:,:,resulta_correla(i));
% division en bloques
listaBloques(:, :, 1) = macroBloque(1:8, 1:8);
listaBloques(:, :, 2) = macroBloque(1:8, 9:16);
listaBloques(:, :, 3) = macroBloque(9:16, 1:8);
listaBloques(:, :, 4) = macroBloque(9:16, 9:16);
for k=1:4
% calculo de las DCTs
listaDCT(:,:,k) = dct2(listaBloques(:,:,k));
% cuantificacion mediante matriz
listaDCT(:,:,k) = round(listaDCT(:,:,k)./ ...
cuantif_MPEG).*cuantif_MPEG;
%DCT inversa
listaBloques(:, :, k) = idct2(listaDCT(:, :, k));
end
% reconstruccion MacroB
macroBloque(1:8, 1:8) = listaBloques(:, :, 1);
macroBloque(1:8, 9:16) = listaBloques(:, :, 2);
macroBloque(9:16, 1:8) = listaBloques(:, :, 3);
macroBloque(9:16, 9:16) = listaBloques(:, :, 4);
listaMacroBB(:, :, i) = ...
macroBloque + listaMacroBI(:,:,resulta_correla(i));
else
macroBloque = listaMacroBB(:,:,i);
% division en bloques
listaBloques(:, :, 1) = macroBloque(1:8, 1:8);
listaBloques(:, :, 2) = macroBloque(1:8, 9:16);
listaBloques(:, :, 3) = macroBloque(9:16, 1:8);
listaBloques(:, :, 4) = macroBloque(9:16, 9:16);
for k=1:4
% calculo de las DCTs
listaDCT(:,:,k) = dct2(listaBloques(:,:,k));
% cuantificacion mediante matriz
listaDCT(:,:,k) = round(listaDCT(:,:,k)./ ...
cuantif_JPEG).*cuantif_JPEG;
%DCT inversa
listaBloques(:, :, k) = idct2(listaDCT(:, :, k));
end
% reconstruccion Macrobloques
macroBloque(1:8, 1:8) = listaBloques(:, :, 1);
macroBloque(1:8, 9:16) = listaBloques(:, :, 2);
macroBloque(9:16, 1:8) = listaBloques(:, :, 3);
macroBloque(9:16, 9:16) = listaBloques(:, :, 4);
listaMacroBB(:, :, i) = macroBloque;
end
end
92 PRACTICA 9. COMPENSACION DE MOVIMIENTO

% Reconstruccion de la imagen
salida = zeros(size(matrizMacroBB));
for n=1:n_celdasX
for m=1:n_celdasY
salida((m-1)*16 + 1 : m*16, (n-1)*16 + 1 : n*16) = ...
listaMacroBB(:,:,n + (m-1)*n_celdasX);
end
end

% Salida de la imagen con el tama~


no original
matriz_salida = uint8(salida(1:tam(1), 1:tam(2)));

Ejercicios:
Sobre esta funcion al igual que en el caso anterior se respondera a las siguientes
preguntas en la memoria

(a) Entre las lneas 22 y 29 se preparan las variables listaMacroBI listaMa-


2

croBBque se utilizaran para el proceso de analisis de los vectores de movi-


miento. Que caracterstica tiene la variable listaMacroBIque la diferencia
de la utilizada en la funcion imagenP()?. Explica el contenido que alber-
gara esta variable y para que se utilizara.

(b) En el fragmento de codigo entre las lneas 33 a 40 se simula el calculo de los


vectores de movimiento. Cual es la zona de busqueda de cada macrobloque?

9.3.3. Comprobacion de funcionamiento de las funciones


Ejercicios:
(a) La funcion imagenP() se probara con dos fotogramas consecutivos de una
secuencia. Estos fotogramas fueron conseguidos en la primera practica que se
realizo en el curso.

(b) Una vez comprobado el funcionamiento completo, se pondra un punto de rup-


tura en la lnea 44 con el fin de visualizar los valores de las variables maximo, que
representa el grado de correlacion conseguido con cada macrobloque de la ima-
gen P respecto a otro de la imagen I; y resulta_correla que indica el ndice
del macrobloque de la imagen I cuya correlacion es maxima con cada macro-
bloque de la imagen P. Representa graficamente, el vector resulta_correla
que contiene informacion sobre los vectores de movimiento, y comenta el re-
sultado obtenido. Si la camara ha permanecido estatica durante la captura,
es probable que algunos valores de resulta_correla coincidan con el pro-
pio indice dentro del vector. Esto significara que el macrobloque que mas se
parece al actual es el homologo de la imagen I, como sera de esperar. En el
caso de que la camara este en movimiento, probablemente muchos valores de
resulta_correla esten desplazados una misma cantidad respecto de su valor
de ndice; esta cantidad caracterizara dicho movimiento.

(c) La funcion imagenB() debera probarse con tres fotogramas consecutivos de una
secuencia. Estos fotogramas tambien se consiguieron en la primera practica que
se realizo en el curso.
9.3. DESARROLLO 93

(d) Una vez comprobado el funcionamiento completo, se pondra un punto de rup-


tura en la lnea 47 con el fin de visualizar los valores de las variables maximo,
que representa el grado de correlacion conseguido con cada macrobloque de
la imagen B respecto a otro de las dos imagenes I; y resulta_correla que
indica el ndice del macrobloque de la lista listaMacroBI cuya correlacion es
maxima con cada macrobloque de la imagen B.

(e) Representa graficamente, aplicando un punto de ruptura en la lnea 47, el


vector que contiene informacion sobre los vectores de movimiento, y comenta
el resultado obtenido comparandolo con el anterior. Probablemente existan
valores de resulta_correla que correspondan a macrobloques de la primera
imagen I, y otros que pertenezcan a la imagen I posterior. Esta es la ventaja de
la utilizacion de imagenes B en compresion intercuadro, la mayor probabilidad
de encontrar macrobloques semejantes en cualquiera de las dos imagenes de
referencia.

Potrebbero piacerti anche