Está en la página 1de 7

LABORATORIO 12

SEGMENTACIÓN DE IMÁGENES

1. Marco teórico
La segmentación de imágenes pretende encontrar particiones en una imagen tal que se pueda
separar aquellas regiones homogéneas que tengan significado para el analista de las regiones del
fondo de la imagen. Se supone que las regiones homogéneas son objetos perceptualmente
significativos y los bordes sus límites.

Por ejemplo en la siguientes figuras se pretende extraer la sección de la imagen que corresponde
a las caras de las personas, haciendo uso solamente de criterios relacionados al nivel de gris, es
posible eliminar las regiones blancas y negras, pero no es posible distinguir entre el nivel de gris
de las caras y el nivel de gris de la vestimenta.

2. Objetivo
1. Desarrollar un procedimiento para binarizar una imagen en la región del fondo y la región de
interés basado únicamente en el nivel de gris.
2. Segmentar las regiones conectadas en V4.
3. Presentar las regiones una ventana.

3. Requerimientos:
Use la imagen adjunta tomada con una cámara web
de regiones oscuras sobre un fondo blanco.

En caso de tomar imágenes blancas sobre fondo


oscuro debe de modificar la sección de programa
donde se complementa la imagen (ver la función ~)

4. Se solicita
Luego de terminar el desarrollo de este laboratorio modifique el programa para grabar cada una
de las sub-imágenes extraídas en archivos separados para su posterior procesamiento.
5. Procedimiento de solución.

El procedimiento a seguir se presenta en la siguiente figura:

El programa principal es el siguiente:

I = imread('muestra02.jpg'); % lee la imagen


G = rgb2gray(I); % convierte a gris
level = graythresh(G); % calcula el umbral
B = im2bw(G, level); % binariza

B = ~B; % complementa la imagen

L = bwlabel(B); % etiqueta la imagen


R = label2rgb(L); % convierte la imagen etiquetada en RGB
% se usa solo para visualizar regiones

C = bwlabel2img(L, 0, 1); % copia cada región a una estructura

plotimg(C); % plotea la estructura de imágenes


a) Lee la imagen
Use el siguiente procedimiento
I = imread('muestra02.jpg'); % lee la imagen

b) Convierte a gris
G = rgb2gray(I); % convierte a gris

c) Calcula el umbral de binarización


level = graythresh(G); % calcula el umbral

El histograma de la imagen presenta claramente 2500

dos picos (regiones) que se pueden categorizar


como: 2000

a) Las regiones oscuras (primer pico 1500


aproximadamente gris = 55)
b) El fondo de la imagen (segundo pico 1000
aproximadamente gris = 225)
500

El umbral de binarización calculado por la


función es 145 (0.5765) que corresponde a la 0

0 50 100 150 200 250

región plana del histograma.

d) Binarización de la imagen.
B = im2bw(G, level); % binariza

Imagen en escala de grises Imagen binarizada


e) Complemento de la imagen.
B = ~B; % complementa la imagen

Aplique este procedimiento solo si es necesario.


Se requiere que las regiones de interés correspondan a las regiones blancas de la imagen, si
no es así debe de complementar la imagen.

f) Etiquetado de regiones
L = bwlabel(B); % etiqueta la imagen

El procedimiento de etiquetado de regiones asigna una etiqueta a todos los pixeles que se
encuentren en una vecindad V4 o V8

La vecindad V4 de un La vecindad V8 de un pixel


pixel considera los cuatro considera todos los pixeles
pixeles de arriba, abajo, de alrededor (8 pixeles)
izquierda y derecha.

Las siguiente figuras presentan el resultado del proceso de etiqueta de regiones para la
imagen binaria indicada.

0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
0 1 1 0 0 1 0 2 0 3 0 0 3 0 1 1 0 0 1 0 1 0 3 0 0 3
0 0 1 0 0 1 0 2 0 3 0 0 3 0 0 1 0 0 1 0 1 0 3 0 0 3
0 1 1 0 0 1 0 0 0 3 0 0 3 0 1 1 0 0 1 0 0 0 3 0 0 3
0 0 1 0 0 1 0 0 0 3 3 3 3 0 0 1 0 0 1 0 0 0 3 3 3 3
0 0 1 1 1 1 0 0 0 0 0 0 3 0 0 1 1 1 1 0 0 0 0 0 0 3
0 4 0 0 0 0 5 0 0 0 0 0 3 0 1 0 0 0 0 1 0 0 0 0 0 3
0 0 0 0 0 0 0 6 0 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 3
0 7 0 0 0 0 0 0 8 0 0 0 3 0 2 0 0 0 0 0 0 1 0 0 0 3
0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
V
Imagen binaria 4 V8

