You are on page 1of 18

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 familiaridad con herramientas basicas de vision computacional empleando Matlab.
En la pagina del curso ME704 se encuentra disponible un conjunto de archivos 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 dise
nados por Tony Lindeberg.

0.1.

Leyendo im
agenes: Formatos

Considere incluir en la ruta de b


usqueda de Matlab (File Set Path)
los siguientes directorios
El directorio ME704/Images-mat que contiene variables auxiliares archivadas 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 especificadas (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 tama
no 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.

0.2.

Desplegando im
agenes: Discretizaci
on y
tablas de colores

La funcion image de Matlab permite visualizar matrices. Existen muchsimas alternativas para codificar el color y naturalmente no existe una correspondencia fija entre los n
umeros en una matriz y colores en la pantalla.
Para esto en Matlab se dispone de una tabla de colores (color table) representada 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
tama
no de la tabla de colores mediante el comando size(colormap,1),
que retorna el n
umero 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 distintas 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 instrucciones 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 desplieguen 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 n
umero 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 intersecciones 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 visualizacion 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 imagen. 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?

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 n
ucleo binomial de coeficientes

1/16 1/8 1/16


1/4

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


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

(1)

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 com


un 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 primer 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 tables. Ejemplos tpicos son transformaciones que requieren de muchos computos 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)

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

Manipulaci
on 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 u


ltimos 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 u
salo 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 transformaci
on
la imagen transformada
el histograma de la imagen transformada
Como determinaste la funcion de transformaci
on?

10

0.6.

Compresi
on 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 operaci
on?
Por que se necesita el par
ametro y como afecta los resultados? Cual es
un valor adecuado para ? Muestra los resultados.
Explica las caractersticas de la transformaci
on logartmica, para que tipo de
im
agenes resulta apropiada y por que resulta a menudo un buen modelo?

0.7.

Ecualizaci
on de histograma

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

z
=0

p()d

(3)

donde p() es la funcion de frecuencia normalizada (histograma normalizado) 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
n
umero de acumuladores nacc empleado para generar el histograma. Naturalmente, 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 transformaci
on
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 n
umero de acumuladores con la imagen ecualizada? En que sentido los resultados son concordantes con lo esperado?
Como se comparan estos resultados con los obtenidos previamente con
funciones de transformaci
on? 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 diferencia 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 convolucion. Compara el tama
no de dxtools con el de tools. Por que son
diferentes?
12

0.8.1.

Umbralizado punto a punto del gradiente

Sobre la base de los resultados anteriores determina una aproximacion de


la magnitud del gradiente
gradmagntools = sqrt(dxtoolsconv .^2 + dytoolsconv .^2);
y luego muestra los resultados en pantalla. Extrae el histograma de esta
imagen y emplealo para inferir un nivel umbral que produzca bordes delgados
cuando se aplica a gradmagntools. Muestra la imagen umbralizada con
showgrey((gradmagntools - h) >0)
para diferentes valores de h. Es facil determinar un umbral para producir
bordes delgados? Realiza el mismo estudio en la imagen godthem256, que
contiene estructuras de mayor complejidad. El trabajo se facilita si escribes
una funcion de Matlab
function pixels = Lv(inpic, shape)
if (nargin < 2)
shape = same;
end
Lx = filter2(dxmask, inpic, shape);
Ly = filter2(dymask, inpic, shape);
pixels = Lx.^2 + Ly.^2;
donde dxmax y dymax son funciones de Matlab que entregan mascaras para
aproximar las derivadas. Idealmente, combina estas operaciones con suavizado resultante de la convolucion con filtros Gaussianos antes del computo del
gradiente. Puedes usar la funcion de la librera discgaussfft.

0.8.2.

Detecci
on de bordes basada en geometra diferencial

Existe otra manera de definir descriptores de borde que resulta menos


dependiente de la eleccion de umbrales. Esta consiste en definir puntos de los
bordes como puntos tales que la magnitud del gradiente alcanza un maximo
local en la direccion del gradiente. Esta definicion puede expresarse en terminos de geometra diferencial como puntos tales que la derivada de segundo
13

orden es igual a cero y la de tercer orden es negativa. La idea es introducir


en cada punto un sistema local de coordenadas (u, v) tales que la direccion
v es paralela a la direccion del gradiente y la direccion u es perpendicular a
el. Luego un borde puede definirse como
Lvv = 0,
Lvvv < 0,

(4)

