You are on page 1of 41

Introduccin al Procesamiento

de Imgenes con Matlab


1era Parte
Departamento de Computacin
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
Taller de Informtica I 1er Cuatrimestre 2016

Andrea Manna
Que es una imagen?
Una imagen es una funcin bidimensional f(x,y), donde x e
y representan las coordenadas espaciales y el valor de f en
cualquier par de coordenadas (x,y) representa la
intensidad de la imagen en dicho punto.
Una imagen digital f[x,y] descrita en un espacio 2D
discreto se deriva de una imagen anloga f(x,y) en un
espacio 2D continuo a travs de un proceso llamado
digitalizacin
Matlab almacena las imgenes como vectores
bidimensionales (matrices), en el que cada elemento de la
matriz corresponde a un slo pixel.

Trabajar con imgenes en Matlab es equivalente a


trabajar con matrices
Ejemplo
Descripcin de una imagen
Al digitalizarla, la imagen
continua en 2D es dividida en
M filas y N columnas
La interseccin de una fila y
una columna se llama pixel.
El valor asignado a las
coordenadas [m,n] con
m= {1,2,...,M} y
n= {1,2,...,N} es f(m,n)
Es comn que una imagen
contenga sub-imagenes
llamadas regiones de inters
(ROI, regions of interest)
Tipos de datos en una imagen
El tipo de dato que contendr una imagen puede ser de varios tipos
(segn el tipo de dato de cada pixel):

double: Doble precisin, nmeros en punto flotante que varan en un


rango aproximado de -10308 a 10308 (8 bytes por elemento)
uint8: Enteros de 8 bits en el rango de [0,255] (1 byte por elemento)
uint16: Enteros de 16 bits en el rango de [0, 65535] (2 bytes por elemento)
uint32: Enteros de 32 bits en el rango de [0, 4294967295] (4 bytes por
elemento)
int8: Enteros de 8 bits en el rango de [-128, 127] (1 byte por elemento)
int16: Enteros de 16 bits en el rango de [-32768, 32767] (2 bytes por
elemento)
int32: Enteros de 32 bits en el rango de [-2147483648,2147483647] (4
bytes por elemento)
logical: Los valores son 0 1 (1 bit por elemento)
Tipos de datos en una imagen
Nosotros trabajaremos con tres tipos principales de imgenes:
Imagen de intensidad es una matriz de datos cuyos valores han sido
escalados para que representen intensidades de una escala de grises. Cuando
los elementos de una imagen de intensidad son de clase uint8 (enteros
almacenados en 8 bits) o de clase uint16 (enteros almacenados en 16 bits),
pueden almacenar, respectivamente, 28=256 valores en el
16
rango [0:255] o 2 =65536 valores en el rango[0:65535]. Si la imagen es de
clase double, los valores son nmeros en punto flotante (que se almacenan
en 32 bits). En este ltimo caso, los valores se toman en el rango de [0:1] por
convencin.
La imagen binaria es una imagen en blanco y negro. Cada pixel tiene asignado
un valor lgico de 0 1 donde 0 representa el negro y 1 el blanco
La imagen en color es como la imagen de intensidad pero tiene tres canales,
es decir, a cada pixel le corresponden tres valores de intensidad (RGB) en
lugar de uno.
Color vs Blanco y Negro
Conversin de un tipo a otro
Cuando realizamos transformaciones matemticas de
imgenes, a menudo necesitamos que la imagen sea de
tipo double. Pero cuando la leemos y almacenamos
ahorramos espacio usando codificacin entera. Podemos
usar las siguientes funciones:
im2uint8: de cualquier tipo a uint8,
im2double: de cualquier tipo a double,
im2bw: de cualquier tipo a logical,
rgb2gray: RGB color a gris, o sea de tres capas a una sola.
Ejemplo: I es de tipo entero y quiero convertirla a double
>>D= im2double(I)
Nota: Se pueden utilizar tambin las
funciones de conversin de tipo, pero
el resultado es diferente
Aplicaciones en Geologa
Aplicaciones en Geologa
Aplicaciones en Geologa
Tipos de archivos de imgenes
GIF (Graphics Interchange Format)
JPEG (Joint Photographic Experts Group)
PNG (Portable Network Graphics)
PNM (Portable Any Map)
PPM - Imgenes en color
PBM - Imagenes binarias
PGM - Imagenes en escala de grises
PAM - General, y no unicamente de imgenes
BMP (Windows Bitmap format)
TIFF (Tag Image File Format)
EPS, TGA, PCX, FITS, DCX - CCITT
Lectura, visualizacin y escritura de
imgenes en Matlab
Para leer una imagen se usa el comando imread:
I= imread(nombre_archivo)
Ejemplo:
I=imread(lena_std.tif);
Si observamos el workspace, vemos la variable I
definida como una matriz de tres dimensiones:
Lectura, visualizacin y escritura de
imgenes en Matlab
Para visualizar una imagen
se usa el comando imshow:
imshow(I)

