Está en la página 1de 61

PROCESAMIENTO DE

IMGENES CON MATLAB


1

http://lonely113.blogspot.com
Lectura de Imgenes
2

Mediante el comando:
Imagen=imread(nombre.extensin)
La imagen a leer debe encontrarse en la carpeta de trabajo de
Matlab. Los formatos de imagen soportados por Matlab son:

Formato Extensin
TIFF .tiff
JPEG .jpg
GIF .gif
BMP .bmp
PNG .png
XWD .xwd

http://lonely113.blogspot.com
Ejemplo: Lectura de una imagen *.jpg
3

La imagen "fruta.jpg" se encuentra en el directorio de


trabajo.

>> Im_RGB=imread('fruta.jpg');

http://lonely113.blogspot.com
Representacin de Imgenes en Matlab
4

En Matlab una imagen en formato de color RGB se


representa por tres matrices bidimensionales,
correspondientes a los planos R, G y B.

1=R
2=G
3=B

http://lonely113.blogspot.com
Obtencin de los Planos RGB
5

Para obtener los planos R, G y B se ejecutan los comandos:


Im_R=Imagen(:,:,1)
Im_G=Imagen(:,:,2)
Im_B=Imagen(:,:,3)
Ejemplo:

>> Im_R=Im_RGB(:,:,1);
>> Im_G=Im_RGB(:,:,2);
>> Im_B=Im_RGB(:,:,3);

http://lonely113.blogspot.com
Tamao de la Imagen
6

Obtencin del tamao de Imagen:


>> [m,n,p]=size(Im_RGB)
m=
600
n=
800
p=
3

Im_RGB: 600x800
3 planos (R,G y B)

http://lonely113.blogspot.com
Despliegue de Imgenes
7

Se realiza con el comando:


Imshow(Imagen)

Dnde: Imagen es del tipo uint8.

>> imshow(Im_RGB)

http://lonely113.blogspot.com
Escritura de Imgenes
8

Con el comando:
imwrite(Imagen,nombre.extensin)

>> imwrite(Im_RGB,'imagen.jpg');

http://lonely113.blogspot.com
Lectura de Valor de Pixeles
9

Obtencin de valor de pixel


Imagen(m,n) ; Cuando Imagen est en escala de grises (un solo plano).
Imagen(m,n,p) ; Para imagen RGB. Devuelve el valor del pixel
correspondiente al plano p (1, 2 3).

Dnde: m,n son las coordenadas del pixel.

>> Im_RGB(300,300,1)
ans =
255
>> Im_RGB(300,300,2)
ans =
178
>> Im_RGB(300,300,3)
ans =
10

http://lonely113.blogspot.com
Seleccin manual y Lectura de Valor de
Pixel
10

Mostrar la imagen con el comando imshow.


Escribir el comando: pixel=impixel;
Clic en el pixel y Enter.

>> imshow(Im_RGB)
>> pixel=impixel
pixel =
252 144 115

http://lonely113.blogspot.com
Edicin de Pixeles
11

Para modificar el valor de un pixel:


Imagen(m,n)=x ; Para una imagen en escala de grises.
imagen(m,n,p)=x ; Para una imagen RGB.
Dnde: x es un nmero entero entre 0 y 255 correspondiente a
escala de grises (0=negro y 255=Blanco)

>> Im_RGB(200,750,1)=255;
>> Im_RGB(200,750,2)=255;
>> Im_RGB(200,750,3)=255;

http://lonely113.blogspot.com
Perfil de Imagen
12

Mostrar la imagen con el comando: imshow.


Escribir el comando: improfile
Trazar la lnea para obtener el perfil en la imagen (clic en inicio y clic en final) y Enter.
Si se desea se puede guardar el perfil en una variable. Ejecutando:
perfil=improfile;
300
>> imshow(Im_RGB)
>> improfile 250

200

150

100

50

0
0 50 100 150 200 250 300 350 400 450 500
Distance along profile

http://lonely113.blogspot.com
Submuestreo
13

Submuestrear una imagen reduce su tamao y permite que


el procesamiento posterior de la imagen se agilice.
a11 a12 a13 a14 a15 a16 a17 a18 a1n

