You are on page 1of 13

Tarea 1

ME704 Robotica y Automatizacion del Diseno


Vision Computacional Empleando Matlab

Prof. Juan Cristobal Zagal


{jczagal at ing.uchile.cl}
Resumen

Esta tarea contiene de un conjunto de ejercicios que permiten adquirir fami-


liaridad con herramientas basicas de vision computacional empleando Matlab.
En la pagina del curso ME704 se encuentra disponible un conjunto de archi-
vos de Matlab e imagenes para su procesamiento. Todo esto en el archivo
comprimido MaterialTareaUno.zip. La tarea se basa en un conjunto de
ejercicios de laboratorio de disenados por Tony Lindeberg.
0.1. Leyendo imagenes: Formatos
Considere incluir en la ruta de busqueda de Matlab (File Set Path)
los siguientes directorios

El directorio ME704/Images-mat que contiene variables auxiliares ar-


chivadas empleando el comando save.

El directorio ME704/Functions que contiene un conjunto de funciones


complementarias.

Una vez que las rutas de Matlab se encuentren correctamente especifica-


das (verificar con el comando path) va a ser posible cargar distintos archivos
con el siguiente tipo de comandos:

Leyendo variables de Matlab:


load canoe256;

Leyendo imagenes definidas como funciones:


nallo = nallo256;

El tamano de una imagen puede ser determinado empleando el comando


whos, o alternativamente

size(variable)

Al trabajar con imagenes resulta frecuente querer saber el valor maximo


y mnimo. En Matlab existen los siguientes metodos

max(Canoe);
max(Canoe(:));

Cuando la funcion max se aplica a matrices retorna un vector de valores


maximos. La notacion alternativa Canoe(:) significa que la matriz de imagen
se trata como un solo vector columna.

2
0.2. Desplegando imagenes: Discretizacion y
tablas de colores
La funcion image de Matlab permite visualizar matrices. Existen muchsi-
mas alternativas para codificar el color y naturalmente no existe una corres-
pondencia fija entre los numeros en una matriz y colores en la pantalla.
Para esto en Matlab se dispone de una tabla de colores (color table) repre-
sentada por una matriz de tres columnas, cada cual con valores en el intervalo
[0, 1]. Dichas columnas representan respectivamente las componentes de color
rojo, verde y azul, al llamar al comando

image(Canoe)

se emplean los valores de los elementos de la matriz imagen Canoe como


ndices de la tabla. Los valores de punto flotante se redondean al entero mas
proximo. Aquellos valores que caen fuera del area definida por la tabla se
reemplazan por el valor de frontera mas cercano. Es posible determinar el
tamano de la tabla de colores mediante el comando size(colormap,1),
que retorna el numero de filas de la matriz.
Notar que uno puede mostrar los elementos de la tabla de colores con
el comando colormap. Para visualizar la tabla de colores es posible usar
plot(colormap), que tiene como resultado el despliegue de tres curvas, una
para cada componente.
Matlab dispone de varias tablas de colores ya definidas. Es posible ver el
listado con el comando help graph3D. Es deseable que experimentes con dis-
tintas tablas, como por ejemplo plot(hsv) o plot(copper(16)), etc. Notar
que es posible ajustar el largo de la tabla de colores.
Veamos un ejemplo. Carga el archivo de imagen Canoe empleando las ins-
trucciones indicadas al comienzo de esta tarea. Para no re-escalar los valores
de pxeles al intervalo [0, 5; 64,5] nosotros simplemente empleamos una tabla
de colores de 256 niveles

colormap(gray(256))

Pregunta 1 Que sucedera si no se hace esto?

Tu podras ver la imagen con

image(Canoe)

3
Al mostrar una imagen es frecuente buscar que los elementos se desplie-
guen cuadraticamente. En Matlab esto se logra con el siguiente comando

axis equal

Al trabajar con imagenes de distinto tipo existe el inconveniente de tener


