tratamiento de imagenes digitales con matlab

Upload: juan-sebastian-pena-leon

Post on 08-Jul-2015

455 views

Category:

Documents


0 download

TRANSCRIPT

PROCESAMIENTO DE IMGENES CON MATLAB1

http://lonely113.blogspot.com

Lectura de Imgenes2

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 TIFF Extensin .tiff

JPEGGIF BMP PNG

.jpg.gif .bmp .png

XWD

.xwd

http://lonely113.blogspot.com

Ejemplo: Lectura de una imagen *.jpg3

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

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

http://lonely113.blogspot.com

Representacin de Imgenes en Matlab4

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=Bhttp://lonely113.blogspot.com

Obtencin de los Planos RGB5

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 Imagen6

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 Imgenes7

Se realiza con el comando:Imshow(Imagen) Dnde: Imagen es del tipo uint8.

>> imshow(Im_RGB)

http://lonely113.blogspot.com

Escritura de Imgenes8

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

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

http://lonely113.blogspot.com

Lectura de Valor de Pixeles9

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 = 10http://lonely113.blogspot.com

Seleccin manual y Lectura de Valor de Pixel10

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 Pixeles11

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 Imagen12

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;

>> imshow(Im_RGB) >> improfile

300

250

200

150

100

50

0

0

50

100

150

200 250 300 Distance along profile

350

400

450

500

http://lonely113.blogspot.com

Submuestreo13

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 - Double15

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

Filtraje17

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

Filtraje18

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 promedio19

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 Mediana21

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 Bordes22

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

Binarizacin24

Conversin de una imagen en escala de grises a una

imagen lgica (0=negro, 1=blanco).

Se realiza con el comando:Imagen_bin=imagen> 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 Dilatacin27

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

Dilatacin28

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

Dilatacin29

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

Erosin31

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

Erosin32

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

Vecindad34

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-4http://lonely113.blogspot.com

Vecindad-8

Conectividad35Dos 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 Imagen36

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 Objeto38

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 Pc40

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 Dispositivo41

Comandos a utilizar:

ImaqhwinfoDevuelve 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 comandos42>> imaqhwinfo ans = InstalledAdaptors: {'winvideo'} MATLABVersion: '7.8 (R2009a)' ToolboxName: 'Image Acquisition Toolbox' ToolboxVersion: '3.3 (R2009a) >> imaqhwinfo('winvideo') ans = AdaptorDllName: [1x81 char] AdaptorDllVersion: '3.3 (R2009a)' AdaptorName: 'winvideo' DeviceIDs: {[1]} DeviceInfo: [1x1 struct]>> imaqhwinfo('winvideo',1) ans = DefaultFormat: 'RGB24_640x480' DeviceFileSupported: 0 DeviceName: 'iLook 300' DeviceID: 1 ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {1x13 cell}

El adaptador instalado es "winvideo". Hay un dispositivo de adquisicin de imgenes instalado (DeviceID). El dispositivo instalado es una webcam "ilook300". Soporta 13 formatos de adquisicin. Formato por defecto: RGB 640x480.

http://lonely113.blogspot.com

Preparacin del Dispositivo43

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 dispositivo44 >> cam=imaqhwinfo('winvideo',1);

>> cam.SupportedFormatsans = 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 - Visualizacin45

Para desplegar la pre-visualizacin de las imgenes a capturar ejecutar el comando: preview(video)

>> preview(video)

http://lonely113.blogspot.com

Captura46

Para capturar una imagen ejecutar:Image=getsnapshot(cam)

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

http://lonely113.blogspot.com

Image Acquisition tool47

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

Aplicaciones48

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 imagen49>> 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 Imagen50

Im_RGB

Im_gray

Im_edge

Im_edge2

http://lonely113.blogspot.com

2. Conteo de Objetos51

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 Objetos52 >> 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= 10http://lonely113.blogspot.com

2. Conteo de Objetos53

Im_RGB

Im_bin

http://lonely113.blogspot.com

2. Conteo de Objetos54

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_bin2http://lonely113.blogspot.com

2. Conteo de Objetos55

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 Caracteres56

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:

OCRhttp://lonely113.blogspot.com

3. Reconocimiento de Caracteres57

>> 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'); >> ocrhttp://lonely113.blogspot.com

3. Reconocimiento de Caracteres58

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 Caracteres59

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 Caracteres60

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