Se toman pixeles equidistantes (muestras), dependiendo del


factor elegido, y se desecha el resto de pixeles.

Imagen_ sub=Imagen(1:a:end,1:a:end,1:1:end)

Dnde: a es el factor de muestreo.


Si a=2 la imagen se reduce a la mitad.

http://lonely113.blogspot.com
Ejemplo: Submuestreo de la imagen Im_RGB
por un factor de 4.
14

>> Im_sub=Im_RGB(1:4:end,1:4:end,1:1:end);
>> imshow(Im_sub)

http://lonely113.blogspot.com
Transformacin Uint8 - Double
15

En algunos casos es necesario que la imagen a procesar


sea del tipo "double", ya que uint8 admite slo valores
enteros entre 0 y 255.
Para transformar de uint8 a double y viceversa:

Imagen_double=double(Imagen_uint8)
Imagen_uint8=uint8(Imagen_double)
El comando imshow slo muestra imgenes del tipo
uint8.

http://lonely113.blogspot.com
Ejemplo: Se requiere resaltar el gris en una
imagen por un factor 0.25.
16

>> Im_double=double(Im_RGB);
>> Im_double=Im_double*0.25;
>> Im_uint8=uint8(Im_double);
>> Imshow(Im_uint8)

http://lonely113.blogspot.com
Filtraje
17

Se realiza mediante convolucin de matrices.

Dnde: Imagen es la matrz a filtrar.

f es la matrz filtro.

b11,b12,,bmn son los


elementos de la matrz de salida.

http://lonely113.blogspot.com
Filtraje
18

Se puede utilizar el comando:


imagen2=filter2(filter,Imagen);
Dnde: filter es la matriz filtro.
El comando filter2 no admite uint8, por lo tanto la
imagen a filtrar se debe convertir al tipo double.
El filtraje se debe realizar plano por plano en una
imagen RGB.

Se agrega ruido a una imagen con el comando imnoise.


Revisar los archivos de ayuda de Matlab para mas
informacin.
http://lonely113.blogspot.com
Ejemplo: Filtraje promedio
19

Para eliminar o reducir el ruido de una imagen.


>> foto=imread('fruta.jpg');
>> foto=imnoise(foto,'salt & pepper');
>> foto_R=foto(:,:,1);
>> foto_G=foto(:,:,2);
>> foto_B=foto(:,:,3);
>> filtro=1/9*[1 1 1;1 1 1;1 1 1];
>> foto2_R=filter2(filtro,double(foto_R));
>> foto2_G=filter2(filtro,double(foto_G));
>> foto2_B=filter2(filtro,double(foto_B));
>> foto2(:,:,1)=foto2_R;
>> foto2(:,:,2)=foto2_G;
>> foto2(:,:,3)=foto2_B;
>> imshow(uint8(foto))
>> figure,imshow(uint8(foto2))

http://lonely113.blogspot.com
Ejemplo: Deteccin de bordes.
20

Se puede realizar similar al caso anterior, definiendo un filtro para deteccin de bordes.

La imagen a filtrar debe estar en escala de grises.

Para convertir RGB a escala de grises se utiliza el comando:

Imagen_gray=rgb2gray(Imagen_RGB);

>> filter=[1 2 1;0 0 0;-1 -2 -1];


>> Im_RGB=imread('medusa.jpg');
>> Im_gray=rgb2gray(Im_RGB);
>> Im_edge=filter2(filter,Im_gray);
>> imshow(Im_RGB);
>>figure,imshow(Im_edge);

http://lonely113.blogspot.com
Filtro Mediana
21

Se realiza para atenuar el ruido de una imagen.


Usualmente se aplica a imgenes en escala de grises.
Imagen2=medfilt2(Imagen)

Ejemplo:

>> Im_RGB=imread('fruta.jpg');
>> Im_gray=rgb2gray(Im_RGB);
>> Im_gray=imnoise(Im_gray, 'salt
& pepper');
>> imshow(Im_gray)
>> Im_filt=medfilt2(Im_gray);
>> figure, imshow(Im_filt)

http://lonely113.blogspot.com
Deteccin de Bordes
22

Se realiza con el comando:

imagen_edge=edge(imagen_gray,mascara);
Se requiere que la imagen est en escala de grises.

mascara es el tipo de mascara a utilizar (sobel,


canny,prewit, ) ya predefinidas en Matlab.

http://lonely113.blogspot.com
Ejemplo:
23

Se realiza la deteccin de bordes de una imagen utilizando la mscara de


"sobel".
>> Im_RGB=imread('Penguins.jpg');
>> Im_gray=rgb2gray(Im_RGB);
>> Im_edge=edge(Im_gray,'sobel');
>> imshow(Im_edge)

http://lonely113.blogspot.com
Binarizacin
24

Conversin de una imagen en escala de grises a una


imagen lgica (0=negro, 1=blanco).
Se realiza con el comando:
Imagen_bin=imagen<=Umbral

Dnde: Umbral es un nmero entre 0 y 255.

Tambin se puede usar el siguiente comando cuando se


requiere binarizar una imagen RGB directamente.
Imagen_bin=im2bw(Imagen,level)
Dnde: level es el nivel de umbral entre 0 y 1.

http://lonely113.blogspot.com
Ejemplo: Mtodo 1.
25

Binarizacin de una imagen con un umbral de 128.

>> Im_bin=Im_gray>=128

http://lonely113.blogspot.com
Ejemplo: Mtodo 2.
26

>> Im_bin=im2bw(Im_RGB,0.5)

http://lonely113.blogspot.com
Erosin y Dilatacin
27

Son las operaciones morfolgicas ms utilizadas.

DILATACIN: Adiciona pixeles en las fronteras de la


imagen.

EROSIN: Remueve pixeles de las fronteras de la


imagen.

Ambas operaciones se aplican a imgenes binarizadas.

http://lonely113.blogspot.com
Dilatacin
28

Se utiliza el comando:
Result=imdilate(Imagen,SE)
Dnde: SE es la estructura del arreglo a utilizar como
rejilla.
Imagen es previamente binarizada.
Existen varias maneras de obtener una estructura SE.
Se realiza mediante el comando "strel". Revisar los
archivos de ayuda de Matlab.

http://lonely113.blogspot.com
Dilatacin
29

Suponiendo que se utiliza una matriz identidad de orden 3 como rejilla (mostrada con
bordes resaltados en la imagen), el resultado de aplicar la operacin de dilatacin en el
pixel que se traslapa con el elemento central de la rejilla es:

"Si alguno de los pixeles de la rejilla configurados como 1 coincide con al menos uno de
la imagen el pixel resultante es 1".

http://lonely113.blogspot.com
Ejemplo:
30

Aplicando dilatacin a una imagen binarizada, utilizando una


estructura generada a partir de una matriz cuadrada de "1" de
orden 30.

>> SE=strel('square',30);
>> Im_RGB=imread('imagen.jpg');
>> Im_gray=rgb2gray(Im_RGB);
>> Im_edge=edge(Im_gray,'sobel');
>> Im_dilate=imdilate(Im_edge,se);
>> imshow(Im_edge);
>> figure,imshow(Im_dilate)

http://lonely113.blogspot.com
Erosin
31

Se utiliza el comando:

Result=imerode(Imagen,SE)

Dnde: SE es la estructura del arreglo a utilizar


como rejilla.
Imagen es previamente binarizada.

http://lonely113.blogspot.com
Erosin
32

Suponiendo que se utiliza una matriz identidad de orden 3 como rejilla (mostrada con
bordes resaltados en la imagen), el resultado de aplicar la operacin de erosin en el
pixel que se traslapa con el elemento central de la rejilla es:

"Todos los pixeles de la rejilla configurados como 1 deben coincidir con todos los de la
imagen, si esto no sucede el resultado del pixel es 0".

http://lonely113.blogspot.com
Ejemplo:
33

Aplicando la operacin de erosin a la imagen dilatada utilizando una


estructura generada por una matriz cuadrada de "1" de orden 15.

>> SE=strel('square',15);
>> Im_erode=imerode(Im_dilate,SE);
>> imshow(Im_dilate)
>> figure,imshow(Im_erode)

http://lonely113.blogspot.com
Vecindad
34

Para determinar si dos pixeles son vecinos o no (adyacentes).


Vecindad-4: Se consideran pixeles conectados en direcciones
perpendiculares (arriba, abajo, derecha, izquierda).
Vecindad-8: Se consideran tambin los pixeles vecinos
diagonales.

Vecindad-4 Vecindad-8

http://lonely113.blogspot.com
Conectividad
35

Dos pixeles estn con la misma etiqueta estn conectados si existe un camino del uno al otro a travs
de pixeles vecinos con la misma etiqueta.
La conectividad en Matlab puede ser:
Conexin-4: Se toma en cuenta la vecindad-4 para determinar la conectividad de pixeles.
Conexin-8: Se toma en cuenta la vecindad-8 para determinar la conectividad de pixeles.
ETIQUETADO: Agrupacin de pixeles con caractersticas similares

Si se elige conectividad conexin-4 se


considerara como dos objetos diferentes,
pero si se elige conectividad conexin-8 se
considerara como un solo objeto (vecindad
diagonal).

http://lonely113.blogspot.com
Cuenta y Etiquetado de Objetos en una
Imagen
36

Para contar la cantidad de objetos presentes en una imagen se realiza el procedimiento:


1. Leer la imagen.
2. Convertirla a escala de grises y posteriormente binarizarla.
3. En la imagen binarizada se requiere que los objetos a contar estn en blanco (1) y con
fondo negro (0), si no fuera as se puede aplicar el comando:
Im_bin=not(Im_bin)

4. Ejecutar el siguiente comando para etiquetar los objetos. Cada objeto encontrado se
etiqueta con un nmero entero: 1, 2, 3,:
Im_label=bwlabel(Im_bin,C)

Dnde: C=4 u 8 (Conexin)


5. Para obtener el nmero de objetos:
n=max(max(Im_label))

http://lonely113.blogspot.com
Ejemplo:
37

Se contar el nmero de objetos de la siguiente imagen:

>> Im_RGB=imread('imagen.jpg');
>> Im_bin=im2bw(Im_RGB,0.5)
>>imshow(Im_bin)
>> Im_bin=not(Im_bin);
>> imshow(Im_bin)
>> Im_label=bwlabel(Im_bin,8);
>> n=max(max(Im_label))
n=
5

http://lonely113.blogspot.com
Seleccin de un Objeto
38

Para seleccionar manualmente un objeto y aislarlo se realiza


el procedimiento:
1. Mostrar la imagen binarizada con el comando imshow.
2. ejecutar el comando:
Im_sel=bwselect(C)
Dnde: C=4 u 8 (Conexin)
3. Clic en el objeto y Enter.
4. Si se desea, desplegar el objeto seleccionado Im_sel.

http://lonely113.blogspot.com
Ejemplo:
39

Se selecciona el objeto inferior derecho y se asla en la


variable Im_sel.

>> imshow(Im_bin)
>> Im_sel=bwselect(8);
>> imshow(Im_sel)

http://lonely113.blogspot.com
Captura de Imgenes Mediante Cmaras
Conectadas a la Pc
40

Resulta de suma utilidad para implementar algoritmos


de visin o adquisicin de imgenes en tiempo real
utilizando dispositivos simples y de bajo costo tales
como las webcams.

Matlab incluye el toolbox "Image Acquisition" para


este fin.

El toolbox incluye la herramienta Image Aquisition tool


"imaqtool" que se utilizar posteriormente.

http://lonely113.blogspot.com
Obtencin de Informacin del Dispositivo
41

Comandos a utilizar:
Imaqhwinfo
Devuelve la informacin del hardware y software disponibles, tales como:
Adaptador de video instalado, versin de Matlab, Toolbox (nombre y
versin).
Imaqhwinfo(adaptor)
Donde adaptor es el nombre del adaptador instalado, por lo general
winvideo. Este comando devuelve informacin relacionada al adaptador.
Imaqhwinfo(adaptor,DeviceID)
Donde DeviceID es el ID del dispositivo a utilizar obtenido con el
comando anterior. Si slo se cuenta con un dispositivo conectado el
DeviceID ser 1. Este comando muestra informacin del dispositivo
conectado (cmara) .

http://lonely113.blogspot.com
Ejemplo: Ejecutando los comandos
42

>> imaqhwinfo
ans =
InstalledAdaptors: {'winvideo'}
El adaptador instalado es
MATLABVersion: '7.8 (R2009a)' "winvideo".
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '3.3 (R2009a)

>> imaqhwinfo('winvideo') Hay un dispositivo de


ans =
AdaptorDllName: [1x81 char] adquisicin de imgenes
AdaptorDllVersion: '3.3 (R2009a)'
AdaptorName: 'winvideo'
instalado (DeviceID).
DeviceIDs: {[1]}
DeviceInfo: [1x1 struct]

>> imaqhwinfo('winvideo',1)
El dispositivo instalado es
ans =
DefaultFormat: 'RGB24_640x480'
una webcam "ilook300".
DeviceFileSupported: 0 Soporta 13 formatos de
DeviceName: 'iLook 300'
DeviceID: 1
adquisicin. Formato por
ObjectConstructor: 'videoinput('winvideo', 1)'
SupportedFormats: {1x13 cell}
defecto: RGB 640x480.

http://lonely113.blogspot.com
Preparacin del Dispositivo
43

Crear la estructura:

cam=imaqhwinfo(adaptor,DeviceID)
Para poder obtener las caractersticas del dispositivo con facilidad.
Por ejemplo, para obtener los formatos soportados:
cam.SupportedFormats
Ejecutar el comando:

video=videoinput(adaptor,DeviceID,Format)
Construye un objeto de entrada de video (nexo entre el dispositivo y
Matlab). Si no se especifica Format se asume el formato por defecto.

http://lonely113.blogspot.com
Ejemplo: Preparacin de dispositivo
44

>> cam=imaqhwinfo('winvideo',1);

>> cam.SupportedFormats

ans =
Columns 1 through 4
'I420_160x120' 'I420_176x144' 'I420_320x240' 'I420_352x288'
Columns 5 through 8
'I420_640x480' 'RGB24_1280x960' 'RGB24_1600x1200'
'RGB24_160x120'
Columns 9 through 12
'RGB24_176x144' 'RGB24_320x240' 'RGB24_352x288'
'RGB24_640x480'
Column 13
'RGB24_800x600'

>> video=videoinput('winvideo',1,'RGB24_640x480');

http://lonely113.blogspot.com
Pre - Visualizacin
45

Para desplegar la pre-visualizacin de las imgenes a capturar ejecutar el


comando:
preview(video)

>> preview(video)

http://lonely113.blogspot.com
Captura
46

Para capturar una imagen ejecutar:


Image=getsnapshot(cam)

>> foto=getsnapshot(video);
>> imshow(foto)

http://lonely113.blogspot.com
Image Acquisition tool
47

Facilita el trabajo de realizar la captura de imgenes mediante lnea de comandos.


Para acceder a esta herramienta ejecutar:
imaqtool

>> imaqtool

http://lonely113.blogspot.com
Aplicaciones
48

Se presentan 3 aplicaciones sencillas del procesamiento de


imgenes:

1. Deteccin de bordes de una imagen.


2. Cuenta de objetos de caractersticas similares
presentes en una imagen.
3. Reconocimiento ptico de Caracteres (OCR) mediante
un algoritmo implementado por terceros.

En todos los casos las imgenes sern obtenidas mediante


una cmara web.

http://lonely113.blogspot.com
1. Deteccin de bordes de una imagen
49

>> cam=imaqhwinfo(winvideo,1);
>> video=videoinput('winvideo',1);
>> preview(video)
>> Im_RGB=getsnapshot(video);
>> imshow(Im_RGB)
>> Im_gray=rgb2gray(Im_RGB);
>> Im_gray=medfilt2(Im_gray);
>> figure,imshow(Im_gray)
>> Im_edge=edge(Im_gray,'sobel');
>> figure,imshow(Im_edge)
>>Im_edge2=not(Im_edge);
>> figure,imshow(Im_edge2)

No se especifica formato de captura, entonces se asume el formato por


defecto (RGB 640x480).

Las imgenes obtenidas paso a paso se muestran en la siguiente


diapositiva.
http://lonely113.blogspot.com
1. Deteccin de Bordes de una Imagen
50

Im_RGB Im_gray

Im_edge Im_edge2

http://lonely113.blogspot.com
2. Conteo de Objetos
51

Se desea contar el nmero de transistores en la


imagen.

Para ello se utiliza el etiquetado de objetos, pero el


problema es que si no se realiza tratamiento previo
tambin se etiquetarn los pines de cada transistor.

Para resolver este problema primero se aplican las


operaciones de erosin (hasta que desaparezcan los
pines y solo quede el cuerpo) y luego dilatacin (para
obtener objetos a contar de regular tamao).

http://lonely113.blogspot.com
2. Conteo de Objetos
52

>> cam=imaqhwinfo(winvideo,1);
>> video=videoinput(winvideo,1);
>> Im_RGB=getsnapshot(video);
>> imshow(Im_RGB)
>> Im_bin=im2bw(Im_RGB,0.5);
>> figure, imshow(Im_bin)
>> Im_bin2=not(Im_bin);
>> figure, imshow(Im_bin2)
>> SE=strel('square',10);
>> Im_erode=imerode(Im_bin2,SE);
>> figure, imshow(Im_erode)
>> Im_dilate=imdilate(Im_erode,SE);
>> figure,imshow(Im_dilate)
>> Im_label=bwlabel(Im_dilate,8);
>> n=max(max(Im_label))
n=
10

http://lonely113.blogspot.com
2. Conteo de Objetos
53

Im_RGB Im_bin

http://lonely113.blogspot.com
2. Conteo de Objetos
54

La imagen se invierte para


poder seguir con el
procedimiento de tratamiento
de imagen.

Si no se aplica erosin se
etiquetara cada objeto
aislado, dando como resultado
un nmero de objetos muy
superior al real.

Im_bin2

http://lonely113.blogspot.com
2. Conteo de Objetos
55

Im_erode Im_dilate
Con estas dos operaciones se obtiene slo el cuerpo de los transistores en su
tamao original, los pines ya fueros desechados. La imagen est lista ahora para el
etiquetado y conteo.

http://lonely113.blogspot.com
3. Reconocimiento de Caracteres
56

Se desea reconocer los caracteres presentes en una imagen


adquirida mediante la webcam y almacenar el texto en un archivo
.txt.
El algoritmo OCR utilizar se obtuvo de la pgina:
http://www.matpic.com/esp/matlab/ocr.html.
Para usar el algoritmo los archivos a descargados se deben copiar
a la carpeta de trabajo de Matlab.
La imagen se debe guardar con el nombre "TEST_1.jpg". Los
caracteres deben estar en maysculas en negro y fondo blanco.
Una vez hecho esto ejecutar el comando:

OCR

http://lonely113.blogspot.com
3. Reconocimiento de Caracteres
57

>> cam=imaqhwinfo('winvideo',1);
>> video=videoinput('winvideo',1);
>> preview(video)
>> text=getsnapshot(video);
>> imshow(text)
>> text_bin=im2bw(text,0.5);
>> figure,imshow(text_bin)
>> SE=strel('square',5);
>> text_erode=imerode(text_bin,SE);
>> figure,imshow(text_erode)
>> text_dilate=imdilate(text_erode,SE);
>> figure,imshow(text_dilate)
>> text_fin=not(text_dilate);
>> figure,imshow(text_fin)
>> imwrite(text_fin,'TEST_1.jpg');
>> ocr

http://lonely113.blogspot.com
3. Reconocimiento de Caracteres
58

text text_bin
text_bin contiene elementos no deseados (puntos blancos) que podran perjudicar el proceso
de reconocimiento de caracteres. Estos elementos se eliminan aplicando la operacin de
erosin.

http://lonely113.blogspot.com
3. Reconocimiento de Caracteres
59

text_erode text_dilate

Enseguida se aplica la operacin de dilatacin para contrarrestar el


efecto de la erosin en el texto.
http://lonely113.blogspot.com
3. Reconocimiento de Caracteres
60

text_fin

Es necesario que el texto est en negro con fondo blanco para


aplicar el algoritmo.

http://lonely113.blogspot.com
http://lonely113.blogspot.com 61

También podría gustarte