que verificar constantemente si el dominio de la tabla de colores es consistente
con el intervalo de valores de pxeles.
Para evitar dicho inconveniente se entrega la funcion showgrey en la
librera adjunta. Por defecto la funcion calcula el valor maximo y mnimo de
una imagen y luego transforma el intervalo de niveles de gris al intervalo de
una tabla de colores de 64 niveles. Tambien es posible indicar el largo de la
tabla de colores, as como tambien el intervalo de valores a mostrar. Para
mayor informacion sobre esta u otras funciones usar

help showgrey

tambien puedes verificar si una funcion pertenece originalmente a Matlab


o a la librera del curso con el comando

which showgrey

Ahora observa la imagen Canoe con

showgrey(Canoe)

y modifica el numero de niveles de color al cambiar el segundo argumento


de la funcion en potencias pares de dos del intervalo [2, 256]

showgrey(Canoe, 256)
.
.
.
showgrey(Canoe, 2)

Esta tecnica permita simular el resultado de discretizar una imagen con


un numero variado de bits. Intenta aplicar el metodo a la siguiente imagen

phone = phonecalc256;

Pregunta 2 Por que aparece un patron en el fondo al rededor del telefono?


Cuantos niveles de gris se necesitan para obtener un resultado aceptable
(cualitativamente) en este caso?

4
Algunas limitaciones surgen al considerar solo el valor maximo y mnimo
para desplegar las imagenes de escala de grises. Este es el caso de imagenes
que solo presentan algunos valores significativamente diferentes del resto. En
tal caso nuestro metodo producira imagenes muy oscuras (claras) con solo
un poco de areas claras (oscuras). Puedes ver este fenomeno al cargar la
siguiente imagen
vad = whatisthis256;
empleando la funcion
showgrey(vad)
Luego determina el valor maximo y mnimo de la imagen (con el metodo
inicialmente descrito). Puedes destacar distintos segmentos del intervalo de
niveles de gris al aplicar los lmites zmin y zmax sobre la funcion showgrey
showgrey(vad, 64, zmin, zmax)
Pregunta 3 Que es lo que se muestra en la imagen? Por que es difcil
interpretar la informacion de la imagen original?
Alternativamente uno podra visualizar los datos de la imagen con inter-
secciones en una sola dimension, emplear un esquema de coloreado (pseudo
coloring), curvas de nivel y superficies definidas por la imagen en un espacio
de tres dimensiones.
Por ejemplo, selecciona una fila de la imagen phone = phonecalc256;
con el ndice i y despliega las variaciones de intensidad empleando
plot(phone(i,:))
Observa como los niveles de gris cambian abruptamente, incluso en areas
que aparecen subjetivamente suaves. Genera un borde de escala de grises con
kil = ones(1, 256)*(1: 1: 256);
y luego observa este borde y la imagen nallo256 con la rutina de visua-
lizacion image y las siguientes tablas de color
colormap(gray(256))
colormap(cool)
colormap(hot)

5
Tambien puedes visualizar la imagen

phone128 = binsubsample(phone);

con

contour(phone128, 16)
mesh(phone128)
mesh(binsubsample(phone128))

Pregunta 4 Que conclusiones puedes derivar de lo anterior?

0.3. Sub-muestreo
La intensidad de los elementos de imagen empleada para muestrear una
imagen afecta, de manera fundamental, la informacion contenida en la ima-
gen. Para simular este fenomeno vamos a tomar una imagen y reducir la
resolucion en que se representa la informacion. En Matlab podemos reducir
la resolucion de una imagen de la siguiente manera:

function pixels = rawsubsample(inpic);


[m, n] = size(inpic);
pixels = inpic(1:2:m, 1:2:n);

Para ver el efecto de esta funcion, primero veamos el caso de una imagen
simple de prueba, como una imagen de 99 pxeles definida por la siguiente
llamada

ninepic = indexpic9
rawsubsample(ninepic)

Luego ejecuta repetidamente el operador de sub-muestreo a alguna de las


imagenes mencionadas anteriormente.

Pregunta 5 Cuales son tus resultados y conclusiones?

6
Como una comparacion tambien es bueno estudiar el efecto del operador
de sub-muestreo

function pixels = binsubsample(inpic)


