Segmentación de imágenes mediante el algoritmo de...

20
Segmentación de imágenes mediante el algoritmo de k-medias J.M. Lopez Vera y F. Luna Perejon Resumen Realización de un método de segmentación de imágenes basándose en el algoritmo de K- medias. Se pretende realizar un estudio de su funcionamiento, eficacia, análisis de fortalezas y, en definitiva, comprobar si este método es válido como primer paso para el tratamiento de imágenes. El entorno donde aplicaremos el algoritmo es en un proyecto cuya finalidad final será diferenciar la silueta del fondo de la imagen. Las imágenes concretamente serán de peces. Nos basaremos en el artículo de Hong Yao, Qingling Duan, Daoliang Li y Jianping Wang "An improved K-means clustering algorithm for fish image segmentation"[1] Key words: K-medias, segmentación, rendimiento, imagen. 1. Introducción La segmentación es uno de los procesos más importantes en el procesamiento de imágenes. Comprende la fase inicial en el análisis de las imágenes y se encarga, en esencia, de descomponer la imagen tal que los datos de interés queden bien distinguidos del resto de información irrelevante. Es por ello que la eficacia del método empleado para tal proceso es vital para que los resultados finales, fruto del procesamiento completo de la imagen, sean correctos. Lamentablemente, esta tarea no es trivial en muchos casos, dependiendo de las características de la imagen a analizar y de las zonas o elementos de interés que se pretenden estudiar en dicha imagen. La segmentación de imagen debe ser apta para detectar ese tipo de elementos y obtener resultados de cierta calidad. Es por ello que existen varios métodos a aplicar para la realización de esta fase tan importante en el procesamiento de imágenes, cada uno más efectivo que otro en ciertas situaciones y con objetivos distintos. Es más, con el tiempo van surgiendo nuevos métodos cuyos resultados compiten con los obtenidos por otras técnicas ya inventadas, ya sea en la calidad de los resultados como en el tiempo para obtenerlos. Nuestro proyecto trata de estudiar el algoritmo de K-medias en la segmentación de imágenes, concretamente en imágenes de peces con el objetivo de diferenciarlos del fondo. Estudiaremos este método para mostrar su funcionamiento y evaluaremos resultados fruto de su aplicación en imágenes. 3. Planteamiento teórico 3.1. Conocimiento previo 3.1.1. Clustering algorithm[2][4]

Transcript of Segmentación de imágenes mediante el algoritmo de...

Page 1: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Segmentación de imágenes mediante el

algoritmo de k-medias

J.M. Lopez Vera y F. Luna Perejon

Resumen

Realización de un método de segmentación de imágenes basándose en el algoritmo de K-

medias. Se pretende realizar un estudio de su funcionamiento, eficacia, análisis de fortalezas y, en definitiva, comprobar si este método es válido como primer paso para el tratamiento de imágenes. El entorno donde aplicaremos el algoritmo es en un proyecto cuya finalidad final será diferenciar la silueta del fondo de la imagen. Las imágenes concretamente serán de peces. Nos basaremos en el artículo de Hong Yao, Qingling Duan, Daoliang Li y Jianping Wang "An improved K-means clustering algorithm for fish image segmentation"[1]

Key words: K-medias, segmentación, rendimiento, imagen.

1. Introducción

La segmentación es uno de los procesos más importantes en el procesamiento de

imágenes. Comprende la fase inicial en el análisis de las imágenes y se encarga, en

esencia, de descomponer la imagen tal que los datos de interés queden bien distinguidos

del resto de información irrelevante. Es por ello que la eficacia del método empleado

para tal proceso es vital para que los resultados finales, fruto del procesamiento

completo de la imagen, sean correctos.

Lamentablemente, esta tarea no es trivial en muchos casos, dependiendo de las

características de la imagen a analizar y de las zonas o elementos de interés que se

pretenden estudiar en dicha imagen. La segmentación de imagen debe ser apta para

detectar ese tipo de elementos y obtener resultados de cierta calidad.

Es por ello que existen varios métodos a aplicar para la realización de esta fase tan

importante en el procesamiento de imágenes, cada uno más efectivo que otro en ciertas

