Sei sulla pagina 1di 8

Visión por Computador, ITIS e IT+ITIS

Universidad Rey Juan Carlos


Curso 2009-2010
Práctica 1: Zoom digital.

1. Normas
La memoria de la práctica junto con los programas Matlab se entregarán
a través del Campus Virtual. La fecha tope de entrega de la práctica
es el dı́a del examen de la asignatura.
En la portada de la memoria deben aparecer el nombre y número de
matrı́cula del autor. No existe restricción alguna en cuanto al formato y
extensión de la memoria, aunque se recuerda que la calidad de la memoria
es un aspecto de importancia similar a los programas.

2. Planteamiento
El objetivo de la práctica es tomar contacto con Matlab a la vez que se
aprende a realizar una de las transformaciones espaciales de imágenes más
simple: el zoom.

2.1. Transformaciones espaciales

Una transformación espacial define una transformación geométrica, f ,


entre cada uno de los pı́xeles de una imagen origen y otra imagen destino
(p.ej. proyectar una imagen sobre un cilindro o sobre una esfera y a su vez
el resultado sobre un plano). Una imagen es una función bidimensional en la
que a cada par de coordenadas (x, y) se le asigna un valor de gris, I. Ası́ que
podemos plantearnos realizar la transformación espacial de forma directa,
recorriendo la imagen origen,

for (x=1; x<=ancho_origen; x++)


for (y=1; y<=alto_origen; y++)
I_{destino}(f(x, y)) = I_{origen}(x, y);

1
o recorriendo la imagen destino,

for (u=1; u<=ancho_destino; u++)


for (v=1; v<=alto_destino; v++)
I_{destino}(u, v) = I_{origen}(f^{-1}(u,v));

siendo x e y coordenadas en la imagen origen y u y v coordenadas en la


imagen destino.
La transformación directa consistirá en copiar cada pı́xel de entra-
da en las posiciones de la imagen de salida determinadas por la función de
transformación f . Los pı́xeles de entrada son proyectados desde un conjunto
de enteros (sus coordenadas) a un conjunto de números reales. La dificultad
de realizar una transformación espacial de forma directa, es que nos encon-
traremos con dos tipos de problemas, huecos y superposiciones. Los huecos,
o zonas con valores de pı́xeles indefinidos, aparecen cuando se transforman
los pı́xeles contiguos en posiciones muy alejadas entre si en la imagen des-
tino. Por contra, las superposiciones ocurren cuando pı́xeles contiguos en la
imagen origen se transforman en el mismo pı́xel de salida.
Las limitaciones de la transformación directa se superan considerando a
los pı́xeles de la imagen origen como regiones cuadradas que se pueden trans-
formar en paralelogramos arbitrarios en la imagen de salida. Esto permite
conservar la continuidad después de la transformación.
La transformación inversa trabaja recorriendo la imagen destino y pro-
yectando cada coordenada de la imagen destino en la imagen origen a través
de f −1 . El valor de la muestra en ese punto se copia en la imagen de salida.
Los pı́xeles en la imagen de salida se encuentran centrados en coordenadas
enteras pero su transformado en la imagen origen puede tener coordenadas
no enteras. Por tanto hay que introducir una etapa de interpolación para
conseguir los valores de la entrada en coordenadas no enteras.
Al contrario que la transformación directa la transformación inversa ga-
rantiza que todos los pı́xeles de salida se calculan. En esta práctica se
empleará la transformación inversa.
Nos queda por plantear como se realiza la interpolación de los valores
de gris cuando un pı́xel en la imagen destino, mediante la transformación
inversa, cae en coordenadas no enteras de la imagen de entrada ¿qué valor
de gris se le asignará?

2
2.1.1. Interpolación al vecino más próximo

Con una transformación inversa, recorriendo la imagen destino, hemos


visto que a un pı́xel (con coordenadas enteras) le pueden corresponder coor-
denadas reales en la imagen origen. En el caso general estas coordenadas
reales se encontrarán entre cuatro pı́xeles de la imagen origen (ver Fig. 1).
La forma más sencilla de asignar el valor de gris a este pı́xel es otorgarle el
del pı́xel en la imagen origen que se encuentre más cerca.

Figura 1: El valor de gris de un pı́xel en la imagen destino es el valor del más


cercano en la imagen origen.

2.1.2. Interpolación bilineal

Otra forma de asignar el valor de gris a un pı́xel es emplear una combi-


nación lineal de los valores de los cuatro pı́xeles más cercanos, en la imagen
origen, para producir un nuevo valor interpolado (ver Fig. 2).
Dados cuatro puntos (u0 , v0 ), (u1 , v1 ), (u2 , v2 ) y (u3 , v3 ) y sus respectivos
valores de gris x0 ,x1 ,x2 y x3 , cualquier coordenada intermedia, (u, v), se pue-
de calcular mediante dos interpolaciones consecutivas, una en la dirección
horizontal y otra en la vertical (ver Fig.3), el valor de gris x del pı́xel en la
imagen destino.

3
Figura 2: El valor de gris de un pı́xel en la imagen destino es la el resultado
de interpolación bilineal de los valores de gris de los cuatro vecinos en la
imagen origen.

En la primera pasada horizontal calculamos


(u − u0 )
u′ =
(u1 − u0 )
x01 = x0 + (x1 − x0 )u′
x23 = x2 + (x3 − x2 )u′
Y en la pasada vertical tenemos el resultado
(v − v0 )
v′ =
(v1 − v0 )
x = x01 + (x23 − x01 )v ′

