1. PROCESAMIENTO DE
IMÁGENES CON MATLAB
1
http://lonely113.blogspot.com
2. Lectura de Imágenes
2
Mediante el comando:
Imagen=imread(‘nombre.extensión’)
La imagen a leer debe encontrarse en la carpeta de trabajo de
Matlab. Los formatos de imagen soportados por Matlab son:
Formato Extensión
TIFF .tiff
JPEG .jpg
GIF .gif
BMP .bmp
PNG .png
XWD .xwd
http://lonely113.blogspot.com
3. 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
4. Representación de Imágenes 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
5. Obtención 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
6. Tamaño de la Imagen
6
Obtención del tamaño 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
7. Despliegue de Imágenes
7
Se realiza con el comando:
Imshow(Imagen)
Dónde: Imagen es del tipo uint8.
>> imshow(Im_RGB)
http://lonely113.blogspot.com
8. Escritura de Imágenes
8
Con el comando:
imwrite(Imagen,’nombre.extensión’)
>> imwrite(Im_RGB,'imagen.jpg');
http://lonely113.blogspot.com
9. Lectura de Valor de Pixeles
9
Obtención 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).
Dónde: 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
10. Selección 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
11. Edición 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.
Dónde: x es un número 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
12. Perfil de Imagen
12
Mostrar la imagen con el comando: imshow.
Escribir el comando: improfile
Trazar la línea 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
13. Submuestreo
13
Submuestrear una imagen reduce su tamaño 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)
Dónde: a es el factor de muestreo.
Si a=2 la imagen se reduce a la mitad.
http://lonely113.blogspot.com
14. 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
15. Transformación Uint8 - Double
15
En algunos casos es necesario que la imagen a procesar
sea del tipo "double", ya que uint8 admite sólo 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 sólo muestra imágenes del tipo
uint8.
http://lonely113.blogspot.com
16. 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
17. Filtraje
17
Se realiza mediante convolución de matrices.
Dónde: Imagen es la matríz a filtrar.
f es la matríz filtro.
b11,b12,…,bmn son los
elementos de la matríz de salida.
http://lonely113.blogspot.com
18. Filtraje
18
Se puede utilizar el comando:
imagen2=filter2(filter,Imagen);
Dónde: 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
información.
http://lonely113.blogspot.com
20. Ejemplo: Detección de bordes.
20
Se puede realizar similar al caso anterior, definiendo un filtro para detección 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
21. Filtro Mediana
21
Se realiza para atenuar el ruido de una imagen.
Usualmente se aplica a imágenes 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
22. Detección 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
23. Ejemplo:
23
Se realiza la detección de bordes de una imagen utilizando la máscara 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
24. Binarización
24
Conversión de una imagen en escala de grises a una
imagen lógica (0=negro, 1=blanco).
Se realiza con el comando:
Imagen_bin=imagen<=Umbral
Dónde: Umbral es un número entre 0 y 255.
También se puede usar el siguiente comando cuando se
requiere binarizar una imagen RGB directamente.
Imagen_bin=im2bw(Imagen,level)
Dónde: level es el nivel de umbral entre 0 y 1.
http://lonely113.blogspot.com
25. Ejemplo: Método 1.
25
Binarización de una imagen con un umbral de 128.
>> Im_bin=Im_gray>=128
http://lonely113.blogspot.com
27. Erosión y Dilatación
27
Son las operaciones morfológicas más utilizadas.
DILATACIÓN: Adiciona pixeles en las fronteras de la
imagen.
EROSIÓN: Remueve pixeles de las fronteras de la
imagen.
Ambas operaciones se aplican a imágenes binarizadas.
http://lonely113.blogspot.com
28. Dilatación
28
Se utiliza el comando:
Result=imdilate(Imagen,SE)
Dónde: 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
29. Dilatación
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 operación de dilatación 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
30. Ejemplo:
30
Aplicando dilatación 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
31. Erosión
31
Se utiliza el comando:
Result=imerode(Imagen,SE)
Dónde: SE es la estructura del arreglo a utilizar
como rejilla.
Imagen es previamente binarizada.
http://lonely113.blogspot.com
32. Erosión
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 operación de erosión 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
33. Ejemplo:
33
Aplicando la operación de erosión 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
34. 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 también los pixeles vecinos
diagonales.
Vecindad-4 Vecindad-8
http://lonely113.blogspot.com
35. Conectividad
35
Dos pixeles están con la misma etiqueta están conectados si existe un camino del uno al otro a través
de pixeles vecinos con la misma etiqueta.
La conectividad en Matlab puede ser:
Conexión-4: Se toma en cuenta la vecindad-4 para determinar la conectividad de pixeles.
Conexión-8: Se toma en cuenta la vecindad-8 para determinar la conectividad de pixeles.
ETIQUETADO: Agrupación de pixeles con características similares
Si se elige conectividad conexión-4 se
consideraría como dos objetos diferentes,
pero si se elige conectividad conexión-8 se
consideraría como un solo objeto (vecindad
diagonal).
http://lonely113.blogspot.com
36. 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 estén 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 número entero: 1, 2, 3,…:
Im_label=bwlabel(Im_bin,C)
Dónde: C=4 u 8 (Conexión)
5. Para obtener el número de objetos:
n=max(max(Im_label))
http://lonely113.blogspot.com
37. Ejemplo:
37
Se contará el número 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
38. Selección 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)
Dónde: C=4 u 8 (Conexión)
3. Clic en el objeto y Enter.
4. Si se desea, desplegar el objeto seleccionado Im_sel.
http://lonely113.blogspot.com
39. Ejemplo:
39
Se selecciona el objeto inferior derecho y se aísla en la
variable Im_sel.
>> imshow(Im_bin)
>> Im_sel=bwselect(8);
>> imshow(Im_sel)
http://lonely113.blogspot.com
40. Captura de Imágenes Mediante Cámaras
Conectadas a la Pc
40
Resulta de suma utilidad para implementar algoritmos
de visión o adquisición de imágenes 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
41. Obtención de Información del Dispositivo
41
Comandos a utilizar:
Imaqhwinfo
Devuelve la información del hardware y software disponibles, tales como:
Adaptador de video instalado, versión de Matlab, Toolbox (nombre y
versión).
Imaqhwinfo(‘adaptor’)
Donde adaptor es el nombre del adaptador instalado, por lo general
winvideo. Este comando devuelve información relacionada al adaptador.
Imaqhwinfo(‘adaptor’,DeviceID)
Donde DeviceID es el ID del dispositivo a utilizar obtenido con el
comando anterior. Si sólo se cuenta con un dispositivo conectado el
DeviceID será 1. Este comando muestra información del dispositivo
conectado (cámara) .
http://lonely113.blogspot.com
42. 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] adquisición de imágenes
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
adquisición. Formato por
ObjectConstructor: 'videoinput('winvideo', 1)'
SupportedFormats: {1x13 cell}
defecto: RGB 640x480.
http://lonely113.blogspot.com
43. Preparación del Dispositivo
43
Crear la estructura:
cam=imaqhwinfo(‘adaptor’,DeviceID)
Para poder obtener las características 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
44. Ejemplo: Preparación 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
45. Pre - Visualización
45
Para desplegar la pre-visualización de las imágenes a capturar ejecutar el
comando:
preview(video)
>> preview(video)
http://lonely113.blogspot.com
46. Captura
46
Para capturar una imagen ejecutar:
Image=getsnapshot(‘cam’)
>> foto=getsnapshot(video);
>> imshow(foto)
http://lonely113.blogspot.com
47. Image Acquisition tool
47
Facilita el trabajo de realizar la captura de imágenes mediante línea de comandos.
Para acceder a esta herramienta ejecutar:
imaqtool
>> imaqtool
http://lonely113.blogspot.com
48. Aplicaciones
48
Se presentan 3 aplicaciones sencillas del procesamiento de
imágenes:
1. Detección de bordes de una imagen.
2. Cuenta de objetos de características similares
presentes en una imagen.
3. Reconocimiento Óptico de Caracteres (OCR) mediante
un algoritmo implementado por terceros.
En todos los casos las imágenes serán obtenidas mediante
una cámara web.
http://lonely113.blogspot.com
49. 1. Detección 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 imágenes obtenidas paso a paso se muestran en la siguiente
diapositiva.
http://lonely113.blogspot.com
50. 1. Detección de Bordes de una Imagen
50
Im_RGB Im_gray
Im_edge Im_edge2
http://lonely113.blogspot.com
51. 2. Conteo de Objetos
51
Se desea contar el número de transistores en la
imagen.
Para ello se utiliza el etiquetado de objetos, pero el
problema es que si no se realiza tratamiento previo
también se etiquetarán los pines de cada transistor.
Para resolver este problema primero se aplican las
operaciones de erosión (hasta que desaparezcan los
pines y solo quede el cuerpo) y luego dilatación (para
obtener objetos a contar de regular tamaño).
http://lonely113.blogspot.com
53. 2. Conteo de Objetos
53
Im_RGB Im_bin
http://lonely113.blogspot.com
54. 2. Conteo de Objetos
54
La imagen se invierte para
poder seguir con el
procedimiento de tratamiento
de imagen.
Si no se aplica erosión se
etiquetaría cada objeto
aislado, dando como resultado
un número de objetos muy
superior al real.
Im_bin2
http://lonely113.blogspot.com
55. 2. Conteo de Objetos
55
Im_erode Im_dilate
Con estas dos operaciones se obtiene sólo el cuerpo de los transistores en su
tamaño original, los pines ya fueros desechados. La imagen está lista ahora para el
etiquetado y conteo.
http://lonely113.blogspot.com
56. 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 página:
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 mayúsculas en negro y fondo blanco.
Una vez hecho esto ejecutar el comando:
OCR
http://lonely113.blogspot.com
58. 3. Reconocimiento de Caracteres
58
text text_bin
text_bin contiene elementos no deseados (puntos blancos) que podrían perjudicar el proceso
de reconocimiento de caracteres. Estos elementos se eliminan aplicando la operación de
erosión.
http://lonely113.blogspot.com
59. 3. Reconocimiento de Caracteres
59
text_erode text_dilate
Enseguida se aplica la operación de dilatación para contrarrestar el
efecto de la erosión en el texto.
http://lonely113.blogspot.com
60. 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