situaciones y con objetivos distintos. Es más, con el tiempo van surgiendo nuevos

métodos cuyos resultados compiten con los obtenidos por otras técnicas ya inventadas,

ya sea en la calidad de los resultados como en el tiempo para obtenerlos.

Nuestro proyecto trata de estudiar el algoritmo de K-medias en la segmentación de

imágenes, concretamente en imágenes de peces con el objetivo de diferenciarlos del

fondo. Estudiaremos este método para mostrar su funcionamiento y evaluaremos

resultados fruto de su aplicación en imágenes.

3. Planteamiento teórico

3.1. Conocimiento previo

3.1.1. Clustering algorithm[2][4]

Page 2: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

O algoritmo de agrupación, trata de dividir un conjunto de datos de entrada en

subconjuntos (clusters), de tal manera que los elementos de cada subconjunto

compartan cierto patrón, una o varias características a priori desconocidas.

El agrupamiento se hace conforme a algún criterio, generalmente por distancia o

por similitud. En el primer caso, se suelen usar funciones de distancia tales como la

euclídea y en el segundo se puede emplear algoritmos de cálculo de verosimilitud.

El aprendizaje se considera no supervisado en algunos contextos (como, por

ejemplo, minería de datos), porque cuando empezamos el algoritmo lo hacemos sin

información sobre qué cluster corresponde a cada dato.

Las técnicas para agrupar los datos son principalmente dos: Agrupamiento

jerárquico (que contempla aglomeración o división de clusters) y agrupamiento no

jerárquico, en el que el número de clusters se fija al inicio y los criterios usados son

respecto a distancias. Esta última técnica es en la que nos encontramos el método de k-

medias.

En el agrupamiento no jerárquico, el que nos ocupa, nos encontramos dos pasos

principales. El primero consiste en asignar a cada dato o elemento un cluster (al inicio

del algoritmo se escoge los clusters con algún criterio, por ejemplo elección aleatoria) y

luego, como segundo paso se recalculan los clusters a partir de los datos asignados a

este.

Entre las aplicaciones de clustering encontramos minería de datos, procesamiento

de imágenes digitales y bioinformática.

3.1.2. K-means algorithm [3][5]

El algoritmo de K-medias, también llamado algoritmo de Lloyd en la comunidad

informática, es un método de clustering o agrupamiento que, como hemos dicho,

consiste en clasificar un conjunto de elementos en base a propiedades de estos de forma

iterativa.

El algoritmo fue propuesto por primera vez por Stuart Lloyd en 1957 como una

técnica para modulación por impulsos codificados.

La técnica de agrupamiento es no jerárquico, por lo que se fija un número k de

clusters al inicio de su ejecución y se asignan elementos a un cluster en función de la

distancia, empleando para ello funciones como la distancia euclídea.

Su otra característica importante es que emplea la media estadística para el cálculo

de los nuevos clusters. Concretamente, lo que se calcula del cluster es su centroide, esto

es, el punto resultante de la media de todos los elementos asignados al cluster en

cuestión.

Así pues, K-medias posee los dos pasos principales que comentamos en el anterior

apartado:

- El paso de asignación, que asigna a cada elemento el cluster o grupo más

cercano, aplicando una función para el cálculo de distancia.

- El paso de actualización, consistente en calcular los nuevos centroides para

cada cluster.

Aunque el algoritmo presenta una complejidad computacional difícil, existen

heurísticos que hacen que converja rápidamente a un óptimo local. También hay que

tener en cuenta que se requiere de un método de inicialización y se suelen usar dos

principalmente:

Page 3: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

- El método de Forgy, consistente en la toma de k observaciones de forma

aleatoria como centros del cluster y luego empezar con el paso de asignación.

- El método de partición aleatoria, en el que se asigna aleatoriamente un cluster

a cada observación y se sigue con el paso de actualización.

Decir que estos métodos funcionan mejor respecto de diferentes heurísticos que se

empleen.

K-medias converge cuando al realizar el paso de asignación ningún elemento

cambia de cluster. Este suele ser el algoritmo de parada más común, pero también se

puede establecer un número máximo de iteraciones o cierto grado mínimo de

convergencia, con lo cual no se conseguirá el óptimo local pero sí una aproximación. El