prefilterrow = [1 2 1]/4;
prefilter = prefilterrow * prefilterrow;
presmoothpic = filter2(prefilter, inpic);
pixels = rawsubsample(presmoothpic);

en donde la imagen se filtra con un nucleo binomial de coeficientes



1/4 1/16 1/8 1/16
1/2 (1/4, 1/2, 1/4) = 1/8 1/4 1/8 (1)

1/4 1/16 1/8 1/16


antes de la etapa de sub-muestreo.

Pregunta 6 Por que estos metodos son diferentes?

Pregunta 7 Aplica respectivamente las funciones subsample y binsubsample


dos veces a la imagen phonecalc256. Describe de que maneras los resultados
son similares y distintos. Cuales son las razones de las diferencias?

Pregunta 8 Como serian los resultados al aplicar repetitivamente estos


operadores sobre una imagen texturizada?

0.4. Transformaciones de escala de grises y


tablas de look-up
Una manera comun de transformar una imagen es va transformaciones
de escala de grises. Si el proposito es desplegar una imagen en la pantalla es
posible recurrir a alguno de los siguientes metodos

Aplicar operaciones punto a punto sobre los datos de la imagen.

Transformar los niveles de gris empleando una look up table.

Crear una nueva tabla de color.

7
0.4.1. Operaciones punto a punto
Matlab dispone de muchsimas funciones directamente aplicables al pri-
mer metodo (ver help elfun). Dichas funciones pueden emplearse con el
nombre de la imagen como una variable

neg1 = - Canoe;
showgrey(neg1);
neg2 = 255 - Canoe;
showgrey(neg2);
nallo = nallo256;
showgrey(nallo.(1/3));
showgrey(cos(nallo/10));

Explora el histograma de las primeras dos imagenes con

hist(neg1(:))
hist(neg2(:))

Pregunta 9 Son los resultados esperables? Comenta

0.4.2. Look-up tables


El segundo tipo de transformaciones requiere del empleo de look-up ta-
bles. Ejemplos tpicos son transformaciones que requieren de muchos compu-
tos para cada elemento de la imagen o bien casos en que no existe una formula
cerrada para expresar la transformacion.
En el caso de las look-up tables, los valores de la imagen se emplean
como ndices de una tabla de valores ya calculados. Naturalmente, dicha
tecnica esta disponible solo para imagenes de valores enteros o cuando la
aproximacion a enteros resulta razonable.
Se ha dispuesto de la rutina compose que implementa la composicion de
una imagen de entrada inpic y una tabla previamente calculada lookuptable:

outpic = compose(lookuptable, inpic)

8
Considerando el intervalo de niveles de gris [0, 255] es posible crear una
tabla de look-up empleando

negteransf = (255: -1 :0);

Luego la transformacion de niveles de gris se calcula empleando

neg3 = compose(negtransf, Canoe + 1);

Observa esta imagen en la pantalla y comparala con la operacion de ne-


gacion anterior al generar la siguiente imagen de diferencia

diff = neg3 - neg2;

y luego determina los valores min y max de esta imagen o histograma.

Pregunta 10 Por que es necesario agregar el valor 1 a la imagen antes de


hacer la tabla de look-up?

0.4.3. Manipulacion de tablas de color


Como vimos, cada tabla de color tambien opera como una transformacion
de niveles de gris. Luego resulta posible crear una imagen de contraste reverso
simplemente manipulando tablas de colores. Luego de que has mostrado la
imagen Canoe con

image(Canoe + 1)

tu puedes crear una funcion afn que decrementa desde el valor 1,0 al 0,0
en 256 pasos al escribir

negcolormapcol = linspace(1, 0, 256);

y luego emplear esto para preparar la tabla de color con

colormap([negcolormapcol negcolormapcol negcolormapcol])

Empleando una notacion mas compacta uno tambirn puede emplear showgrey
para implementar el mismo tipo de operacion

showgrey(Canoe, linspace(1, 0, 256), 0, 255)

