Segmentación de imágenes mediante el algoritmo de...
Transcript of Segmentación de imágenes mediante el algoritmo de...
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]
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:
- 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:
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.
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.
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.
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:
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:
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
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
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
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
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
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/
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.
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
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
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
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
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