máximo global no está asegurado con este algoritmo.

A pesar de ser antiguo y falto de robustez, este algoritmo es de uso muy extendido,

en áreas como segmentación de mercados, visión para computadoras, geoestadística,

astronomía o recuperación de la información. Es empleado además como

preprocesamiento para otros algoritmos, por ejemplo para búsqueda de configuración

inicial.

3.2. Planteamiento del método

Una vez sentadas las bases sobre los algoritmos de agrupación, podemos proceder a

explicar el método de segmentación aplicado sobre fotos de peces, tal como se enseña

en el artículo de Hong Yao[1], la base principal de este estudio.

3.2.1. Inicialización

Como punto de partida, tomamos la imagen y la tratamos aplicando una serie de

funciones. El objetivo principal en esta parte del método consiste en transformar la

imagen en una estructura de datos que pueda ser aplicada en nuestro algoritmo de

segmentación.

Lo primero que realizamos es la transformación de la imagen de un formato a color

a otro a escala de grises. Esto se hace así porque pasamos a tener una única componente

de color y, por consiguiente, se simplifica y se hace más sencillo el trabajar con la

imagen. No obstante, con esta acción perdemos mucha información. La mayoría de los

métodos de segmentación de imágenes trabajan sobre escala de grises y este método que

implementamos es uno de ellos.

El siguiente paso consiste en pasar los datos de la imagen en escala de grises a una

estructura de datos manejable en la segmentación y que contenga cada píxel de la

imagen asociado a su valor numérico en escala de gris. En este paso no perdemos

información y es fácilmente reversible.

Ya estamos preparados para la segmentación.

3.2.2. Segmentación

Esta es la fase principal, donde aplicamos el método objeto de estudio en este

trabajo: el algoritmo de k-medias.

Tomando como punto de partida la estructura de datos alcanzada en la

inicialización y un número k de clusters, el algoritmo realiza los pasos propios de K-

medias:

Page 4: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

1. Paso de inicialización, en la que tomamos unos clusters iniciales. En este caso,

empleamos el método de Forgy, esto es, tomaremos k píxeles aleatoriamente y

tomaremos sus valores como primeros centroides de los clusters.

2. Paso de asignación inicial: cada pixel se asociará al cluster o grupo de centroide

más cercano. La distancia euclídea será la empleada para medir la cercanía.

3. Paso de actualización, en el cual volvemos a calcular el valor de los centroides

de los grupos realizado la media aritmética con todos los valores de los píxeles

asignados al cluster en cuestión.

4. Paso de asignación, en el que se realiza la misma acción que en el paso 2.

5. Retorno a paso 3 siempre que tras el paso 4 haya habido un cambio en la

agrupación, es decir, haya un cambio de cluster de al menos un píxel.

6. Salida del resultado.

Tras la aplicación del algoritmo y con el resultado obtenido generamos una imagen

en las que los píxeles de un mismo cluster tendrá el mismo valor en escala de grises. El

resultado final es una imagen segmentada de la original.

4. Resolución práctica

Una vez explicado las bases y el método que estamos estudiando nos queda hablar

de los aspectos más técnicos. Esto es, queda hablar de los pasos seguidos en la

realización de este trabajo, y también de la implementación en tanto lenguaje,

modularización, librerías y otros aspectos.

Con nuestro artículo base como principal fuente de información, el primer paso fue

la localización de los puntos fundamentales para la implementación del método

expuesto. El resultado fue plasmado en forma de esquema gráfico, para una facilitar la

comprensión y retención cognitiva.

Tras concretar los pasos principales del método, nos centramos en aspectos de

implementación. Era necesario plantearse el lenguaje de programación en el que

implementar el método.

Page 5: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Nos planteamos la posibilidad de realizar el programa en C, en java o en python.

Los recientes avances en el aprendizaje de python, experiencia con trabajos de mayor

envergadura usando este lenguaje y coincidencia en que era el lenguaje más intuitivo

por parte de todos los miembros del proyecto hizo que se decantara la balanza a su

favor. También se tuvieron en cuenta aspectos como el número de librerías de imagen

disponibles, disponibilidad, facilidad de uso y documentación de estas y otros aspectos.

