Segmentación

Anuncio
Taller de computación I
Segmentación
1er Cuatrimestre 2015
Andrea Manna
Segmentación
 La segmentación de imágenes divide la imagen en sus partes
constituyentes hasta un nivel de subdivisión en el que se aíslen las
regiones u objetos de interés
Los algoritmos de segmentación se basan en una de estas dos
propiedades básicas entre niveles de gris de pixeles vecinos:
 discontinuidad. Esto permite detectar puntos aislados, líneas y
bordes. Es una construcción de regiones basada en fronteras.
 similitud entre los niveles de gris de píxeles vecinos. Permite
construir regiones por división y fusión.
Segmentación: Discontinuidad
 Se divide la imagen basándose en cambios bruscos de nivel de
gris:
 Detección de puntos aislados
 Detección de líneas
 Detección de bordes
Imagen con discontinuidades
Deteccion de bordes usando Roberts
Segmentación: Similitud
 Se divide la imagen basándose en la búsqueda de zonas que
tengan valores similares, conforme a unos criterios prefijados:
 Crecimiento de región: Parten del centro de un objeto
hacia el exterior tratando de encontrar los bordes que lo
limitan
 Umbralización: Los umbrales actúan como
separadores que permitirán decidir que conjunto de
tonos de gris pertenece a una determinada región.
Segmentación: Crecimiento de región
 Las regiones se forman mediante píxeles que tengan conectividad
y presenten alguna propiedad de similitud y discrepancia respecto al
resto de los píxeles que no pertenecen a la región.
Una técnica se basa en el crecimiento de regiones. Se elige un
píxel semilla de la región a obtener y se le aplica a sus vecinos la
regla de similitud:
 Aquellos píxeles que cumplan se añadirán a la región
creciente. Sobre estos nuevos píxeles añadidos se volverá
aplicar la regla de similitud a sus vecinos. El algoritmo parará
cuando los píxeles vecinos a la región creciente no cumplan el
criterio de similitud. El tema es hallar la semilla adecuada. Una
regla de similitud puede basarse en que la diferencia del nivel
de gris del píxel a estudiar y el brillo de la región creciente sea
menor a un determinado umbral.
Segmentación Multiumbral
Es uno de los más usados:
 Por la forma en que interpreta la segmentación
 Por su sencilla implementación