Donde I es la matriz leda


con el comando anterior.

Ojo!!! Ya no utilizamos el
nombre del archivo. A partir
de ahora nos manejamos
con la matriz donde lemos
la imagen.
Lectura, visualizacin y escritura de
imgenes en Matlab
Como vimos, la variable I tiene 3 dimensiones. Esto es porque la imagen
tomada con el comando imread posee 3 canales. Podemos manipular cada
canal por separado:
J= I(:, : , 1); Esto significa Dame todas las
filas y todas las columnas del canal 1 y guardalo en J
Cuando vamos a visualizar J en el espacio de trabajo, vemos que tiene 2
dimensiones. Esto es porque extrajimos una capa o canal.

>> I=imread('lena_std.tif');
>> subplot(2,2,1)
>> imshow(I)
>> subplot(2,2,2)
>> imshow( I(:,:,1) )
>> subplot(2,2,3)
>> imshow( I(:,:,2) )
>> subplot(2,2,4)
>> imshow( I(:,:,3) )
Lectura, visualizacin y escritura de
imgenes en Matlab
Por que cuando hacemos
>> J= I(:, : , 1)
>>imshow( I(:,:,1) )
la imagen se ve en blanco y negro?
Simplemente porque tomamos un
solo canal de los 3 que tiene la
imagen
Si vemos cada canal por separado lo
que se visualiza son las intensidades
en escala de gris de cada canal (rojo,
verde y azul)
La variable J posee dos dimensiones y por eso se visualiza en
gris!!!
Lectura, visualizacin y escritura de
imgenes en Matlab
Como haramos para ver cada canal en su color?
Lo que debemos hacer es anular los otros canales
asignandoles el valor 0.
Veamos a Lena solo en el canal rojo:
>> T = I; %hago copia de la imagen
>> T(:,:,2) = 0; %Capa verde en cero
>> T(:,:,3) = 0; %Capa azul en cero
>> imshow(T)

La variable T posee tres dimensiones y por eso se visualiza en


color!!!
Lectura, visualizacin y escritura de
imgenes en Matlab
Una vez procesada la imagen, podemos
guardarla en otro archivo. Supongamos que
queremos guardar un trozo de la figura de
Lena. Tenemos que usar el comando:
imwrite(I , nombre_archivo)
Ejemplo:
>> G = I(238:293 , 241:357 , :); % Extraemos una subimagen
>> imshow(G)
>> imwrite(G , trozoLena.png)
Manipulacin de una imagen
Como vimos antes hay muchas opciones una
vez que tenemos la imagen en el workspace:
Hemos visto que podemos extraer una capa
Hemos visto que podemos extraer una
subimagen
Hemos visto que podemos anular (poner en
cero) uno o dos canales
Manipulacin de una imagen
Podemos generar una imagen con Matlab. Para
eso precisamos una matriz:
>> h= zeros( [500,500,3], 'uint8');
Ahora tenemos que darle color. Para eso vamos a
manipular pequeas subimagenes y coloreamos:
>> h(1:250, 1:250, 1)=70;
>> h(1:250, 251:end, 1)=120;
>> h(251:end, 1:250, 1)=230;
>> h(251:end, 251:end, 1)=180;
>> imshow(h)

Solo manipulamos el primer canal!!


Manipulacin de una imagen
Vamos a modificar el resto de los canales con otros colores:

>> h(1:250, 1:250, 2)=220;


>> h(1:250, 251:end, 2)=25;
>> h(251:end, 1:250, 2)=100;
>> h(251:end, 251:end, 2)=50;
>> imshow(h)

Alteramos los colores del canal 2!!


(El canal 3 an est en cero)
Manipulacin de una imagen
Vamos a modificar el ltimo canal:

>> h(1:250,1:250,3)=150;
>> h(1:250,251:end,3)=235;
>> h(251:end,1:250,3)=22;
>> h(251:end,251:end,3)=197;
>> imshow(h)