El lenguaje python no planteaba problemas de escasez de librerías ni de falta de

documentación sobre estas y por tanto no había inconvenientes en elegir este lenguaje.

Como siguiente paso, y ya que habíamos investigado sobre ello, nos dispusimos a

decidir qué clase de librerías necesitaríamos para la correcta implementación del

método. Finalmente, decidimos que necesitábamos fundamentalmente dos tipos: de las

que contuviese métodos básicos de tratamiento de imágenes y de las que nos permitiese

el desarrollo de interfaces gráficas, puesto que teníamos propuesto hacer una

implementación ejecutable para el usuario.

A la hora de elegir una librería para tratamiento de imágenes, teníamos dos

alternativas principalmente: OpenCV[7], librería adaptada a python y java pero que

trabaja internamente en c (y por lo tanto también es usado en ese lenguaje), muy amplia

y completa, y PIL[6], una librería de python con métodos básicos para el tratamiento de

imágenes. Elegimos al final PIL porque era sencilla, fácil de instalar y poseía lo

necesario para atender nuestras necesidades de proyecto.

Para el desarrollo de interfaces gráficas, elegimos Tkinter, una librería sencilla ya

conocida y usada en trabajos anteriormente para el desarrollo de interfaces gráficas

básicas.

Tras decidir las bases, podíamos comenzar con la implementación. Empezamos por

la fase de inicialización. Siguiendo el esquema mostrado anteriormente, partimos de una

imagen a color. El primer paso es pasarla a escala de grises, para lo cual empleamos la

librería elegida anteriormente. Seguidamente, necesitamos almacenar la imagen en una

estructura de datos fácilmente manipulable por un algoritmo de k-medias. Empleando

un método de la librería, transformamos la imagen en una lista manteniendo el orden de

los píxeles y almacenando su valor. Para ello empleamos nuevamente un método de

nuestra librería de tratamiento de imágenes. Con esto tenemos preparado los datos para

nuestro algoritmo de k-medias.

Si nos fijamos en el esquema de trabajo, tocaría implementar el método de Otsu

para sacar el número de picos del histograma de nuestra imagen, dato que nos serviría

como el número k de clusters que emplearíamos en el algoritmo de k medias. Nuestro

principal objetivo era el estudio del algoritmo de k-medias en la segmentación de una

imagen, por lo que nos centramos en ello y el cálculo de picos lo realizaríamos

manualmente mediante la visualización del histograma. Por ello nos decantamos por el

uso de otra librería más llamada matplotlib[8] por tener una característica interesante

para nuestro proyecto que consistía en la representación de histogramas, útil para la

estimación del número de clusters apropiados para la segmentación.

La implementación de k-medias fue propia para evaluar el algoritmo estándar y

comprobar su efectividad sin otras mejoras que pueda existir en algoritmos

implementados en librerías ajenas. Así pues, creamos nuestro propio algoritmo de k-

medias con los pasos principales que describimos en el apartado 3.2.1 y las

características citadas, es decir, empleando el método de Forgy en el paso de

inicialización de clusters, la distancia euclídea como función para medir la cercanía en

el paso de asignación y la media aritmética en el paso de actualización de los centroides

de los clusters.

Page 6: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Este algoritmo fue hecho por módulos, de tal forma que se componen de varios

métodos independientes, las principales ejecutan cada uno de los pasos principales

descritos en el apartado 3.2.1 y el resto son métodos auxiliares de los anteriores, tales

como la función de distancia euclídea. El método principal de k-medias implementado

solo llama secuencialmente a los métodos que realizan los pasos de k-medias de forma

independiente. La modularización permite probar los pasos de forma individual y

corregir errores con mayor facilidad. Además, muchos de los métodos implementados

quedan disponibles para su uso por otros programas que puedan realizarse con

posterioridad.

Con los resultados obtenidos, debíamos de generar una imagen segmentada con k

valores de grises, uno representando cada cluster.

Esta tarea fue implementada en parte dentro del algoritmo de k-medias. Los

identificadores usados para representar los clusters eran valores de escala de grises

equidistantes. Por ejemplo, para k=2 clusters, los valores que representaba cada cluster