La idea es separar los objetos del fondo (binarizar), pero también se pueden
utilizar varios umbrales para llevar a cabo una correcta segmentación.
La idea de la segmentación Multiumbral o Multitresholding trata de una
operación de reasignación g de los valores de grises de los pixels v(x,y)
comparados con respecto a un solo valor umbral t, definido como:
El resultado de esto es una imagen binarea, o sea con 2 tonos de
grises
Segmentación Multiumbral
Como elegimos t?
Una respuesta es: trabajamos con el histograma!
Si observamos el histograma
de esta imagen, los lugares
donde hay picos y valles,
son perfectos para establecer
un umbral. El umbral se
establece como el valor que
se encuentra entre dos picos:
T=90;
Segmentación Multiumbral
Hacemos el ejercicio:
>>A=imread('geological01.jpg');
>> A1=A(:,:,1); %Siempre se trabaja en escala de grises
>> imhist(A1)
>> G=A1; %Para no modificar la original
>> G(A1<90)=0;
>> G(A1>=90)=255;
>> imshow(G)
Determinación de umbral
Para tomar un umbral óptimo y binarizar adecuadamente
una imagen, tenemos algunas funciones en Matlab:
>> umbral = graythresh(A) %A es una imagen
umbral =
0.4549
Este comando trabaja en double.
Determinación de umbral
Tomemos la misma imagen anterior y la binarizamos con
el umbral obtenido con graythresh:
>>A=imread('geological01.jpg');
>> A1=A(:,:,1); %Siempre se trabaja en escala de grises
>> G= im2double(A1);
% Ojo porque graythresh trabaja en double!!
>> umbral = graythresh(G);
>> G(A1<=umbral)=0;
>> G(A1>umbral)=1;
>> imshow(G)
Determinación de umbral
Podemos usar mecanismos manuales,
por ejemplo el comando impixel:
>>A=imread('geological01.jpg');
>> A1=A(:,:,1); %Siempre se trabaja en escala de grises
>>imshow(A1)
>>impixel
ans =
156 156 156 % Tomamos este valor como umbral
>> G(A1<156)=0;
>> G(A1>156)=1;
>> imshow(G)
Determinación de umbral
Este umbral se puede utilizar con un comando que permite
binarizar directamente la imagen según el umbral dado:
>>BW=im2bw(A1,umbral);
>>imshow(BW)
Imagen original
Imagen binarizada
Determinación de umbral
A veces se suele usar binarización, por ejemplo para reconocer objetos. Supongamos la
imagen monedas.jpg:
>> A=imread('monedas.jpg');
>> A1=rgb2gray(A);
>> imshow(A1)
>>umbral = graythresh(A1) ;
>>BW=im2bw(A1,umbral);
>>BW=1-BW;
>>imshow(BW)
% otra forma de tomar la imagen en escala de grises
%Retorna el mejor umbral
% Binarizamos y obtenemos una matriz de 1 y 0 (fondo blanco)
% Obtenemos la figura de fondo negro y monedas blancas
Determinación de umbral
Puede ser interesante limpiar el interior de las monedas. Esto lo podemos hacer con el
siguiente comando:
>> fill=imfill(BW,'holes');
>> imshow(fill)
% Limpiamos los “agujeros”
Determinación de umbral
Podemos usar un comando para contar la cantidad de monedas. El siguiente comando
otorga etiquetas a cada objeto identificado:
>> [B,n] = bwlabel(fill,8); %fill es la imagen obtenida con el comando imfill y el nro
8 representa la cantidad de vecinos para determinar objetos conectados. Puede ser 4 ú 8
El resultado es una matriz con 0 en el fondo y luego cada objeto se identifica con un
número a partir de 1 hasta n que es la cantidad de objetos encontrados. Para
visualizarlo, podemos colorear cada objeto:
>> RGB8 = label2rgb(B); % Este comando reemplaza las etiquetas por colores de
modo que podamos visualizar los diferentes objetos en forma independiente
Determinación de umbral
Para ser claros, si se tiene la siguiente
matriz:
BW =
([1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
1
0
0
0
1
0
0
0
0
1
1
1
1
0
0
0
0
0
0
0
0
0]);
Al etiquetar, realizamos:
>> L = bwlabel(BW,4)
L=
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
2
2
0
0
0
0
0
0
2
2
0
0
0
3
0
0
0
0
3
3
3
3
0
0
0
0
0
0
0
0
0
Probar que sucede en L al cambiar el 4 por 8
Determinación de umbral
Para visualizar los diferentes objetos con colores
diferentes utilizamos label2rgb, que en su forma
general tiene los parámetros siguientes:
RGB = label2rgb(L, map, zerocolor, order)
Donde:
L es la matriz de etiquetas
map es el mapa de colores
zerocolor es el color que le asignamos al 0
order puede ser 'shuffle‟ o „noshuffle‟. El primero
es para asignar colores al azar y el segundo para
asignar los colores en orden numérico
Ejemplo:
RGB2 = label2rgb(L, 'spring', 'c');
RGB2 = label2rgb(L, 'gray', „g');
Mapa de colores
los nombres se
usan en
minúscula
Determinación de umbral
RGB2 = label2rgb(L, 'spring', 'c');
RGB2 = label2rgb(L, 'gray', „g');
Dilatación de Imágenes
Permite añadir puntos a un objeto en los pixeles que tocan el borde en una imagen
binaria o escala de grises, aumentando la definición de la imagen
En Matlab, el comando para realizar esta acción se llama imdilate y se precisa un
elemento estructurante
Un elemento estructurante es un subconjunto de puntos, cuya representación en el
plano tiene cierta forma y tamaño (puede ser cualquier figura geométrica). El elemento
estructurante se concibe como un simple parámetro de forma para los filtros
morfológicos. En Matlab el elemento estructurante se genera con el comando:
SE = strel(shape, parameters)
donde:
shape es la forma que puede ser: „ball‟, „line‟, „diamond‟, „octagon‟, „square‟
parameters define la figura geometrica. Por ejemplo, para ball debemos dar un radio,
para square una medida de lado, etc. Ejemplos:
SE = strel('ball', 3, 2) % donde 3 es el radio y 2 la altura
SE = strel('diamond', 4) % donde 4 es la diagonal del diamante
SE = strel('rectangle', [3 5]) % donde [3 5] es la medida de la base y la altura
SE = strel('square', 4) % donde 4 es la medida del lado
Dilatación de Imágenes
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".
Dilatación de Imágenes
Para toda la imagen, queda así:
R=
1
0
0
0
1
0
0
0
1
Dilatación de Imágenes
Para esto, se usa el comando imdilate del siguiente modo:
IM2 = imdilate(IM,SE) donde:
IM es la imagen que se desea dilatar
SE es el elemento estructurante generado con el comando anterior
La dilatación amplía el tamaño de los objetos en la escala del elemento estructurante. La
idea se ve en el siguiente ejemplo:
Dilatación de Imágenes
Aplicando dilatación a una imagen binarizada, utilizando una estructura generada a
partir de una matriz cuadrada de "1" de orden 3.
Dilatación de Imágenes
Ejemplo:
rgb = imread('pears.png');
I = rgb2gray(rgb);
imshow(I)
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(im2double(I), hy, 'replicate');
Ix = imfilter(im2double(I), hx, 'replicate');
gradI = sqrt(Ix.^2 + Iy.^2);
figure, imshow(gradI)
Dilatación de Imágenes
Ejemplo:
se = strel('disk', 20);
Id = imdilate(gradI, se);
imshow(Id)
Erosión de Imágenes
Permite quitar puntos a un objeto en los pixeles que tocan el borde en una imagen binaria o
escala de grises, disminuyendo la definición de la imagen
El comando erode se utiliza del siguiente modo:
IM2 = imerode(IM,SE) donde
IM es la imagen que se desea erosionar
SE es el elemento estructurante (definido igual que antes)
La erosión reduce el tamaño de los objetos, eliminando características según la escala
definida por el elemento
estructurante.
Erosión de Imágenes
Se utiliza el comando:
Result=imerode(Imagen,SE) dónde
SE es la estructura del arreglo a utilizar como rejilla.
Imagen es previamente binarizada.
Erosión de Imágenes
Ejemplo:
originalBW = imread('circles.png');
se = strel('disk',11);
erodedBW = imerode(originalBW,se);
imshow(originalBW), figure, imshow(erodedBW)
Ahora podríamos realizar un conteo de los círculos de la imagen
Conclusion
Con estos conjuntos de comandos proveemos de varias herramientas como para que el
alumno tenga elementos para procesar una imagen, extrayendo bordes, detectando objetos,
etc.
El orden en que se utilicen estas herramienta no garantiza los mismo resultados con
diferentes imágenes
Hay más herramientas y el alumno puede, a través del help o la pagina
http://www.mathworks.com/ ampliar estas herramientas
Ejercicio
Realicemos el mismo ejercicio del crater pero utilizando estas herramientas:
function [area, diameter] = datosCrater(A1)
Sobel=edge(A1,'sobel');
SE = strel('diamond', 4);
dilatedBW = imdilate(Sobel,SE);
fill=imfill(dilatedBW,'holes');
[B,n] = bwlabel(fill,8);
B1=B;
imshow(B) %para poder tomar el label del crater
P= impixel; %P es un vector de 3 elementos
B1(B==P(1))=1;
B1(B~=P(1))=0;
erodeBW=imerode(B1,SE);
figure
imshow(erodeBW)
area=sum(sum(erodeBW));
%diametro
[m,n]=size(erodeBW);
col=erodeBW(:,round(n/2));
dimCol= find(col==1);
diameter=max(dimCol)-min(dimCol);
end
Descargar