3. Desarrollo
Una transformación digital muy sencilla es el cambio de escala de una
imagen, esto es, multiplicar por un factor cada una de las dimensiones, el
zoom. Se pretende que el alumno desarrolle dos implementaciones del zoom
digital:

4
Figura 3: Interpolación bilineal

1. Empleando la aproximación del nivel de gris al vecino más próximo.

2. Empleando interpolación bilineal en los niveles de gris.

Para ello se pide implementar una función en matlab:

Idest = zoom_digital(Iorig, factor_escala, tipo_interpolacion);

que dada una imagen en escala de grises Iorig (una matriz) y el tipo de
interpolación, devuelva una imagen Idest (una matriz) cuyas dimensiones son
las de Iorig multiplicadas por factor escala. El tipo de interpolación será una
de dos cadenas de caracteres: vecindad o bilineal respectivamente.
NOTA: Las correcciones de la práctica se harán con un script de test
que llama a la función en el formato pedido. Se ruega ajustarse al mismo.

4. Valoración de la práctica
La puntuación obtenida vendrá dada por los siguientes critérios:

Funcionamiento de los dos tipos de interpolación.

Funcionamiento del zoom para aumentar (en escala de grises).

5
Funcionamiento del zoom para disminuir (en escala de grises).

Funcionamiento de la práctica con imágenes en color.

Velocidad de ejecución (vectorización de los bucles).

Limpieza en el código.

Calidad de la memoria.

5. Datos proporcionados
En http://www.gavab.es/wiki/vc/}se encuentran disponibles algunas
imágenes para realizar la práctica sobre ellas.
En http://mat21.etsii.upm.es/ayudainf/aprendainf/Matlab70/matlab70primero.pdf}
pueden encontrar manuales de Matlab.

6. Consejos y consideraciones sobre matlab


En cuanto a la ayuda de matlab:

Matlab tiene un sistema de ayuda al que se invoca con: help.

Se basa en funciones que se agrupan en toolboxes, nosotros fundamen-


talmente emplearemos las de procesado de señal y de imagen.

Para saber como invocar una función: help <nombre funcion>.

Si queremos buscar el nombre de todas las funciones que en su ayuda


mencionen , por ejemplo, la palabra palabra “image”: lookfor image.

Las funciones de matlab se escriben en un fichero: <nombre funcion>.m.

En cuanto al lenguaje de Matlab:

Matlab (Laboratorio de Matrices) siempre trabaja con matrices y posee


en su lenguaje todo tipo de funciones y operadores de matrices: mul-
tiplicación (operador *), multiplicación elemento a elemento (operador
.*), inversa (inv), determinante (det), etc.

6
Es un lenguaje interpretado.
Es fundamentalmente una herramienta de análisis numérico aunque
también posee un toolbox de procesamiento simbólico.
Es una herramienta que funciona en modo comando, ejecutando fun-
ciones y/o expresiones matriciales.
Se puede invocar a nuestras propias funciones (em ficheros .m) sin más
que movernos al directorio en que se encuentre (cd <directorio>) y
escribir en la lı́nea de comandos: nombre funcion(param1, param2)
La convención de matlab es que se recorren las matrices por columnas
(no por filas como en C). Si A es una matriz, entonces A(:) es un vector
columna que es el resultado de concatenar todas las columnas.

En cuanto a las imágenes:

Las imágenes en escala de grises en Matlab son matrices de números


enteros sin signo de 1 byte (uint8 en terminologı́a Matlab) de dimen-
sión alto×largo. Para poder hacer operaciones como multiplicar una
matriz, hay que convertirlas double. Si A es una imagen entonces: B =
double(A) hace la conversión de tipos necesaria para poder operar con
B.
Las imágenes en color son un array de dimensión alto×largo×3 de
uint8.
Para leer una imagen: I = imread(’ imagen1.bmp’);.
Para guardar una imagen en formato BMP: I = imwrite(I,’ imagen1.bmp’,’bmp’);.
Para mostrar una imagen: imshow(uint8(I)); si I es una matriz de
doubles en el intervalo [0, 255] o imshow(I) si es una matriz the doubles
en el intervalo [0,1] (los valores de gris se han dividido por 255).

En cuanto a la velocidad de ejecución:

Matlab al ser un lenguaje interpretado es más lento que C.


Esta orientado a matrices y es muy, muy lento cuando se recorren todos
los elementos de una matriz en un bucle para hacer algo sobre ellos.
¡¡¡En Matlab hay que vectorizar los bucles!!!

7
Veamos el siguiente código Matlab:

A = [1:200000]; % Crea un vector de con 200000 elementos


B = zeros(1,200000);
for i=1:length(A)
if (A(i)>100000)
B(i)=1;
else
B(i)=0;
end
end

Es fácilmente vectorizable de la siguiente forma:

A = [1:200000]; % Crea un vector de con 200000 elementos


B = zeros(1,200000);
i = find(A>100000);
B(i) = 1;
i = find(A<=100000);
B(i) = 0;

Esto es, mediante el empleo de find encontramos todos los ı́ndices de


los elementos de A que cumplen una cierta condición y aplicamos las
operación deseada sobre todos ellos a la vez. Lo que contrasta con la
utilización de un bucle que itera sobre los elementos.

Potrebbero piacerti anche