eran 0 y 255, para k=3 eran 0, 127 y 254. Así conseguiremos mantener la funcionalidad

de k-medias sin modificar (ya que la asignación de identificadores diferentes para los

clusters no influye en el resultado final) y el resultado final era mucho más útil para la

creación de la imagen segmentada.

Concretamente, la salida de nuestro algoritmo era una lista con los píxeles aún

ordenados pero asociados a cada uno el cluster que había sido asignado finalmente en el

algoritmo de k-medias. Mediante una operación, creamos una lista únicamente con los

clusters asignados a cada píxel. Con ello, ya sólo teníamos que transformar dicha lista

en una imagen con los valores contenidos en ella. Empleamos nuevamente un método

de la librería PIL para dicha tarea.

Tal como se muestra en el esquema, se pretendía implementar un algoritmo a partir

del cual obtener una binarización de la imagen a partir de la imagen segmentada, tal

como se hace en el artículo principal, pero no ha sido posible por motivos de tiempo.

No obstante, la binarización ya se obtiene con bastante calidad en algunas imágenes en

las que se emplea una segmentación con dos tonos de gris (blanco y negro).

Completamos el programa con una interfaz gráfica de fácil uso para poder analizar

el resultado con varias imágenes de manera cómoda y sencilla, además de proporcionar

un programa usable para un usuario que no hubiera intervenido en la realización del

proyecto.

Se pretendía que la interfaz fuese sencilla, con lo básico para funcionar. Tras pensar

en qué sería necesario, se decidió dotar a la interfaz de la posibilidad de, cómo no,

seleccionar una imagen. Dimos en este aspecto libertad para que se pudiese seleccionar

cualquier imagen de cualquier directorio. También se decidió que era necesario mostrar

el histograma de la imagen seleccionada, puesto que para que el resultado de la

segmentación fuese lo más efectivo posible, era necesario seleccionar un número de

clusters acordes al número de picos que presentaba el histograma y para ello se

necesitaba que el usuario visualizase el histograma y calculase por sí mismo los picos.

Con la imagen seleccionada, ya solo quedaba iniciar la segmentación, para lo cual se

dotó a la interfaz un botón de inicio que tras pulsar se pediría el número de clusters que

se pretendía usar. Cuando se introdujera dicho dato, comenzaría el algoritmo de

segmentación y devolvería el resultado al terminar.

Se implementó la interfaz tal que lo primero que se solicita al ejecutar el programa

sea una imagen. Tras la selección, el programa ejecuta el programa hasta el cálculo de la

imagen en escala de grises y se emplean métodos de la librería de la interfaz gráfica

para mostrar una pantalla con la imagen en escala de grises creada, y los botones de

muestra del histograma y comenzar con la segmentación.

Page 7: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Cuando se pulsa el botón de muestra de histograma, el programa llama al método

de la librería matplotlib necesario y se aplican métodos de Tkinter[9] nuevamente para

mostrar por pantalla el histograma.

Si se pulsa el botón de ejecución de la segmentación, se mostrará un campo de

selección del número de clusters, que al rellenar y aceptar arrancará el programa. Al

finalizar el cálculo, se mostrará una pantalla con el resultado final de la segmentación y

aparecerá además la nueva opción de guardar un gif con la traza de iteraciones que

hicieron en el algoritmo de k medias, mostrando el resultado de la segmentación en cada

una de dichas iteraciones.

5. Experimentación

Con el programa finalizado, comenzamos las pruebas empleando distintas imágenes

y usando distinta cantidad de clusters.

Empezamos con ejemplos sencillos con la figura del pez muy diferenciada del

fondo. Se pretendía estudiar la eficacia del algoritmo en casos aparentemente triviales.

La segmentación más sencilla fue la de la siguiente imagen:

Ejemplo 1 a color y a escala de grises

Esta imagen muestra un fondo blanco y por ello la segmentación es trivial. No era

necesario ni observar el histograma para intuir que con dos cluster podríamos

vislumbrar la silueta:

Segmentación del ejemplo 1 con k = 2

Pero como primera prueba para comprobar si el algoritmo funcionaba

correctamente era bastante válida.