Observe que en V4, se generan mayor cantidad de regiones (en este caso son 9) que en V8
(en este caso son 3).

Obtenga la matriz de la imagen etiquetada visualizando la variable L.


g) Convierte a RGB
R = label2rgb(L); % convierte la imagen etiquetada en RGB
% se usa solo para visualizar regiones

Esta función no aporta en el trabajo y su única


finalidad es presentar visualmente el resultado de la
función de etiquetado de regiones.

h) Genera estructura de imágenes


C = bwlabel2img(L, 0, 1); % copia cada región a una estructura

Esta función no es del matlab y ha sido desarrollada para administrar cada segmento de la
imagen original como una imagen separada.

function I = bwlabel2img(L, umbralsize, zeros)


imgs = 0;
for i = 1:max(max(L)) [R,
C] = find(L==i);
if length(R) < umbralsize; continue;
end; imgs = imgs + 1;
I(i).I = bwlabelextract(L, R, C);
if zeros == 1; I(i).I = setperimeter(I(i).I);end;
end

La función recibe tres parámetros:


La imagen etiquetada (L)
El tamaño mínimo de imagen para ser considerada: (umbralzise)
Una bandera (zeros) para indicar si se desea adicionar un perímetro de pixeles con
valores cero a la sub-imagen extraída.

La función ejecuta los siguientes pasos:


Calcula el número de regiones desde el máximo valor de etiqueta de la imagen:
[max(max(L))].
Entra en un bucle desde i = 1 hasta el i = número de regiones, en cada iteración
del bucle extrae una región de la siguiente forma:
o Identifica la fila (R) y columna (C) de cada uno de los pixeles correspondientes a la
región dada por el valor de i. R y C son dos vectores columna.
o Verifica si el número de pixeles en blanco de la región a extraer (length(R)) es
menor que el umbral de tamaño (umbralzise), si es cierto esta región es
descartada.
o Aplica la función bwlabelextract para extraer la región requerida. Verifique que la
región extraída solo contenga la región de interés y no otras regiones.
o Coloca el perímetro de zeros, solo si es solicitado.
Por ejemplo para la imagen etiquetada: 0 0 0 0 0 0 2 2 0 0 0 0 0
0 1 1 0 0 1 0 2 0 3 0 0 3
La función calcula: número de regiones = 9 0 0 1 0 0 1 0 2 0 3 0 0 3
0 1 1 0 0 1 0 0 0 3 0 0 3
Y presenta los siguientes resultados en el caso de la 0 0 1 0 0 1 0 0 0 3 3 3 3
primera región (1): 0 0 1 1 1 1 0 0 0 0 0 0 3
0 4 0 0 0 0 5 0 0 0 0 0 3
0 0 0 0 0 0 0 6 0 0 0 0 3
0 7 0 0 0 0 0 0 8 0 0 0 3
0 0 0 0 0 0 0 0 0 9 0 0 0

R C bwlabelextract(L, R, C); setperimeter(I(i).I);


2 2 1 1 0 0 1 0 0 0 0 0 0 0
4 2 0 1 0 0 1 0 1 1 0 0 1 0
2 3 1 1 0 0 1 0 0 1 0 0 1 0
3 3 0 1 0 0 1 0 1 1 0 0 1 0
4 3 0 1 1 1 1 0 0 1 0 0 1 0
5 3 0 0 1 1 1 1 0
6 3 0 0 0 0 0 0 0
6 4
6 5
2 6
3 6
4 6
5 6
6 6

La función bwlabelextract(L, R, C) permite extraer desde la imagen etiqueta L aquellos


pixeles cuyas filas y columnas corresponden a R y C.

function I = bwlabelextract(L, R, C)
I = [];
mR = min(R); mC = min(C);

for i = 1:length(R)
Rn = R(i)- mR + 1;
Cn = C(i) -mC +
1; I(Rn, Cn) = 1;
end

La función setperimeter adiciona una dos filas (antes de la primera y luego de la última) y
dos columnas (antes de la primera y luego de la última) con valores igual a cero.

function B = setperimeter(B)
[rows, cols] = size(B);

B = [zeros(1,cols); B; zeros(1,cols)];
B = [zeros(rows + 2, 1) B zeros(rows + 2, 1)];
i) Plotea la estructura de imágenes
plotimg(C); % plotea la estructura de imágenes

Esta función permite visualizar el una sola ventana todas las imágenes extraídas en el proceso
de segmentación.

Observe que las imágenes son extraídas en una estructura de datos de tipo matricial: I(i).I

function plotimg(C)

len = length(C);

rowsplot = floor(sqrt(len));
colsplot = ceil (len/rowsplot);

for l = 1:len
subplot(rowsplot, colsplot, l), imshow(C(l).I);
end

También podría gustarte