Alteramos los colores del canal 3!!


Ahora los 3 canales poseen diferentes intensisdades de gris que combinadas
las 3 capas, forman el color de la imagen
Combinacin de colores
Histograma de una imagen
El histograma de una imagen f es una grfica que representa los
niveles de intensidad del color de f con respecto al nmero de
pxeles presentes en f con cada intensidad de color
Puede ayudarnos para controlar la exposicin en nuestras fotos, as
como para corregir los colores.
El eje horizontal representa los diferentes tonos de gris desde el
negro puro (a la izquierda) al blanco puro (a la derecha).
El eje vertical representa el nmero de pixeles que contiene la
imagen para cada tono representado en el eje horizontal.
El histograma nos ayudar a hacernos una idea de cmo es de
correcta la exposicin de una imagen. As, en una fotografa
subexpuesta la grfica tender a desplazarse a la izquierda y en una
fotografa sobreexpuesta tender a desplazarse a la derecha. Una
imagen que contenga todos los tonos de grises tendr un histograma
ms o menos uniforme a lo largo de todo el eje horizontal.
Histograma de una imagen
Propiedades:

La imagen f no se puede deducir a partir de hf


Dos imgenes diferentes pueden tener asociado el
mismo histograma
Los histogramas no contienen informacin espacial
sobre la imagen
Histograma de una imagen
Tonos Apagados: Se trata de una imagen oscura

Sombras o zonas oscuras: Imagen con muchas zonas


oscuras o fondo negro. El histograma tiende a irse a la
izquierda
Histograma de una imagen
Sobreexposicin: La imagen tiene zonas muy claras o quemadas

Sombras plidas: La imagen no posee zonas oscuras, no hay picos


a la izquierda. Tampoco hay zonas quemadas, o sea no hay picos a
derecha. Pero se trata de una imagen clara
Histograma de una imagen
Contraluz: Este histograma posee forma de U. Hay zonas muy claras y otras muy oscuras. Hay
pocas zonas grises

Distribucin homognea: El histograma de una foto homognea se distribuye a lo largo de todo el


eje horizontal. Al no haber zonas quemadas ni excesivamente oscuras no encontraremos picos ni
grandes montaas en la grfica. Es importante saber que el hecho de una distribucin sea
homognea no siempre significa que la imagen est correctamente expuesta. Depender
estrictamente de las caractersticas tonales de la imagen
Histograma de una imagen
El comando Matlab para realizar histograma de una imagen es imhist
Atencin!!: El comando imhist debe usarse solamente con imgenes en
escala de grises.

>>imhist(I) % retorna el grafico del histograma con el eje x dividido en 256 partes
>>imhist(I,n) % retorna el grafico del histograma con el eje x dividido en n partes
>>[counts,x] = imhist(___) % No realiza el grfico, sino que retorna dos vectores:

x= contiene todos los valores de intensidad, desde 0 a 255 o desde 0 a n


(segn el comando hist que se use)
counts= contiene la cantidad de cada valor de intensidad guardado en x
Histograma de una imagen
Ejemplo. Si tomamos la imagen de Lena, podramos visualizar el
histograma de cada uno de sus canales de la siguiente manera:
3500

3000

>>subplot(2,2,1) 2500

2000

>>imshow(I) 1500

1000

>>xlabel ('imagen color') 500

>>subplot(2,2,2) imagen color


0 50
canal rojo
100 150 200 250

>>imhist(I(:,:,1))
3000

>>xlabel ('canal rojo')


3500
2500
3000

2000 2500

>>subplot(2,2,3) 1500 2000

1500

>>imhist(I(:,:,2))
1000
1000
500
500

>>xlabel ('canal verde') 0

0 50
canal verde
100 150 200 250
0

0 50
canal azul
100 150 200 250

>>subplot(2,2,4)
>>imhist(I(:,:,3))
>>xlabel ('canal azul')
Histograma de una imagen
Tomemos el canal 1:
>> I1= I(:,:,1);
>> [counts,x] = imhist(I1) ;
>> x(100:110) >> counts(100:110)
99 1559 4500

100 1418 4000

101 1384 3500


102 1319
3000
103 1342
104 1156 2500

105 1120 2000

106 955 1500


107 969 1000
108 828
500
109 782
>> bar(x,counts) 0
-50 0 50 100 150 200 250 300
Histograma de una imagen
Histograma de la imagen que se construy de
4 colores:

Como debera ser este histograma? Prubelo!!


Histograma de una imagen
Volviendo a la imagen de Lena, veamos el
histograma de la capa 1 (rojo)
3500

3000 Vemos que el histograma se encuentra sesgado


2500
a derecha, esto es, la imagen en la capa roja es
2000

1500
bastante clara. Lo comprobamos:
1000

500

0 50 100 150 200 250


Histograma de una imagen
Es decir que, basndonos en el histograma
podemos observar que la imagen es demasiado
clara Cmo podramos oscurecerla?
>> I2= I(:,:,1);
>> max(max(I2))
255
>> min(min(I2))
54
>> I3 =I2 50;
Qu logramos con esto?
Histograma de una imagen
Capa 1 Original Capa 1 modificada

3500
3500

3000
3000

2500 2500

2000 2000

1500 1500

1000 1000

500 500

0 0

0 50 100 150 200 250 0 50 100 150 200 250


Histograma de una imagen
A veces no es tan fcil emparejar los colores de
una imagen, dada la variedad de valores de
intensidad.
Un histograma ideal es aquel que se extiende
ocupando casi todo el rango de tonos
Para lograr un histograma ideal, se suele utilizar
un comando para ecualizar una imagen
Ecualizar: El objetivo de la ecualizacin es que la
imagen tenga una distribucin uniforme sobre
toda la escala de grises.
Ecualizacin de una imagen
Funcin de probabilidad de ocurrencia de cada nivel de
intensidad :

histograma rk [0,255]
Para ecualizar el histograma se realiza la siguiente operacin:
1) Se obtiene el histograma
2) Calcular los nuevos valores de intensidades utilizando la funcin de probabilidad de
ocurrencia

3) Reemplazar las intensidades


Ecualizacin de una imagen
El comando que se utiliza para ecualizar una imagen es histeq:
J = histeq(I,n) donde
I es la imagen en escala de grises que queremos ecualizar
n es la cantidad de niveles de grises que se quieren utilizar en la
ecualizacion. Por defecto, se usan 256 niveles de grises
Ejemplo: (usando la capa 1 de Lena)
>> J1= histeq(I1)
>> J1= histeq(I1, 128) si se quiere con, por ejemplo, 128 niveles de
grises
Ecualizacin de una imagen
Comparando la imagen de Lena original y la imagen ecualizada queda:

3500
5000
>>J1= histeq(I1)
4500

3000
4000 >>imshow(J1)
>>imhist(J1)
2500 3500

3000
2000
2500

1500 2000

1500
1000
1000

500
500

0 0

0 50 100 150 200 250


0 50 100 150 200 250

La ecualizacin del histograma genera una imagen cuyos niveles de intensidad son
igualmente probables y, adems, cubren todo el rango [0,255]. El resultado neto de este
proceso es una imagen cuyo rango dinmico ha sido incrementado, que tender a
poseer un mayor contraste.
Ecualizacin de una imagen
Veamos otro ejemplo:

5000
5000

4500
4500 >> I=imread('semillas.png');
4000
4000

3500
3500 >> I1=I(:,:,1);
3000

>> imshow(I1)
3000

2500 2500

2000 2000

1500

1000
1500

1000
>> figure,imhist(I1);
500

0
500

0
>> g=histeq(I1,256);
0 50 100 150 200 250
0 50 100 150 200 250 >> figure,imshow(g);
>> figure,imhist(g);
Ejercicios
1. Tome la imagen de Lena e intente extraer la subimagen en color correspondiente
a la boca en la variable BOCA
2. Que tipo de dato obtuvo? double o uint8?
3. Tome el canal 3 de la imagen de Lena. Pasarlo a double utilizando el comando
im2double.
4. Repetir el mismo ejercicio anterior pero en vez de usar la funcin im2double,
utilice la funcin double. Dio el mismo resultado? Chequearlo. En caso
negativo, Cmo puede utilizar la funcin double para lograr el resultado
deseado? Pista: recuerde que im2double es una funcin que transforma
elementos uint8 en elementos double entre 0 y 1.
5. Arme una imagen teniendo en cuenta la siguiente informacin para cada una de
las capas:
C1= rand(300); % Capa 1
C2= rand(300); % Capa 2
C3= rand(300); % Capa 3
6. Muestre el histograma de cada una de las capas de la imagen anterior. Qu
puede deducir? Qu pasa si se realiza la ecualizacin de estas capas?

You might also like