donde Lvv y Lvvv corresponden a la segunda y tercera derivadas de la


funcion de intensidad suavizada L en la direccion v. Tpicamente, podemos
obtener L a partir de la funcion de imagen original f al realizar la convolucion
con un n
ucleo Gaussiano g
L(.; t) = g(.; t) f

(5)

donde
1 (x2 +y2 )/(2t)
e
(6)
2t
Para expresar la definicion anterior de borde en terminos de derivadas
parciales de la funcion de intensidad suavizada L con respecto a direcciones
cartesianas escribimos el vector gradiente en un punto arbitrario (x0 , y0 ) como
g(x, y; t) =

L =

Lx
Ly

|(x0 ,y0 ) = |L|

cos
sin

|(x0 ,y0 )

(7)

En terminos de
cos = q

Lx
L2x + L2y

sin = q

Ly
L2x + L2y

(8)

las derivadas en las direcciones u y v pueden escribirse como


u = sinx cosy , v = cosx + siny

(9)

Luego de una expansion la expresion implcita de Lvv y Lvvv asume la


siguiente forma
Lvv =

L2x Lxx + 2Lx Ly Lxy + L2y Lyy


L2x + L2y

14

(10)

Lvvv

L3x Lxxx + 3L2x Ly Lxxy + 3Lx L2y Lxyy + L3y Lyyy


=
(L2x + L2y )3/2

(11)

Dado que solo el signo de las derivadas es de interes para la definicion de


borde, podemos evitar dividir por la magnitud del gradiente Lv = |L| =
q
L2x + L2Y y definir los bordes de la siguiente manera
vvv
L

0.8.3.

vv = L2 Lvv = L2 Lxx + 2Lx Ly Lxy + L2 Lyy = 0,


L
v
x
y
= L3v Lvvv = L3x Lxxx + 3L2x Ly Lxxy + 3Lx L2y Lxyy + L3y Lyyy < 0

(12)

C
omputo de descriptores de geometra diferencial

Escribe dos funciones de Matlab Lvvtilde y Lvvvtilde que realicen el


vv y L
vvv . Como puedes ver, t
computo de las expresiones diferenciales L
u necesitas definir mascaras correspondientes a las aproximaciones discretas de
las derivadas parciales hasta el orden tres. La manera mas facil de hacer esto
es empleando diferencias centrales de las derivadas de primer orden

1/2

x = (1/2, 0, 1/2) y = 0
1/2

(13)

y aproximaciones simples de las derivadas de segundo orden


xx = (1, 2, 1) yy

2
=

(14)

Aproximaciones de derivadas de mayor orden pueden obtenerse al aplicar


las anteriores en cascada. Por ejemplo
xxx = x xx , xy = x y , xxy = xx y
Define matrices de coordenadas x e y de acuerdo a
[x y] = meshgrid(-5:5, -5:5)

15

(15)

luego estudia los resultados de aplicar las siguientes operaciones


filter2(dxxxmask, x .^3, valid)
filter2(dxxmask, x .^3, valid)
filter2(dxxymask, x .^2 .* y, valid)
Al aplicar dichas aproximaciones de diferencia sobre polinomios se debe
esperar que lo siguiente se cumpla
x (xn ) = nxn1 + (terminos de orden inf erior)

(16)

xn (xn ) = n!

(17)

xn+k (xn ) = 0

(18)

xn (y k ) = 0

(19)

Verifica que lo anterior se cumple. Cuando estes convencido de que todos


los subcomponentes funcionan, carga la imagen
house = godthem256;
vv en distintas escalas
y realiza el computo de los cruces por cero de L
mediante
contour(Lvvtilde(discgaussfft(house, skala ), same), 0)
axis(image)
axis(ij)
Donde t
u puedes intentar usar skala = 0,0001; 1,0; 4,0; 16,0; 64,0.
Pregunta 14 Que puedes observar?
Estudia el dise
no de la derivada de tercer orden en la direccion del gradiente al cargar la imagen
tools = few256;

16

y muestra el resultado de
showgrey(Lvvvtilde(discgaussfft(tools, skala), same) < 0)
para los mismos valores de skala.
Pregunta 15 Cual es el efecto de la condici
on de signo en esta expresi
on
diferencial?
Pregunta 16 Agrupa los resultado de este experimento en un collage ilustrativo empleando el comando subplot de Matlab. Resume tus observaciones
y conclusiones.

17

You might also like