clasificación de imágenes
Transcription
clasificación de imágenes
CLASIFICACIÓN DE IMÁGENES Cesar Juárez Megías I.T.T. Imagen y sonido Carlos III de Madrid [email protected] Jessica Serrano Cita I.T.T. Imagen y sonido Carlos III de Madrid [email protected] OBJETIVO. 2.CLASIFICACION IMÁGENES. El objetivo principal de nuestro programa se basaría en la clasificación de imágenes de varias categorías diferentes. Para ello nos basaremos en la forma, color, luminosidad, etc de las imágenes, usando así algunos de los algoritmos vistos de teoría a través de un programa implementado en MATLAB desarrollado por nosotros. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DE LA APLICACIÓN. DE A continuación detallaremos los pasos a seguir para realizar de forma completa una clasificación de imágenes. Adquisición y procesado Evaluación Extracción características Bloque de entrenamiento Etapa de clasificación 2.1.- Adquisición y procesado. Para llevar a cabo el desarrollo de la aplicación utilizaremos el programa MATLAB, que es un entorno de desarrollo de aplicaciones orientado a realizar cálculos matemáticos elevados y la visualización de los mismos. La elección de este programa está basada en que las imágenes no dejan de ser matrices sobre las que debemos realizar unos cálculos concretos, por lo tanto sería un entorno de desarrollo totalmente adecuado para la aplicación a desarrollar. Además la implementación de nuestro clasificador va a resultarnos fácil y será sencilla de entender a cualquier usuario que desee comprobar su funcionamiento. PALABRAS CLAVE. Imágenes, clasificación, extracción de características, procesamiento… 1.- INTRODUCCIÓN. La clasificación de imágenes es un procedimiento utilizado en cartografía, astronomía, diagnósticos médicos, etc. Este procedimiento, se basará en la extracción de ciertas características comunes en una categoría de imágenes, para su posterior clasificación en una de las distintas clases posibles. El proceso de extracción de características estará orientado a la manipulación de imágenes digitales. Hay características que no percibimos a primera vista, pero que están implícitamente dentro de las imágenes con las que trabajaremos, para ello utilizaremos técnicas de minería de datos, que extraen dicha información. En este bloque introducimos todas las imágenes que queramos clasificar, independientemente de las categorías con las que estamos trabajando, es decir, el sistema nunca conocerá de forma cierta la categoría a la que pertenecen cada una de las imágenes de entrada; se comporta de una forma ciega. Cada imagen es tratada como una matriz de dos dimensiones (x e y) para cada una de las componentes RGB, o una sola matriz (x · y) para las imágenes en escala de grises. Para la extracción de algunas de las características deberemos convertir la imagen de color a escala de grises, como por ejemplo para la extracción de características que requieren el uso del histograma. Cada uno de los componentes de la matriz será el valor de la intensidad de un punto de la imagen, o también denominado píxel. En matlab, usaremos datos de tipo double con lo que deberemos convertir la matriz de coeficientes de las imágenes cargadas a este tipo. 2.2.- Extracción de las características y almacenado. El siguiente bloque de nuestro clasificador es el encargado de la extracción y el almacenado de las características de cada una de las imágenes de entrada. Es uno de los pasos más importantes de nuestra aplicación, ya que a partir de la correcta extracción de dichas características podremos posteriormente clasificarlas de forma adecuada y sin demasiados errores en una u otra clase. EXTRACCIÓN DE CARACTERÍSTICAS. Antes de ponerse a programar debemos analizar cada una de las categorías que tendremos que clasificar después. Observaremos sus características propias, y visualizaremos cuáles son distintas en ambos grupos de imágenes, para así poder decidir a cuál clase se parece más. Las características de las imágenes pueden ser de varios tipos, como por ejemplo: número de líneas horizontales y verticales, colores típicos, texturas, uniformidad, etc. En el caso que hemos implementado las dos categorías seleccionadas son minaretes (torres) y candelabros, y las características seleccionadas son el color y la entropía. anteriores para obtener un margen de marrón similares a los que podríamos encontrar dentro de esa categoría. 140<ROJO<200 140<VERDE<165 90<AZUL<145 - Color blanco: tras muchas pruebas de distintos colores, comenzamos a probar colores que no se visualizaban de forma directa en las imágenes, pero que influyen en el color que el ojo percibe. Los umbrales que definen los distintos tonos de blanco que nos interesan en este caso son: 242<ROJO<254 242<VERDE<254 240<AZUL<254 Para calcular el nivel de blanco en la imagen seguiremos estos pasos: Comprobaremos si la imagen tiene las tres componentes RGB mediante la función size, que nos devolverá un vector con tres componentes, alto, ancho y número de dimensiones (L). Si L es 3 la imagen será del tipo RGB, y si es 1, la imagen estará en escala de grises. A continuación, una vez comprobado que la imagen tiene las tres dimensiones (es decir, que L=3) separamos cada una de las componentes de color para cada pixel: imagenColorRojo(i,j) = imagenColor(i,j,1); imagenColorVerde (i,j) = imagenColor(i,j,2); imagenColorAzul (i,j) = imagenColor(i,j,3); - COLOR Sin duda esta características es la que más problemas puede darnos a la hora de clasificar, ya que puede que sea evidente que haya un color predominante en la imagen, pero al basarnos en rangos para definir un color, puede que haya otro, que esté compuesto por valores próximos a ese rango y nos modifique la decisión del clasificador. Cada vez que se ha realizado una prueba hemos modificado los umbrales para comprobar qué color estaba en mayor proporción dentro de cada una de las categorías; por lo que hemos llegado a la conclusión de que las torres contienen nivel de color blanco que los candelabros. Para la extracción del color nos basamos en los distintos rangos que tiene cada uno de los colores en sus tres componentes RGB. Estos rangos podrán tomar valores comprendidos entre 0 y 254 (siendo el 0 la ausencia de esa componente y 254 el máximo valor que esa componente puede tomar). Los colores con los que hemos probado han sido: - Color azul: la mayor parte de las imágenes de torres están tomadas en el exterior, por lo que el azul del cielo predominaría en el fondo de la imagen. Los umbrales del color azul son: 100<ROJO<180 180<VERDE<220 210<AZUL<254 - Color tierra: las torres tienen un tono característico marrón claro, por lo que modificamos los umbrales Donde imagenColor, es la imagen cargada en ese momento, i y j serán los índices de los bucles usados para recorrer la imagen pixel a pixel. - Una vez obtenida la componente de color, marcamos un umbral que contendrá el color que nos interesa conseguir (en este caso el blanco) con la sentencia: if((imagenColorRojo(i,j)<254) && (imagenColorRojo(i,j)>242) && (imagenColorVerde(i,j<242) && (imagenColorVerde(i,j)<254) && (imagenColorAzul(i,j)>240) && (imagenColorAzul(i,j)<254)) Crearíamos por tanto otra condición en la que impondremos que los pixeles que tengan un valor por componente dentro del rango calculado se quedarán tal y como están, mientras que cuando no se cumpla la condición pasarán a tener un valor nulo (0). Actualizamos la imagen para que nos aparezcan los píxeles que nos interesan (cada una de las componentes imagenColorRojo, imagenColorAzul e imagenColorVerde, sobrescribe los valores anteriores de esa componente en la imagenColor), por lo que observaremos una imagen en la que destacarán los píxeles del color que queremos, en este caso aparecerá el negro (correspondiente a los valores nulos) y el blanco. Recorremos la imagen para realizar el conteo de los píxeles negros, para posteriormente, conociendo el número de píxeles totales, podamos obtener el número de píxeles del color que estamos estudiando. Para terminar, almacenamos el nivel de color en la matriz de características asociada a las imágenes de cada categoría. - ENTROPÍA Es el grado de incertidumbre que existe en cualquier proceso aleatorio. En nuestro caso podremos definirlo como la cantidad de “desorden” que contiene nuestra imagen. En el caso que nos corresponde estudiar, usaremos el histograma de la imagen en escala de grises (mediante la función imhist) y podremos definir la entropía como el sumatorio del valor obtenido en dicho histograma, multiplicado por el logaritmo en base dos del mismo valor más un valor muy pequeño, denominado eps. Este valor se suele utilizar cuando el valor al cual le aplicaremos el logaritmo es muy pequeño. La expresión de la entropía será: entropía = -sum(p.*(log2(p+eps))); Existen muchas más características que podrían ser útiles a la hora de la clasificación de imágenes, como por ejemplo: - UNIFORMIDAD Nos indica la poca variación que hay dentro de una imagen. Esta característica se calcula a partir del histograma de cada una de las imágenes en escala de grises. Almacenamos este valor en una variable para su posterior uso. La suma de todos los valores que hemos almacenado en la variable anterior al cuadrado nos dará el valor de la uniformidad. Nos basamos en la imagen en escala de grises. Para obtener el número de líneas horizontales, definimos un filtro detector de bordes horizontales y se lo aplicamos a la imagen. El filtro definido es el siguiente: fitro = [1 2 1; 0 0 0; -1 -2 -1]; Un ejemplo de la imagen que obtenemos, una vez aplicado el filtro es la siguiente: Binarizamos la nueva imagen y realizamos el cálculo del número de líneas, mediante la función strel; previamente, hemos definido el elemento estructurante, en este caso líneas (line). Usamos la función imerode para llevar a cabo la erosión y posteriormente la función bwlabel, para unir de nuevo las líneas que se han fragmentado, que es lo que hará que nos quedemos únicamente con las líneas, para realizar posteriormente el conteo mediante la función bweuler, que nos devolverá el valor que buscamos. - NUMERO DE LINEAS VERTICALES Es el mismo caso que el parámetro anterior, salvo que usaremos un filtro detector de bordes verticales: filtro = [0 0 0; -1 1 0; 0 0 0]; - SUAVIDAD Sirve para detectar aquellas imágenes que son más lisas que otras. La suavidad tendrá un valor más bajo para imágenes con una rugosidad más alta. Al comparar una categoría con otra, la de mayor suavidad será la que tenga un valor más alto (o más baja rugosidad). Para calcular la suavidad, necesitamos obtener antes el tamaño de la imagen, mediante la función size. Utilizamos también la imagen en escala de grises. Obtenemos la varianza de cada una de las imágenes para posteriormente calcular la suavidad mediante la fórmula: suavidad = 1-(1/(1+varianza)); - NUMERO DE LINEAS HORIZONTALES Esta característica es algo abstracta a la vista de cualquier observador, ya que no podemos diferenciarla a simple vista, sino que necesitamos realizar un filtrado de la imagen para poder obtener cierta información; por lo cual, esta es una característica en la que no se piensa en un principio. - NUMERO DE LINEAS (HOUGH) Podemos calcular el número total de líneas a partir de la transformada de Hough. Binarizamos la imagen y le incluimos como parámetro un método ya predeterminado denominado ‘canny’, que busca los máximos de gradiente encada una de las imágenes; el gradiente lo calcularíamos mediante la derivada de un filtro gaussiano. Utilizamos este parámetro, y no otro, porque tiene mayor inmunidad frente al ruido. A continuación, definimos un vector donde recogeremos la información de la transformada de Hough, y que a su vez contendrá el ángulo de cada una de la columnas de la transformada y los valores de rho de cada una de la filas de la transformada. Marcamos un umbral, en el que indicaremos un número orientativo de líneas, como puede ser 125. Llamamos a la función houghpeaks, que detecta los ejes que hay en la matriz obtenida anteriormente a partir de la transformada Hough, pasándole como parámetros: la matriz de la transformada Hough, el número de líneas y un umbral máximo, a partir del cual se suprimirán los píxeles vecinos. Para terminar definimos un parámetro (numeroDeLineas) que nos vaya almacenando el tamaño p (ejes), que más tarde nos servirá para la clasificación. - OTRAS CARACTERÍSTICAS Otra característica interesante habría sido el número de círculos. Para ello se utilizaría la imagen binarizada, con la función im2bw. Definiríamos el radio del círculo (radio de los elementos que querríamos encontrar) y para finalizar, utilizaríamos la transformada de Hough para encontrar los círculos mediante la función houghcircle. Para tener una idea visual de lo que estamos realizando en el bloque de entrenamiento, obtenemos la gráfica de distribución de características, dibujamos los centroides y la frontera de decisión para saber a qué categoría pertenecería la imagen según esté en una región u otra. 2.4.- Etapa de clasificación. Al tratarse de un clasificador de mínima distancia, calcularemos las distancias entre las características de las imágenes de entrada y cada uno de los centroides que habíamos calculado en el bloque de entrenamiento. Una vez calculadas las distancias, comprobamos cuál de las dos es menor, y por lo tanto a qué categoría de imágenes pertenece. Realizamos la siguiente comparación: Si la distancia al centroide 1 es mayor que la distancia al centroide 2, la categoría a la que pertenece la imagen estudiada es la 2; en otro caso, será la 1. ALMACENAMIENTO Una vez que extraemos todas las características, se almacenan en una matriz. A continuación la matriz de características se divide en dos submatrices dejando algo más de la mitad de los valores para el bloque de entrenamiento y el resto para el test (evaluación). Generalmente suele rondar en torno al 65% para entrenamiento y el 35% para el test, aunque en ocasiones se utiliza también los porcentajes 75 / 25%, dependiendo de cómo queremos que esté entrenado nuestro sistema, aunque tendremos en cuenta que no esté sobreentrenado, ya que esto iría en contra de generalizar y hacer más fácil la solución sencilla al problema propuesto. 2.3.- Bloque de entrenamiento. En este caso, el clasificador utilizado ha sido el de mínima distancia, teniendo en cuenta que los resultados obtenidos no van a ser buenos, realizaremos un entrenamiento previo del mismo a partir del cual obtendremos un parámetro que nos servirá para llevar a cabo la clasificación de las imágenes en cada categoría. Calculamos los centroides obteniendo la media de la característica asociada a cada una de las categorías de imágenes; de esta forma, nos permitirá tener una mayor precisión a la hora de clasificar las imágenes introducidas. Para no tener fallos a la hora de hacer el balance de aciertos y errores, le damos un valor concreto a cada una de las categorías, como pueden ser 0 para la categoría 1 y 1 para la categoría 2, de esta forma, para saber cuántas veces ha clasificado la imagen de la categoría 1 tan sólo nos basta con hacer un sumatorio (sabiendo el número total de imágenes que hemos incluido en el clasificador). Las imágenes de entrada a este bloque serán las submatrices de entrenamiento y test de cada categoría. 2.5.- Evaluación del clasificador. Este es el bloque final de nuestro clasificador, y es donde podemos llevar a cabo una evaluación de la eficiencia de nuestro programa. Obtenemos una matriz de confusión, la cual nos indicará cómo de bueno o malo es el clasificador que hemos implementado. Para sacar los centroides, utilizaremos la submatriz de características de entrenamiento definida anteriormente. La matriz de confusión tiene dimensión 2x2 y los valores que nos interesan son los de la diagonal, cuanto más altos sean con respecto a los demás, mejores resultados obtendremos en la clasificación. Una vez obtenidas las medias, las almacenamos en un vector de medias para ser utilizado en el bloque de clasificación. Dentro de la matriz de confusión: • La primera fila se referirá a la categoría 1; el primer término de la fila nos indicará las imágenes que ha clasificado correctamente frente • al número total de imágenes que tenía la categoría 1 y el segundo término en cuales ha fallado. recurriremos más tarde para implementar el sistema que permita la clasificación de las imágenes. La segunda fila se referirá a la categoría 2; el primer término se referirá a las imágenes que ha clasificado mal con respecto al número total de imágenes de la categoría 2 y el segundo término nos indicará el número de imágenes que ha clasificado correctamente. Nuestro motor de inferencias será la extracción de características para compararlas con las medias almacenadas que será nuestra base de conocimientos. Haremos una evaluación de las imágenes de entrenamiento y otra de las imágenes de test, obteniendo mejores resultados en la evaluación de las imágenes de entrenamiento por lo general, ya que son las que hemos utilizado en el bloque de entrenamiento por lo que el “molde” está hecho a su medida. Tabla de evaluación del clasificador Imágenes de Entrenamiento Imágenes de Test TASA DE ERROR 0.3357 (33’57%) 0.3026 (30’26%) TASA DE ACIERTO 0.6643 (66’43%) 0.6974 (69’74%) Tabla de eficiencia del clasificador Imágenes de Entrenamiento Imágenes de Test IMÁGENES BIEN CLASIFICADAS 95/143 53/76 IMÁGENES CLASIFICADAS ERRONEAMENTE 48/143 23/76 3.CLASIFICACION DE IMÁGENES Vs. INTELIGENCIA ARTIFICIAL (algoritmos de búsqueda) En este apartado tratamos de buscar similitudes entre los algoritmos y métodos usados en la implementación del programa y los estudiados en la asignatura. Observamos que nuestro sistema será un sistema basado en conocimiento, ya que necesitamos conocer el tipo de problemas que tenemos entre manos antes de llevar a cabo el programa de clasificación. Separaremos el conocimiento que codificamos en la máquina y los mecanismos deductivos (motor de inferencias). Para realizar un programa de estas envergadura necesitaremos que un experto en el tema (en este caso nosotros) nos “ponga al día” de todos los posibles métodos que existen para ello, a los cuales Observamos, a su vez, un razonamiento lógico, ya que obtenemos una conclusión (la imagen es de tal o cual categoría) mediante unas premisas (se parece más a esta característica que a esta otra). Cuando tratamos la imagen, vemos que si no pertenece a una categoría, es obligatoriamente de la otra, ya que en nuestro sistema solo disponemos de dos grupos de imágenes posibles. Este tratamiento de las imágenes es claramente un mecanismo más del razonamiento lógico. Vemos también una serie de indicios que nos llevan a deducir que el sistema implementado tiene a su v ez algunos rasgos claros del razonamiento bajo incertidumbre, ya que si lo pensamos detenidamente, percibimos proposiciones imprecisas, puesto que las variables no se pueden determinar con exactitud (siempre quedan dudas de si la decisión tomada es la correcta o no lo es). Podemos en algunos casos, implementar un sistema parecido al que nosotros hemos desarrollado que contenga una teoría de la evidencia, que mejore nuestro programa (si con una de las características no es capaz de resolver la decisión, puede apoyarse en la otra para solucionar este problema). Cuando estudiamos Clips, nos dimos cuenta de que nuestra aplicación se asemejaba también a algunos aspectos de este tema. Cada característica extraída es un patrón, y nuestro motor de inferencias (la observación de estos patrones con las medias sacadas de los bloques de entrenamiento) es capaz de emparejar la lista de hechos (la imagen tiene tanta cantidad de la característica i) con los patrones de las reglas (el centroide de la característica i está en tal o cual posición). Evaluaremos los patrones, con funciones booleanas de comparación numérica y lógicas, para realizar varias cosas en nuestro sistema, como decidir si los valores de un pixel está o no en los niveles de blanco definidos. Otro de los temas tratados en clase y en nuestro programa es el aprendizaje. Usaremos un sistema que no produzca sobreentrenamiento, ya que si nuestra aplicación se ajusta demasiado a los datos de entrenamiento no será capaz de decidir de forma correcta si le introducimos posteriormente los datos de test. El agrupamiento es otro de los contenidos del tema de aprendizaje que somos capaces de observar en nuestro trabajo; identificaremos grupos de datos en cada una de las características, ya que siempre tendrán valores muy separados si se trata de imágenes de una categoría o de la otra. La técnica que usa el agrupamiento de los datos en una u otra región la realizaremos mediante la media (centroides). La idea básica del tema de aprendizaje es que nuestro sistema es capaz de “aprender”, mediante unas imágenes de entrenamiento, para posteriormente evaluar el sistema, mediante las imágenes de test. El bloque de conocimientos más importante de la asignatura es también el que más se asemeja a la forma de trabajar que tiene nuestro sistema, la minería de datos. Observamos que el proceso básico de minería de datos es más o menos igual que el que usamos nosotros en nuestro sistema: Tenemos una base de datos, que en nuestro caso será cada una de las categorías que comprenden las imágenes que vamos a estudiar. Seleccionamos los datos que necesitamos de esta base, y le realizamos un preprocesado. A continuación seleccionamos las características que necesitamos y las extraemos. Como último paso, evaluamos e interpretamos los resultados obtenidos, obteniendo así un modelo de conocimiento, que será el saber distinguir entre una categoría u otra. La metodología llevada a cabo en nuestra aplicación es también la misma que en la minería de datos: Lo primero es comprender el ámbito en el que nos estamos moviendo. Este proceso se realiza siempre bajo la supervisión y el consejo de personas expertas en el tema que estemos tratando en ese momento, en este caso la clasificación de imágenes. Posteriormente, observamos los datos que tenemos, en nuestro caso las imágenes y comprendemos sus características, para luego poder tratarlas de la forma correcta. Una vez hecho esto, podemos pasar al preprocesado de datos, en el que los ajustaremos para trabajar posteriormente con ellos. Este apartado lo iremos realizando a la vez que el modelado, ya que idear el sistema consiste también en probar distintos algoritmos y prestar atención a los resultados obtenidos, posteriormente observar si nuestra aplicación necesita cambios o está correctamente implementada. Cuando ya tenemos el modelo realizado, debemos evaluarlo, de esta forma, comprobaremos el correcto funcionamiento del sistema, si es así, ya tendremos el programa totalmente desarrollado. La parte de minería de datos que trataremos para realizar la extracción del conocimiento, serán las técnicas descriptivas, que tratarán de describir un conjunto de datos, pero también podríamos enmarcarla en técnicas predictivas ya que lo que pretendemos es estimar un valor de salida (una conclusión determinada, la cuál nos dará información sobre el proceso de clasificación). La clasificación se realizará mediante mínimas distancias, es decir, observaremos la característica de la imagen que estemos tratando en ese momento y la compararemos con las medias almacenadas; así podremos decidir a cual se parece más, es decir, de cual característica está más cerca. Realizaremos también una segmentación de los datos para posteriormente tratarlos de forma más eficiente, en nuestro caso trataremos por separado los bloques de entrenamiento y de test. CONCLUSIÓN Nuestro sistema está profundamente relacionado con varios conceptos de la inteligencia artificial, y podemos asemejarlo a muchos temas dados en la asignatura. La realización de este programa nos ha servido para darnos cuenta de que la mayor parte de las veces, los sistemas implementados para dar una solución a un problema siguen siempre el mismo patrón: Adquisición y preprocesado de los datos. Elección y extracción de las características para realizar un modelo general. Clasificación de unos datos de entrada y evaluación del sistema. 4.- BIBLIOTECA DE FUNCIONES UTILIZADAS EN MATLAB imread = función utilizada para leer las imágenes de un determinado archivo rgb2gray = convierte las imágenes RGB a escala de grises, eliminando el matiz y la saturación de la información, manteniendo la luminancia tmhist = muestra el histograma de datos de la imagen size = tamaño (dimensión) de la imagen strel = crea el elemento estructural morfológico imerode = erosiona la imagen con el elemento estructural que hemos definido con la función strel bwlabel = encargada de conectar las componentes de la imagen binaria que hemos previamente hemos erosionado bweuler = obtenemos el número de elementos que hayamos definido en la imagen. im2bw = función utilizada para binarizar una imagen houghcircle = transformada de hough utilizada para encontrar círculos 5.- REFERENCIAS [1] Apuntes asignatura Tratamiento Digital de Imágenes, tercer curso de I.T.T. Sonido e Imagen, Jesús Cid http://www.tsc.uc3m.es/~jcid [2] Tratamiento digital de imágenes, apuntes de I.T.T. Sonido e Imagen de la Universidad de Málaga, Fº Navas Herrera, Enrique Nava Baro http://campusvirtual.uma.es/tdi/ [3] Recurso didáctico de tratamiento digital de imátenes, José J. Grimaldos http://www.grimaldos.es/cursos/imgdig/ [4] Curso de doctorado de tratamiento digital de imágenes, Rafael Palacios http://www.iit.upcomillas.es/palacios/dip/ [5] Wikipedia, procesamiento digital de imágenes http://es.wikipedia.org/wiki/Procesamiento_digit al_de_im%C3%A1genes [6] Apuntes de vision artificial, Universidad Politécnica de Madrid, Carlos Platero http://www.elai.upm.es/spain/Asignaturas/Robot ica/ApuntesVA/cap3ProcesadoImagv1.pdf http://www.elai.upm.es/spain/Asignaturas/Robot ica/ApuntesVA/cap5VASegmentacion.pdf [7] Procesamiento digital de imágenes, Facultad de agronomía http://www.agro.uba.ar/users/paruelo/SIG/Clase _proc_dig.pdf [8] Apuntes análisis de imágenes de la Universidad de Alcalá http://www.depeca.uah.es/docencia/ITINF/sva/t7-analisis.pdf [9] Introducción a la Toolbox de Procesado de Imagen http://www.depeca.uah.es/docencia/INGTELECO/lce/image_toolbox.pdf [10] Prácticas segmentación de imágenes de la Universidad Politécnica de Madrid http://www.elai.upm.es/spain/Asignaturas/Robot ica/PracticasROVA/prROVA5Segmentacion.pdf