Comenzamos a experimentar incrementando la dificultad paulatinamente. Con

ejemplos triviales nos dábamos cuenta de que probablemente el cálculo automático de

picos de histogramas para el cálculo de los cluster podría ser problemático. Por poner un

ejemplo, al mostrar el siguiente histograma:

Page 8: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Histograma del ejemplo 2

Podríamos deducir que el número de picos saldría muy elevado y por tanto se

requerirían un elevado número de cluster para tener una segmentación válida. No

obstante, la imagen a la que corresponde el histograma es esta:

Ejemplo 2 a color y a escala de grises

En esta imagen podemos interpretar que estando tan diferenciado el fondo de la

imagen con dos cluster el resultado puede ser bueno. Y, efectivamente, el resultado no

podía ser mejor:

Segmentación del ejemplo 2 con k = 2

Por el contrario, hay varios ejemplos que demuestran que la visualización del

histograma es bastante aclarador y orientarse a partir de este es muy recomendable.

Existen casos en los que parece complicada la asignación de cluster. Tales son los

casos de:

Page 9: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Ejemplo 3 a color y a escala de grises

Ejemplo 4 a color y a escala de grises

Donde a partir de la imagen en escala de grises uno no sabe cuántos clusters aplicar

para tener una silueta clara de la imagen. No obstante, los histogramas son aclaradores.

Histograma de ejemplo 3 y 4

Contemplando el histograma podemos ver que con dos cluster muy probablemente

tengamos buenos resultados. Y es así:

Segmentación del ejemplo 3 y 4 con k = 2

Page 10: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Otros ejemplos eran más complejos debido a que en escala de grises tenían tonos

parecidos al fondo y no daban buenos resultados. Por ejemplo:

Ejemplo 5 a color y a escala de grises

en cuyo histograma

Histograma del ejemplo 5

se podía visualizar varios picos pero de valores muy cercanos, por lo que intuitivamente

con dos o tres cluster se esperaba una buena segmentación. No obstante, los resultados

con la cantidad de clusters mencionados no dieron unos resultados demasiado

aceptables.

Segmentación del ejemplo 5 con k = 2 y k = 3, respectivamente

Page 11: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Aquí pudimos ver los límites de este algoritmo de segmentación. Fallaba con

distribuciones homogéneas y de valores muy cercanos y agrupados en un intervalo.

Ejemplo 6 a color y a escala de grises

Histograma del ejemplo 6

Segmentación del ejemplo 6 con k = 3

No obstante, el resultado de varias segmentaciones eran realmente buenas. La

siguiente imagen

Ejemplo 7 a color y a escala de grises

Page 12: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Con tres clusters es un buen ejemplo:

Segmentación del ejemplo 7 con k = 3

Otro ejemplo, con resultados desde 2 hasta 5 clusters:

Ejemplo 8 a color y a escala de grises

Histograma del ejemplo 8

Segmentación del ejemplo 8 con k = 2 y k = 3, respectivamente

Page 13: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Segmentación del ejemplo 8 con k = 4 y k = 5, respectivamente

Para analizar la segmentación en imágenes en general, probamos a usar nuestro

algoritmo para segmentar imágenes que no fueran de peces.

Los resultados eran variados, y muchos requerían de mayor numero de cluster que

el empleado para los peces. Mostramos algunos resultados:

Foto perfil 1 y resultado con k = 3

Foto perfil 2 y resultado con k = 3

Page 14: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Foto palmera y resultado con k = 3

Foto escritorio y resultado con k = 4

En general, los resultados son bastante buenos. Comparando tiempos de cálculo, no

varía mucho entre problemas con misma cantidad de píxeles, en general. Existen

excepciones, ya que cuando los valores de grises están muy agrupados en una zona del

histograma el algoritmo debe realizar más iteraciones para alcanzar una estabilidad en la

asignación del cluster definitivo a cada píxel. No obstante, esta cantidad de iteraciones

no varían mucho.

Lo que sí aumenta el número de iteraciones es el número de clusters seleccionado.

En el último ejemplo de peces expuesto, para obtener resultados de 2 y 4 cluster, la

diferencia llegaba a ser de 20 iteraciones.

