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