CAPÍTULO 2. SEGMENTACIÓN DE IMÁGENES SINTÉTICAS
2.2 Herramientas empleadas
Para la implementación de los algoritmos de segmentación y evaluación de los resultados se empleó la herramienta MATLAB y el IPT (Image Processing Toolbox) perteneciente a la misma.
2.2.1 Laboratorio de matrices (MATLAB)
El MATLAB implementa un lenguaje de programación propio orientado a las aplicaciones de ingeniería. Dicho lenguaje maneja los datos en forma de matrices lo cual lo hace muy potente en los cálculos numéricos con vectores y matrices. Como caso particular puede trabajar con números escalares tanto reales como complejos, con cadenas de caracteres y con otras estructuras de información más complejas. Debido a que una imagen digital se
representa como una matriz donde sus elementos son los valores de intensidad de los píxel, este lenguaje resulta ideal para el procesamiento de imágenes y por tanto, para el presente trabajo. El MATLAB dispone de varias librerías especializadas o toolboxs orientados a las distintas aplicaciones, en el trabajo se utiliza fundamentalmente:
Image Processing Toolbox.
2.3 Características de las imágenes sintéticas
Las imágenes sintéticas utilizadas fueron hechas con ayuda de la herramienta MATLAB. Presentan un tamaño de 640x480 píxeles, con una profundidad de 8 bit/pixel para cada canal de color, rojo, verde y azul. Están en formato de mapa de bit (.bmp) y son de color verdadero. Las imágenes presentan eritrocitos y leucocitos, éstos últimos son linfocitos pequeños, cada imagen tiene las máscaras respectivas a los eritrocitos, leucocitos y de la imagen completa. En la figura 2.1a se puede observar una imagen con eritrocitos solamente y en la figura 2.1b una imagen con eritrocitos y leucocitos, [31].
Figura 2.1 Imágenes sintéticas, (a) Imagen con eritrocitos y (b) imagen con eritrocitos y leucocitos.
2.4 Algoritmos de segmentación implementados en MATLAB
A continuación se explican los pasos de los algoritmos que han sido implementados en MATLAB para el proceso de segmentación (algoritmo k-medias, método de Otsu, algoritmo mediante la transformada watershed y el algoritmo por conjuntos de nivel).
(1)
Se numeran como ecuaciones las líneas de programas de la 2.1 a la 2.4 por conveniencia.
2.4.1 Implementación del algoritmo k-medias
El diagrama de una etapa del algoritmo k-medias implementado en MATLAB se muestra en la figura 2.2, la función que se programó en MATLAB con dicho algoritmo se nombra distRGB y su programación se puede ver en el anexo II. Para la implementación del algoritmo se siguieron los siguientes pasos, según aparecen descritos en [1]:
1. Determinar inicialmente el vector del color promedio de la imagen, que se desea segmentar.
2. Obtener a partir del vector del color promedio de la imagen calculado anteriormente, dos nuevos vectores de referencia, sumándole y restándole una perturbación (que es simplemente un pequeño valor, que se tomó igual a 0.1 en este caso) al vector obtenido.
3. Calcular dos matrices de distancias del mismo tamaño que la imagen a segmentar, donde se coloca en cada elemento, la distancia euclidiana entre el píxel analizado y el nuevo vector promedio, determinándose entonces a partir de estas, las regiones de Voronoi correspondientes. Siendo las regiones de Voronoi, los conjuntos de píxeles que presentan la menor distancia con respecto a cada uno de los dos vectores de referencia.
4. Se calculan dos nuevos vectores promedio o centroides para cada una de las regiones de Voronoi, y se determinan nuevamente las distancias de todos los píxeles originales a cada uno de los centroides. De esta forma se obtiene una nueva frontera para las regiones de Voronoi, nuevos centroides y una nueva distancia promedio entre todos los vectores y sus centroides en las respectivas regiones de Voronoi. 5. El algoritmo converge cuando la diferencia entre las distancias promedio globales
obtenidas en iteraciones consecutivas, es menor que cierto umbral T que se definió experimentalmente (0.1 en este caso).
La función distRGB que se muestra en la línea de programa1 2.1. Como parámetro de entrada tiene una imagen en el espacio de color RGB y devuelve a la salida la imagen segmentada y su máscara correspondiente.
[segmcolor,mascaraL]=distRGB(imagen) (2.1)
Figura 2.2 Diagrama de una etapa en el algoritmo Lloyd
2.4.2 Implementación del algoritmo de Otsu
Para la implementación del método de Otsu, utilizando la información relativa a la intensidad, han sido utilizadas las imágenes de intensidad para la aplicación de un algoritmo basado en umbrales. Se utiliza la función segm_Otsu que se muestra en la línea de programa 2.2, ésta tiene como argumento una imagen en escala de grises (con la función rgb2gray), normalizada y de tipo doble (con la función im2double) y devuelve la imagen segmentada, que para este caso ya es la máscara con la que posteriormente se realiza la validación estadística.
Con la función graythresh se determina el umbral global de la imagen de intensidad y con la función im2bw se convierte la imagen a binaria, sobre la base del umbral calculado, todas estas son funciones de MATLAB y su programación se puede observar en el anexo II. [Segm]=segm_Otsu(imagen) (2.2)
2.4.3 Implementación del algoritmo mediante la transformada watershed
Para la implementación del método de segmentación empleando la transformada watershed, se utiliza la función SegmW que se muestra en la línea de programa 2.3, ésta tiene como argumento una imagen en escala de grises (con la función rgb2gray), normalizada y de tipo doble (con la función im2double). La función devuelve la imagen segmentada y la máscara de la misma, para el posterior análisis estadístico.
[ImagSegW, mascaraW] = SegmW(imagen) (2.3) Posteriormente se calcula el gradiente de la imagen en escala de grises utilizando una máscara se Sobel. Luego al gradiente calculado se le halla la transformada watershed, mediante la función watershed del MATLAB. Los resultados no son favorables en este proceso ya que la imagen resultante presenta una excesiva sobresegmentación, con el objetivo de ser eliminado este problema se le imponen mínimos a la imagen en las regiones ocupadas por marcadores internos y externos que son previamente determinados.
Los marcadores internos se calculan mediante la realización de un proceso de erosión a la imagen que fue previamente segmentada por el método de Otsu, empleando un umbral global. Los marcadores externos se calculan hallando la transformada de distancia (con la función bwdist) de la imagen de los marcadores internos, luego se le realiza la transformada watershed a la imagen obtenida de la transformada de distancia. Para la imposición de los marcadores a la imagen del gradiente se hace un OR entre ellos y se utiliza la función imimposemin. Todas estas son funciones de MATLAB y su programación se puede observar en el anexo II.
2.4.4 Implemetación del algoritmo por conjuntos de nivel (Level Sets)
Para la realización de la segmentación mediante conjuntos de nivel se emplea la función drlse_segm que se muestra en la línea de programa 2.4, [32], ésta tiene como argumento una imagen en el espacio de color RGB y devuelve la máscara resultante del proceso de
segmentación. Posteriormente se toma el plano rojo de la imagen y se convierte a doble (con la función double).
drlsmask=drlse_segm(image) (2.4) Mediante la función drlse_edge se realiza el crecimiento de la imagen semilla (conjunto de datos que se define para dar inicio al algoritmo) hasta que alcance el nivel cero, que es el contorno de interés en la imagen y por tanto el resultado de la segmentación. Por último para generar la máscara de la imagen segmentada se crea una matriz de ceros del mismo tamaño de la imagen segmentada. Luego se colocan en uno los valores internos a los contornos de interés y en cero el resto de la imagen, dando como resultado la máscara binaria necesaria. En el anexo II se puede observar la implementación de la función drlse_segm.