Como añadido señalar que este algoritmo nunca ha dado problemas de

convergencia con ninguna de las imágenes y número de clusters aplicados, pero tiene el

problema de quedarse en máximos locales.

6. Manual de usuario

Para poder ejecutar el programa, debes tener instalado en Windows python 2.7 y las

librerías empleadas, esto es, matplotlib, Tkinter y PIL.

Los pasos a seguir son:

I. Descarga e instala python 2.7 en http://www.python.org/download/ para windows

II. Descarga e instala las librerías para python 2.7

- Tkinter ya viene en el paquete para windows

- matplotlib: http://matplotlib.org/downloads.html

- PIL: http://www.pythonware.com/products/pil/

Page 15: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Hemos creado un ejecutable que te instala todo lo necesario. Viene acompañado al

proyecto.

En Linux habría que buscar e instalar lo mencionado anteriormente con la ayuda de

algún administrador de paquetes como synaptics.

Luego, con el proyecto descargado, abrir el archivo Principal.py. Se arrancará el

programa.

Lo primero que se ve es una pantalla de selección de archivo, donde debe escoger

una imagen. Recomendamos que elija algunas de las que proporcionamos en el proyecto

en la carpeta imágenes.

Ventana de elección de imagen

Una vez seleccionada, aparecerá el menú principal del programa, con la imagen

seleccionada pasada a escala de grises y las opciones "Mostrar histograma" y

"Segmentar".

Si se pulsamos el botón "Mostrar histograma" aparecerá una nueva pantalla con el

histograma asociado a la imagen anteriormente seleccionada.

Ventanas de menú principal y visor de histograma

Cuando quiera comenzar con la segmentación debe seleccionar la opción

"Segmentar" y aparecerá una pantalla con un campo de introducción de texto donde se

pide indicar el número de clusters que queremos emplear para la segmentación, es decir,

con cuantos niveles de gris queremos obtener la segmentación. Cuando se introduce el

número se debe dar al botón "Enviar" y comenzará la segmentación.

Page 16: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Ventanas de introducción del número de clusters

Al terminar de ejecutarse el algoritmo aparecerá una pantalla con la imagen

segmentada. Además, aparecerá otra pequeña ventana con la opción de guardar la

evolución de la segmentación con cada iteración del algoritmo de k-medias en forma de

gif. Si pulsan en dicha opción aparecerá una pantalla para seleccionar el directorio

donde guardar el archivo.

Ventanas de resultado de la segmentación y opción de guardar gif

7. Conclusiones

Hasta donde hemos podido analizar, el algoritmo de k-medias ha sido muy eficaz

en la mayoría de las imágenes con la que hemos probado. Aunque existen imágenes con

unas características en los que el algoritmo flaquea, con otras se obtienen resultados

notables. Además, los tipos de imágenes en los que flaquea no son nada fáciles de

segmentar en general y tampoco se puede encontrar hasta la fecha un algoritmo de

segmentación válido para toda clase de segmentación de imágenes.

Los tiempos no han sido analizados con precisión, y tampoco se dispuso de tiempo

para tratar de paralelizar el código, aunque tras la implementación del algoritmo dio la

impresión de que sería sencillo hacerlo ya que realiza internamente muchos cálculos de

Page 17: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

forma totalmente iterativa. El estudio del algoritmo paralelizado sería interesante y nos

podría revelar bastantes aspectos en cuanto a rendimiento.

Como la mayoría de los métodos de segmentación de imágenes hasta la fecha, lo

primero que se realiza es una transformación a escala de grises de las imágenes que

estén a color, lo cual se gana notablemente en eficiencia y en simplicidad en el

tratamiento de la imagen, pero posiblemente a expensas de perder mucho en eficacia.

Cabe plantearse la posibilidad de estudiar una variante del método capaz de gestionar de

forma eficaz una imagen a color.

Por último, queda decir que el estudio queda incompleto puesto que falta

comprobar si la binarización que se plantea en el artículo principal en el que basamos

nuestro trabajo concibe buenos resultados para imágenes segmentadas con más de dos

clusters (es decir, imágenes que no hayamos pasado a binario directamente en la

segmentación). Podría completarse en futuros proyectos.

Referencias