9
Aqu los dos ultimos argumentos indican a la funcion showgrey que la
imagen toma valores en el intervalo [0, 255], lo cual significa que ya no tenemos
que agregar el valor 1 para lograr que una tabla opere correctamente.
Esta tecnica es la mas simple de las tres, probablemente la menos costosa
en terminos computacionales y la que requiere menos memoria. La desventaja
de solo manipular tablas de color es que el resultado no esta disponible para
posterior procesamiento y analisis.

0.5. Stretching of grey-levels


Carga la imagen nallo256float y mrala usando showgrey. Esta imagen
se ha capturado de tal manera que las variaciones de niveles de gris se han
desvanecido tanto en la partes claras como en las oscuras. Esta imagen se
ha guardado empleando punto flotante, a diferencia de la imagen de enteros
nallo256, con una cuantizacion fina en la escala de grises.
Como puedes ver, muchos detalles de la parte baja de la imagen presentan
un contraste pobre cuando vemos la imagen. Genera el histograma de la
imagen y usalo como una pista para generar diferentes tablas de look-up que
pueden utilizarse para transformar los valores de nivel de gris y luego ver
toda la dinamica de la escena.

Pregunta 11 Visualiza lo siguiente:

la imagen original

el histograma de la imagen original

la funcion de transformacion

la imagen transformada

el histograma de la imagen transformada

Como determinaste la funcion de transformacion?

10
0.6. Compresion logartmica
Emplea la siguiente funcion de transformacion logartmica

T (z) = log( + z) (2)


a la imagen nallo256float

Pregunta 12
Cuales son los efectos de esta operacion?
Por que se necesita el parametro y como afecta los resultados? Cual es
un valor adecuado para ? Muestra los resultados.
Explica las caractersticas de la transformacion logartmica, para que tipo de
imagenes resulta apropiada y por que resulta a menudo un buen modelo?

0.7. Ecualizacion de histograma


Combina el comando hist y el comando cumsum para generar la trans-
formacion tabulada de niveles de gris eqtransf que ecualiza el histograma
de la imagen nallo sobre la base de una transformacion discreta razonable
equivalente a
Z z
T (z) = p()d (3)
=0

donde p() es la funcion de frecuencia normalizada (histograma normali-


zado) de la imagen. Junta los comandos que tu has empleado y escribe una
funcion de Matalab:

function pixels = histeq(image, nacc, verbose)

La funcion debe aceptar cualquier imagen como entrada junto con el


numero de acumuladores nacc empleado para generar el histograma. Natu-
ralmente, la salida es la imagen ecualizada por el histograma. Si el argumento
verbose tiene un valor positivo debera mostrarse el histograma anterior y
posterior al proceso de ecualizacion, como texto y graficamente. Puedes ver

11
ejemplos sobre como escribir una funcion de Matlab al emplear el comando
type showgrey.

Pregunta 13 Despliega en forma grafica la funcion de transformacion


generada, crea la imagen ecualizada por el histograma y determina los
histogramas para esta imagen empleando 16, 64 y 256 acumuladores.

Como se relaciona el numero de acumuladores con la imagen ecuali-


zada? En que sentido los resultados son concordantes con lo esperado?

Como se comparan estos resultados con los obtenidos previamente con


funciones de transformacion? Que ocurre si empleas histeq con la
imagen similar nallo256what?

Que ocurre si tu histograma ecualiza la imagen phonecalc256?

Sera posible mejorar los resultados al considerar el hecho que nallo256float


contiene datos de imagen almacenados como punto flotante, a diferen-
cia de nallo256 que contiene enteros?

0.8. Operadores de diferencias


Implementa los operadores de diferencias deltax y deltay que aproximan
las derivadas parciales de primer orden en dos direcciones ortogonales. Tu
puedes escoger entre el operador simple de diferencias, diferencias centrales,
el operador de Robert diagonal o el operador de Sobel. Luego carga la imagen
few256 de la librera con

tools = few256;

y determina aproximaciones discretas de la derivada empleando

dxtools = conv2(tools, deltax, valid); dytools = conv2(tools,


deltay, valid);

Muestra los resultados en pantalla. Son los resultados consistentes con


lo que esperas? En caso contrario piensa en la relacion entre filtrado y con-
volucion. Compara el tamano de dxtools con el de tools. Por que son
diferentes?

12

You might also like