[1] Hong Yao, Qingling Duan, Daoliang Li y Jianping Wang, "An improved K-means clustering

algorithm for fish image segmentation”, [2] http://es.wikipedia.org/wiki/Algoritmo_de_agrupamiento [3] http://es.wikipedia.org/wiki/K-means [4] S. Russell, P. Norvig, Artificial Intelligence - A Modern Approach, 3rd edición - Pearson, 2010. [5] https://web.cse.msu.edu/~cse802/notes/ConstrainedKmeans.pdf [6] http://en.wikipedia.org/wiki/Python_Imaging_Library [7] http://opencv.org/ [8]http://matplotlib.org/ [9]https://wiki.python.org/moin/TkInter

Page 18: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Segmentación de imágenes mediante el

algoritmo de k-medias

J.M. Lopez Vera y F. Luna Perejon

Anexo: tabla de tiempos

A continuación exponemos los tiempos dedicados por cada miembro al proyecto,

detallando las tareas.

Planificación

Actividad Inicio Fin Miembros

del grupo

Duración inicial Duración

real

Análisis del

artículo base

30/10 01/11 Ambos 2 2

Crear resumen

para portal Ópera

e inscripción

04/11 04/11 Ambos 1 0,5

Planificación y

objetivos

04/11 04/11 Ambos 1,5 2

Creación esquema

conceptual

06/11 06/11 Ambos 1 1

Estudio de posibles

lenguajes y

librerias

18/11 18/11 Ambos 1,5 2

Decisión del

lenguaje y librerías

20/11 20/11 Ambos 0,5 1

Estudio de

algoritmo de K-

medias

11/11 11/11 Ambos 1 2

Decisión de

estructura y

variante del

algoritmo

13/11 13/11 Ambos 0,5 1

Page 19: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Implementación

código

Actividad Inicio Fin Miembros

del grupo

Duración inicial Duración

real

Implementación

del algoritmo de k-

medias

20/11 27/11 Ambos 8 12

Crear código de

inicialización del

método

27/11 02/12 JM.L.V. 6 5

Crear código de

tratamiento

posterior a K-

medias

02/12 09/11 JM.L.V. 6 5

Crear código de

muestra por

pantalla

09/12 11/12 JM.L.V. 5 4

Crear interfaz

gráfica (primera

versión)

11/12 16/12 Ambos 6 8

Crear interfaz

gráfica (segunda

versión)

16/12 18/12 JM.L.V. 3,5 4

Crear interfaz

gráfica (tercera

versión)

18/12 23/12 JM.L.V. 2,5 2

Crear instalador

de librerías

06/01 08/01 JM.L.V. 1,5 2

Page 20: Segmentación de imágenes mediante el algoritmo de k-mediasopera.eii.us.es/pid/public/uploads/pid/entregables/2013-2014/G2013... · Segmentación de imágenes mediante el algoritmo

Documentación

Actividad Inicio Fin Miembros

del grupo

Duración inicial Duración

real

Creación de

introducción en

documentación

27/11 27/11 F.L.P 1 1,5

Creación de

planteamiento

teórico en

documentación

27/11 02/12 F.L.P 6 8

Creación de

resolución práctica

en documentación

11/12 12/12 Ambos 4,5 4

Creación de

experimentación en

documentación

18/12 23/12 F.L.P 8 7

Creación de

manual de usuario

en documentación

23/12 23/12 JM.L.V. 2,5 3

Creación de

conclusiones en

documentación

26/12 26/12 F.L.P 3 4

Referencias 02/01 02/01 Ambos 0,5 2

Corrección y dar

formato a

documentación

08/01 08/01 F.L.P 3 4

Otros

Actividad Inicio Fin Miembros

del grupo

Duración inicial Duración

real

Rellenar TDA 20/11 20/11 Ambos 2 1,5

Reformulación de

resumen

07/11 07/11 F.L.P 1 0,5

Experimentación 18/12 23/12 Ambos 12 10

Revisión de la

documentación y el

programa

08/01 08/01 Ambos 2 1,5

Tabla de tiempos 08/01 08/01 Ambos 2 2

Exposiciones 08/01 15/01 Ambos 0,3 0,5