Mari Carmen Barba Riquel e-mail:[email protected] Texturas Caracterizadas Topológicamente ÍNDICE LISTA DE FIGURAS ........................................................................................................................................ 3 1. INTRODUCCIÓN ......................................................................................................................................... 4 2. IDEA GENERAL ........................................................................................................................................... 7 3. TRABAJO PREVIO ............................................................................................................................................. 9 4. LA ESTRUCTURA DE DATOS {Ns(t)}s I ...................................................................................... 10 4.1. Cálculo de los grafos Ns(t) ................................................................................................................. 11 5. USO DEL MRCG PARA CARACTERIZAR TEXTURAS ........................................................... 13 5.1. Texturas uniformes .............................................................................................................................. 13 5.2. Modelos de filtro .................................................................................................................................. 17 5.3. Propiedades del MRCG para texturas ........................................................................................... 18 5.3.1. Transformaciones de niveles de gris......................................................................................... 18 5.3.2. Alisar / perfilar una imagen ......................................................................................................... 18 5.3.3. Características básicas de las texturas .................................................................................. 19 6. RESULTADOS EXPERIMENTALES ................................................................................................... 20 7. CÓDIGO ........................................................................................................................................................ 22 9. CONCLUSIONES ....................................................................................................................................... 34 10. REFERENCIAS .......................................................................................................................................... 35 ANEXO I................................................................................................................................................................ 36 Barba Riquel, Mari Carmen 2 Texturas Caracterizadas Topológicamente LISTA DE FIGURAS Figura 1. Representación de la 4-vecindad ............................................................................................................... 6 Figura 2. Esquema de la idea general ....................................................................................................................... 8 Figura 3. Obtención del MRCG a partir de la imagen binarizada .......................................................................... 10 Figura 4. Representación de los Arrays L e idx. ..................................................................................................... 11 Figura 5. Representación del caso unidimensional ................................................................................................. 13 Figura 6 . Perímetro para un pixel. ......................................................................................................................... 15 Figura 7. Perímetro para dos píxeles. ..................................................................................................................... 15 Figura 8. Perímetro para tres píxeles. ..................................................................................................................... 15 Figura 9. Otro perímetro para tres píxeles. ............................................................................................................. 15 Figura 10. Ejemplo de una imagen con líneas y su correspondiente binarización. ................................................ 19 Figura 11. Interfaz del programa. Pestaña Imagen. ................................................................................................ 31 Figura 12. Interfaz del programa. Pestaña Componentes conexas. ........................................................................ 32 Barba Riquel, Mari Carmen 3 Texturas Caracterizadas Topológicamente 1. INTRODUCCIÓN La caracterización de texturas es una herramienta muy importante para el análisis de imágenes, algunas de sus aplicaciones son: Clasificación de regiones en imágenes médicas. Análisis de fotografías tomadas por satélite. El concepto de textura aún no está muy claro pero podemos dar una definición informal: Textura: una escena es considerada una textura si cualquier vista parcial de la escena es similar a cualquier otra. Podemos considerar dos grandes tipos de texturas: Estructurales: aquellas texturas formadas por una repetición de elementos básicos llamados texelas. Estadísticas: aquellas texturas que no necesitan un elemento básico. Ej: hierba, corcho, lona, etc. La clasificación de texturas se utiliza para tareas de segmentación, detección de defectos en las texturas, etc. Normalmente, las texturas se caracterizan por una función o por un vector de características. Aquí vamos a presentar un método para caracterizar texturas, basado en las propiedades topológicas de los diferentes niveles de gris y de las distintas resoluciones. Se usará una estructura de datos llamada MRCG(Multi Resolution Cluster Graphs). Esta estructura está formada por una secuencia de grafos denotados por {Ns(t)}s I. En la que dados s y t, Ns(t) se define como el número de componentes conexas formadas por al menos s píxeles, para una imagen binarizada con umbral t. La secuencia de grafos no se calcula exhaustivamente, pero los píxeles de la imagen re recorren linealmente. En el peor de los casos, la complejidad en tiempo para crear la secuencia completa de grafos es casi lineal. Barba Riquel, Mari Carmen 4 Texturas Caracterizadas Topológicamente Exactamente es de O((n,n) n), donde n es el número de píxeles de la imagen y (n,n) es la inversa de la función de Ackerman. Barba Riquel, Mari Carmen 5 Texturas Caracterizadas Topológicamente La estructura {Ns(t)}s I es una representación multinivel de la imagen donde el parámetro s controla la resolución. En este estudio consideraremos que un píxel es vecino de otro si entre ellos existe una relación de 4-vecindad. Figura 1. Representación de la 4-vecindad Este documento está estructurado de la siguiente manera: en el apartado 2 se expone una idea general de este método, en el apartado 3 hay una breve descripción del trabajo previo, en el apartado 4 se describe la estructura de datos {Ns(t)}s I. En el apartado 5 se discuten las propiedades más relevantes de este caracterizador de texturas. El apartado 6 contiene resultados experimentales, en el apartado 7 se muestra el código del programa, en el 8 un breve manual de usuario y en el apartado 9 se recogen las conclusiones. Se añade también un anexo con un test de 10 preguntas referentes al trabajo realizado. Barba Riquel, Mari Carmen 6 Texturas Caracterizadas Topológicamente 2. IDEA GENERAL La idea de este nuevo enfoque para caracterizar texturas consiste en lo siguiente: Dada una imagen en niveles de grises, calcularemos su histograma y a partir de él haremos binarizaciones con distintos valores umbrales. El estudio de las componentes conexas de las imágenes binarizadas nos dirá si se trata de una imagen muy granulosa, granulosa o poco granulosa. Si el número de componentes conexas cambia rápidamente cuando tomamos valores umbrales cercanos, estaremos frente a una imagen muy granulosa, si por el contrario el número de componentes conexas no varía al ir cogiendo distintos valores umbrales cercanos, pero varía cuando cogemos valores umbrales muy lejanos querrá decir que la imagen es poco granulosa. Barba Riquel, Mari Carmen 7 Texturas Caracterizadas Topológicamente Figura 2. Esquema de la idea general Barba Riquel, Mari Carmen 8 Texturas Caracterizadas Topológicamente 3. TRABAJO PREVIO Las características más sencillas de las texturas son las estadísticas de primer orden extraídas del histograma. Otras características más fiables son aquellas estadísticas que contienen información espacial y que no se obtienen a partir del histograma. Estamos hablando del método de la diferencia de los niveles de gris (GLMD). Como estos, existen multitud de métodos para caracterizar texturas, algunos de ellos son: Análisis de Wavelets. Caracterización de texturas según el área de la imagen. Cálculo de las 5 características del histograma. Gray Level Run Lengths. Markov Random Field. ... Barba Riquel, Mari Carmen 9 Texturas Caracterizadas Topológicamente 4. LA ESTRUCTURA DE DATOS {Ns(t)}s I Sea I la imagen de entrada y sea It la imagen resultante de binarizar la imagen I con un umbral t. Se define {Ns(t)}s S como el conjunto de Ns(t), donde: Ns(t) es el número de componentes conexas con un tamaño de al menos s píxeles en una imagen binarizada con umbral t. t [0, 255] s se toma de un conjunto de valores de resoluciones R. Figura 3. Obtención del MRCG a partir de la imagen binarizada En el peor de los casos la secuencia de grafos {Ns(t)}s S puede ser calculada en O((n,n) | T | | R | n), donde: (n,n)es la inversa de la función de Ackerman y es casi constante | T | es independiente del tamaño de entrada de la imagen | R | es prácticamente una constante n es el número de píxeles de la imagen Por tanto podemos decir que la complejidad del cálculo de {Ns(t)}s S es lineal. Barba Riquel, Mari Carmen 10 Texturas Caracterizadas Topológicamente 4.1. Cálculo de los grafos Ns(t) A continuación expondremos los pasos que hay que seguir. Para cada tamaño s hay que construir el grafo de la función Ns(t). Por tanto para cada valor umbral t, el número de objetos de tamaño s tendrá que ser calculado. Denotaremos por It la imagen resultante de binarizar la imagen de entrada con un umbral t. Cada píxel de It será blanco o negro dependiendo del valor del píxel correspondiente en la imagen de entrada, si el nivel de gris es menor que el umbral será negro, en otro caso será blanco. Es fácil de ver que los píxeles negros de It+1 serán también píxeles negros en It. Por tanto el cálculo de Ns(t+1) se basa en los cálculos hechos para Ns(t). Sea m el número de niveles de gris (en nuestro caso 256) y n el número de píxeles de la imagen de entrada, la construcción del grafo Ns(t) se hace de la siguiente manera: a) Construir una lista L de n píxeles y un array idx de tamaño m, tal que idx(i) sea el índice del primer elemento de L con nivel de gris i. Figura 4. Representación de los Arrays L e idx. b) Definir una estructura en la que inicialmente cada píxel sea un conjunto disjunto. c) Contar el número de objetos. Para ello inicializaremos la cuenta a cero y recorreremos la lista L. Sea t el nivel de gris del píxel p, uniremos p con cada uno de sus vecinos(4-adyacentes) si el nivel de gris del vecino de p no es mayor que t. Si la unión se lleva a cabo actualizaremos el número de Ns(t) de la siguiente manera: Barba Riquel, Mari Carmen 11 Texturas Caracterizadas Topológicamente Sean s1 y s2 los tamaños de los dos conjuntos que voy a unir. Si s1 y s2 son menores que s, y s1+s2>=s entonces tenemos un nuevo objeto, por tanto incrementamos la cuenta. Pero si s1 y s2 no son menores que s entonces decrementamos en uno la cuenta. El valor de Ns(t) será el resultante después de procesar el último píxel con nivel de gris t. Barba Riquel, Mari Carmen 12 Texturas Caracterizadas Topológicamente 5. USO DEL MRCG PARA CARACTERIZAR TEXTURAS 5.1. Texturas uniformes Si la imagen de entrada I es una imagen con textura uniforme entonces It (que será la imagen I binarizada), no será más que una imagen de ceros y unos repartidos aleatoriamente donde la probabilidad de que sea un 1 es p(t), y la probabilidad de que sea un 0 es 1- p(t). p(t) es una función monótona creciente y su valor depende de la distribución de la uniformidad. Si la distribución del ruido blanco es uniforme en el intervalo [tmin,tmax] entonces podemos definir p(t) como: Para comprender mejor el significado del Ns(t) vamos a ver el caso unidimensional. Para el caso unidimensional, la imagen uniforme es una secuencia binaria aleatoria con una probabilidad p(t) de que sea “1” y una probabilidad 1-p(t) de que sea “0”. En este caso una componente conexa es una secuencia de unos rodeado de ceros. El número de componentes conexas para cualquier tamaño de s será N1(t). Cada componente conexa tiene exactamente una ocurrencia de “10”, excepto la última componente. Por tanto, dado un número de n bits, el número de ocurrencias de “10” será el número de componentes conexas con una desviación de 1 como mucho. Y la probabilidad de ser “10” es de p*q. 1 0 0 1 0 1 0 Figura 5. Representación del caso unidimensional De este razonamiento podemos sacar la siguiente proposición: Proposición 1: Dada una imagen unidimensional, uniforme, con probabilidad p de que un píxel sea negro, el valor de Ns(t) viene dado por la expresión: (n-s-1) psq. Barba Riquel, Mari Carmen 13 Texturas Caracterizadas Topológicamente El caso de dos dimensiones es más complicado, pero intentaré explicarlo. Sea Es una componente conexa de s píxeles. Diremos que Es le ocurre al píxel x si x es el píxel más a la derecha y más abajo de entre todos los píxeles de la columna de x. La probabilidad de que Es le ocurra a algún píxel x viene dada por psqr donde r es el número de píxeles del perímetro. Veámoslo con un ejemplo: Barba Riquel, Mari Carmen 14 Texturas Caracterizadas Topológicamente Para s = 1 r=4 Figura 6 . Perímetro para un pixel. Para s = 2 r=6 Figura 7. Perímetro para dos píxeles. Para s = 3 r=8 Figura 8. Perímetro para tres píxeles. Para s = 3 r=7 Figura 9. Otro perímetro para tres píxeles. Si nos fijamos, podemos darnos cuenta de que cuando la componente es una línea, r viene dado por r = 2s + 2. Y para valores grandes de s r = s. Denotemos por as, r, i, j al número de componentes conexas distintas de s píxeles, cuando el píxel más a la derecha y más abajo es el (i, j). Por ejemplo, para i,j >=s, a 1,4 = 1, a 2,6 = 2, a 3,8 = 2, a 3,7 = 2, etc. (Ver figura anterior). Proposición 2: Para imágenes 2D uniformes, el valor de Ns(t) es una combinación lineal de psqr Barba Riquel, Mari Carmen 15 Texturas Caracterizadas Topológicamente Barba Riquel, Mari Carmen 16 Texturas Caracterizadas Topológicamente 5.2. Modelos de filtro En este apartado se describe la relación de los modelos de filtro con la estructura {Ns(t)}s S para texturas uniformes. Un modelo de filtro se define como una cuadrícula o enrejado en el que cada vértice se declara como abierto con una probabilidad p y como vértice cerrado con una probabilidad de 1-p. Podemos establecer las siguientes relaciones entre el modelo de filtros y la estructura Ns(t): Modelo de filtro Imagen binaria vértice abierto píxel negro componente conexa abierta objeto formado por al menos s píxeles Es decir, que un vértice abierto en el modelo de filtros es equivalente a lo que nosotros hemos llamado píxel negro en una imagen binaria. Y un subgrafo conexo de al menos s vértices abiertos del modelo de filtros se corresponde en una imagen binaria a un objeto formado por al menos s píxeles. Se define probabilidad crítica como la probabilidad de que dado un vértice pertenezca a una componente abierta. Para el modelo anteriormente definido pc = 0.592764, es decir, que si la probabilidad de que un vértice sea negro es >pc entonces existe una componente conexa en Z2 con probabilidad 1. Esto implica que para valores lo suficientemente grandes de s existe un t' tal que Ns(t)=0 para t <= t'. Barba Riquel, Mari Carmen 17 Texturas Caracterizadas Topológicamente 5.3. Propiedades del MRCG para texturas Lo explicado en el apartado anterior también se puede aplicar a texturas más complejas. 5.3.1. Transformaciones de niveles de gris El comportamiento del MRCG cuando hacemos transformaciones de niveles de gris se recoge en la siguiente proposición: Proposición: Sea I una imagen de entrada y sea II la imagen obtenida al aplicarle a I la transformación de escala de grises a(t). Si Ns(t) es el MRCG de I entonces el MRCG de II será Ns(a(t)). Demostración: para cualquier t se cumple que It = IIa(t), es decir, que las imágenes binarizadas son las mismas. Como la ecualización del histograma es una transformación de escala de grises monótona creciente de la propiedad anterior se obtiene el siguiente corolario: Corolario: Sean I: imagen de entrada y II: la imagen ecualizada, entonces MRCG de I y MRCG de II se diferencian en una transformación monótona de t. Este corolario nos proporciona una herramienta para normalizar texturas como una etapa previa al procesamiento, o sea, que antes de trabajar con las imágenes podremos hacerles un preprocesamiento que consistirá simplemente en una ecualización del histograma. 5.3.2. Alisar / perfilar una imagen El efecto de alisar una imagen es similar a incrementar el valor del parámetro s. Una componente conexa se corresponde con un valle en la superficie de la imagen que está por debajo del plano binarizado. El tamaño de la componente conexa es el área en el plano binarizado, el cual es cortado por la superficie de la imagen. Los valles que cortan el plano binarizado con un área menor que s no cuentan para el cálculo de Ns(t). Por tanto cortar los valles por debajo de la primera cima que crea una componente conexa de tamaño >=s no tiene efecto alguno sobre el grafo Ns(t). Barba Riquel, Mari Carmen 18 Texturas Caracterizadas Topológicamente 5.3.3. Características básicas de las texturas En este apartado examinaremos la influencia que tienen algunas características “clásicas” de texturas sobre el MRCG. Antes de nada cabe comentar que el MRCG es invariante respecto a la orientación, es decir, que el resultado será el mismo sea cual sea la orientación de la imagen y esto hace que sea un método muy bueno en comparación con otros métodos. Características de las texturas: Regularidad: una textura es regular cuando está formada por una repetición de elementos básicos. Cuanto más regular sea una textura más liso será su grafo Ns(t). Linealidad: si cogemos dos imágenes: I1 y I2, donde I1 está formada por líneas de s' píxeles, I2 está formada por cuadrados de s' píxeles, nos damos cuenta de que al binarizar con umbral t, las imágenes que obtenemos contienen sólo porciones de esas líneas (o cuadrados) esto es porque son imágenes digitales y el nivel de gris de los píxeles de un objeto no es el mismo. Es más fácil romper líneas que cuadrados, por tanto los Ns(t) grafos serán mayores para valores pequeños de s' (y al revés). Figura 10. Ejemplo de una imagen con líneas y su correspondiente binarización. Densidad: para valores lo suficientemente grandes de s, texturas densas o tupidas implican valores grandes para la función Ns(t). Además los objetos densos se unen más rápidamente. Falta de finura: una textura poco fina significa grandes componentes conexas en la imagen. Barba Riquel, Mari Carmen 19 Texturas Caracterizadas Topológicamente 6. RESULTADOS EXPERIMENTALES En este apartado se presentarán los resultados obtenidos de la comparación de los métodos SGLDM y Fractal signature con el método que estamos estudiando. Para la obtención de los resultados se tomó un conjunto de 13 imágenes, entre ellas estaban una imagen de corcho, de un tejido, de lana, de lona, e incluso de agua. Cada imagen fue escaneada con una resolución de 75 dpi y 256 niveles de gris. De estas imágenes se tomaron muestras de 128x128. Se aplicó una ecualización a cada una de ellas para neutralizar los efectos de las estadísticas de primer orden, ya que normalmente estas estadísticas son poco fiables. Es importante que nos demos cuenta de que en estas imágenes hay texturas que son diferenciables fácilmente con sólo mirarlas, debido a las diferencias significativas que presentan las estadísticas de primer orden, pero que después de la ecualización del histograma ya no son tan diferenciables. En estos experimentos se caracterizan a las texturas por los valores de sus grafos N2(t). Se escogió una resolución de tamaño 2 por el siguiente motivo: si ns(t) es el número de componentes conexas de tamaño s exactamente en la imagen binarizada con umbral t, Ns(t)=nu(t). Se observa claramente que Ns(t) contiene más información para valores pequeños de s. Para medir resultados definiremos el concepto de distancia: La distancia entre dos grafos Ns(t) se define como la suma normalizada de los cuadrados de las diferencias: D( Ns'(t), Ns''(t) ) = (1/x) [ Ns'(t) - Ns''(t) ]², donde x = max(a, b)², siendo a y b los valores máximos de Ns'(t) y Ns''(t) respectivamente. Resumiendo los experimentos realizados, comentaré que para los otros métodos se obtenían distancias mayores entre muestras que pertenecían a una misma textura que con el MRCG. Incluso, hubo ocasiones en las que la distancia entre muestras de diferentes texturas era menor que la distancia entre muestras sacadas de la misma textura. En general podemos decir lo siguiente: SGLDM Salen valores más bajos que para el método MRCG. Es más apropiado para microtexturas. Barba Riquel, Mari Carmen 20 Texturas Caracterizadas Topológicamente Las diferencias con el método MRCG son muy acusadas y no son consecuencia de una mala elección de características sino una falta de información en las matrices de co-ocurrencias. Fractal Signature Los resultados del MRCG son mejores que los del Fractal Signature y los del Fractal Signature son mejores que los del SGLDM. Barba Riquel, Mari Carmen 21 Texturas Caracterizadas Topológicamente 7. CÓDIGO El programa está implementado en Visual Basic. A continuación se describen los módulos del mismo y se muestran las funciones más importantes: El programa está formado por los siguientes cinco módulos: Botonera: en este módulo se implementan las funciones necesarias para el funcionamiento de los botones del programa. Colores: en este módulo se implementan las funciones para pasar al formato RGB, a escala de grises, etc. Representaciones: en este módulo se implementan las funciones necesarias para la representación de las imágenes en pantalla. Tipos: en este módulo se definen los tipos de datos utilizados en el programa. Transformaciones: en este módulo es donde se encuentra la funcionalidad del programa. A continuación se muestran las funciones más importantes del módulo de Transformaciones: Este método redimensiona la matriz donde se guardan los datos de la imagen y obtiene los distintos valores de color necesarios. Sub redimensionaTextura(imagen As PictureBox, textura As TipoTextura) Dim altura As Long, anchura As Long altura = imagen.ScaleY(imagen.Picture.Height, vbHimetric, vbPixels) anchura = imagen.ScaleX(imagen.Picture.Width, vbHimetric, vbPixels) textura.ancho = anchura textura.alto = altura ReDim textura.punto(anchura - 1, altura - 1) End Sub Barba Riquel, Mari Carmen 22 Texturas Caracterizadas Topológicamente Este método obtiene la imagen en escala de grises a partir de la imagen que se ha abierto. Sub obtenerEscalaGrises(imagen As PictureBox, textura As TipoTextura) Dim i As Long, j As Long Dim color As Long For i = 0 To textura.ancho - 1 For j = 0 To textura.alto - 1 ' Obtenemos el color del punto a partir de la imagen color = imagen.Point(i, j) 'Establacemos el valor del nivel de gris textura.punto(i, j).nivelGris = colorToGris(color) Next j Next i End Sub Mediante este método se obtiene el histograma de la imagen cargada. Sub obtenerHistograma(textura As TipoTextura) Dim i As Long, j As Long Dim color As Long Dim maximo As Long ' Inicializa los valores del histograma textura.histo.valorMaximo = 0 For i = 0 To 255 textura.histo.valores(i) = 0 Next i For i = 0 To textura.ancho - 1 For j = 0 To textura.alto - 1 color = textura.punto(i, j).nivelGris textura.histo.valores(color) = textura.histo.valores(color) + 1 ' Va calculando el valor máximo del histograma If textura.histo.valores(color) > textura.histo.valorMaximo Then textura.histo.valorMaximo = textura.histo.valores(color) End If Next j Next i End Sub Barba Riquel, Mari Carmen 23 Texturas Caracterizadas Topológicamente Método para binarizar la imagen. Sub binarizarImagen(textura As TipoTextura, umbral As Long) Dim i As Long, j As Long, k As Long Dim color As Long For i = 0 To textura.ancho - 1 For j = 0 To textura.alto - 1 ' Transformaciones para poner el color en binario textura.punto(i, j).binario = binarizaPunto(textura.punto(i, j), umbral) Next j Next i End Sub Función para binarizar un punto Function binarizaPunto(punto As TipoPunto, umbral As Long) As Byte ' Si el punto está por debajo del umbral If punto.nivelGris < umbral Then binarizaPunto = True Else binarizaPunto = False End If End Function Método para ecualizar el histograma. Sub ecualizarHistograma(textura As TipoTextura) Dim suma(255) As Double Dim i As Long, j As Long, ancho As Long, alto As Long Dim totalPuntos As Long Dim gris As Long ancho = textura.ancho alto = textura.alto totalPuntos = alto * ancho ' Realizamos la suma correlativa For i = 1 To 255 suma(i) = suma(i - 1) + textura.histo.valores(i) Next i 'Normalización For i = 0 To 255 suma(i) = suma(i) * 255 / totalPuntos Next i ' Sustitución de la imagen por la ecualizada For i = 0 To ancho - 1 For j = 0 To alto - 1 gris = textura.punto(i, j).nivelGris gris = Round(suma(gris)) Barba Riquel, Mari Carmen 24 Texturas Caracterizadas Topológicamente textura.punto(i, j).nivelGris = gris Next j Next i End Sub Barba Riquel, Mari Carmen 25 Texturas Caracterizadas Topológicamente Función que obtiene el número de componentes conexas de una textura. Function numeroComponentesConexas(textura As TipoTextura) As Long Dim i As Integer, j As Integer Dim ancho As Long, alto As Long Dim numeroComponentes As Long ReDim ContadorComponentes(1) ReDim numeroPuntosDeComponente(1 To 100) ' Inicializamos la tabla de componentes ancho = textura.ancho alto = textura.alto ReDim componentes(ancho, alto) ' Inicializamos la pila Set pila = New CPila pila.inicializar ancho * alto numeroComponentes = 0 ' Usamos un algoritmo de búsqueda en profundidad For i = 0 To ancho - 1 For j = 0 To alto - 1 'Si todavía no se ha procesado el punto, es que tenemos una nueva componente If Not procesado(i, j, ancho, alto) And textura.punto(i, j).binario = True Then ' Entramos a procesar una nueva componente numeroComponentes = numeroComponentes + 1 componentes(i, j) = numeroComponentes ' Añadimos una componente mas para contar los puntos que tiene ReDim Preserve numeroPuntosDeComponente(1 To numeroComponentes) numeroPuntosDeComponente(numeroComponentes) = 1 ' Miramos los datos que todavía no se han procesado, ' como estamos recorriendo de arriba a abajo y de izquierda a derecha ' quedarán los de abajo y los de la derecha ' Miramos los de abajo If Not procesado(i, j + 1, ancho, alto) Then If textura.punto(i, j).binario = textura.punto(i, j + 1).binario Then descubreVecinos i, j + 1, numeroComponentes, textura End If End If ' Miramos los de la derecha If Not procesado(i + 1, j, ancho, alto) Then If textura.punto(i, j).binario = textura.punto(i + 1, j).binario Then descubreVecinos i + 1, j, numeroComponentes, textura End If End If End If Barba Riquel, Mari Carmen 26 Texturas Caracterizadas Topológicamente Next j Next i numeroComponentesConexas = numeroComponentes End Function Función que va recorriendo todos los vecinos a partir de un punto. Es importante el uso de ByVal en i, j y numeroComponentes, para que no cambien de valor al salir de la función. No se hace recursivo porque el tamaño de las imágenes a procesar produce un desbordamiento de la pila. Function descubreVecinos(ByVal i As Integer, ByVal j As Integer, ByVal numeroComponentes, imagen As TipoTextura) Dim elem As Variant ' Para obtener el dato almacenado en la pila Dim ancho As Long, alto As Long ' Usamos el estado para que no vuelva a preguntar por vecinos que ya ha ' comprobado, y así ganar tiempo Dim estado As Integer estado = 1 ancho = imagen.ancho alto = imagen.alto Do Select Case estado Case 1 ' Estado inicial 'El punto pertenece a la componente actual y lo consideramos procesado componentes(i, j) = numeroComponentes 'Añadimos un punto más a esta componente numeroPuntosDeComponente(numeroComponentes) = numeroPuntosDeComponente(numeroComponentes) + 1 ' Comprueba los vecinos por arriba If Not procesado(i, j - 1, ancho, alto) Then If imagen.punto(i, j).binario = imagen.punto(i, j - 1).binario Then pila.apila i, j, estado ' Apilamos el elemento pues vamos a seguir ' mirando a partir de él j = j - 1 ' Establecemos la coordenada del siguiente vecino estado = 0 ' Establecemos el estado para procesar el siguiente vecino ' Lo iniciamos a 0 porque se incrementará luego End If End If Case 2 ' Comprueba los vecinos por la izquierda If Not procesado(i - 1, j, ancho, alto) Then If imagen.punto(i, j).binario = imagen.punto(i - 1, j).binario Then pila.apila i, j, estado ' Apilamos el elemento pues vamos a seguir ' mirando a partir de él i=i-1 estado = 0 ' Establecemos el estado para procesar el siguiente vecino Barba Riquel, Mari Carmen 27 Texturas Caracterizadas Topológicamente End If End If Case 3 ' Comprueba los vecinos por abajo If Not procesado(i, j + 1, ancho, alto) Then If imagen.punto(i, j).binario = imagen.punto(i, j + 1).binario Then pila.apila i, j, estado ' Apilamos el elemento pues vamos a seguir ' mirando a partir de él j=j+1 estado = 0 ' Establecemos el estado para procesar el siguiente vecino End If End If Case 4 ' Comprueba los vecinos por la derecha If Not procesado(i + 1, j, ancho, alto) Then If imagen.punto(i, j).binario = imagen.punto(i + 1, j).binario Then pila.apila i, j, estado ' Apilamos el elemento pues vamos a seguir ' mirando a partir de él i=i+1 estado = 0 ' Establecemos el estado para procesar el siguiente vecino End If End If Case 5 ' Ya se han mirado todos los vecinos del punto, entonces debemos volver ' atrás ' Hay que desapilar en caso de que se haya apilado algo If pila.tamaño > 0 Then elem = pila.desapila() i = elem(0) j = elem(1) estado = elem(2) End If End Select ' Pasará al siguiente estado estado = estado + 1 'DoEvents ' Por si se queda pillado Loop Until pila.tamaño = 0 And estado > 5 End Function Barba Riquel, Mari Carmen 28 Texturas Caracterizadas Topológicamente Método que calcula el número de componentes que existen con un número de puntos que va desde 1 hasta al tamaño de la componente conexa más grande. Sub calculaNumeroComponentesConNPuntos() Dim i As Long, numero As Long, sumador As Long Dim cantidadPosiciones As Long Dim fin As Long ReDim numeroComponentesConNPuntos(1 To getMaximoPuntosEnComponentes()) ReDim nComponentesConNPuntosSinCeros(2, 1) fin = UBound(numeroPuntosDeComponente) For i = 1 To fin numero = numeroPuntosDeComponente(i) numeroComponentesConNPuntos(numero) = numeroComponentesConNPuntos(numero) + 1 If numeroComponentesConNPuntos(numero) = 1 Then cantidadPosiciones = cantidadPosiciones + 1 End If Next i ReDim nComponentesConNPuntosSinCeros(2, cantidadPosiciones) Dim j As Long fin = UBound(numeroComponentesConNPuntos) For i = 1 To fin If numeroComponentesConNPuntos(i) <> 0 Then ' Guardamos el número de puntos nComponentesConNPuntosSinCeros(0, j) = i ' Guardamos el número de componentes que tienen i puntos nComponentesConNPuntosSinCeros(1, j) = numeroComponentesConNPuntos(i) j=j+1 End If Next i ' Calculamos Ns(t) para los datos que quedan fin = j For i = fin - 1 To 0 Step -1 sumador = sumador + nComponentesConNPuntosSinCeros(1, i) nComponentesConNPuntosSinCeros(2, i) = sumador Next i End Sub Barba Riquel, Mari Carmen 29 Texturas Caracterizadas Topológicamente Función que nos dice si un elemento se ha procesado ya o no. Function procesado(i As Integer, j As Integer, ancho As Long, alto As Long) As Boolean procesado = False ' Comprueba que no se salga de los límites, si se sale lo considera como procesado If i < 0 Or i >= ancho Or j < 0 Or j >= alto Then procesado = True ElseIf componentes(i, j) <> 0 Then procesado = True End If End Function Función que calcula el tamaño en puntos de la componente conexa más grande. Function getMaximoPuntosEnComponentes() As Long Dim i As Long, numero As Long, maximo As Long Dim fin As Long fin = UBound(numeroPuntosDeComponente) For i = 1 To fin numero = numeroPuntosDeComponente(i) If (numero > maximo) Then maximo = numero End If Next i getMaximoPuntosEnComponentes = maximo End Function Barba Riquel, Mari Carmen 30 Texturas Caracterizadas Topológicamente 8. MANUAL DE USUARIO La interfaz de usuario presenta el aspecto que se muestra a continuación. Se muestra sobre la interfaz el significado de cada elemento. Barra de menús Barra de botones En este cuadro se cargará la imagen que vamos a analizar En este cuadro aparecerá la imagen en niveles de grises En este cuadro aparecerá el histograma de la imagen Muestra el valor umbral con el que se binarizará Muestra el nº de puntos que tiene la imagen con nivel de gris igual al umbral En este cuadro aparecerá la imagen binarizada Barra para modificar el valor umbral Muestra el nº Botón de estado de componentes conexas que tiene la imagen Figura 11. Interfaz del programa. Pestaña Imagen. Barba Riquel, Mari Carmen 31 Texturas Caracterizadas Topológicamente Botón para cargar una imagen Botón para transformar la imagen a escala de grises Botón para calcular el histograma Botón para calcular la ecualización del histograma Botón para binarizar la imagen Botón para calcular las estadísticas cargar una imagen En este cuadro se mostrarán las distintas componentes conexas en diferentes colores En este cuadro se mostrará una tabla con las estadísticas obtenidas Figura 12. Interfaz del programa. Pestaña Componentes conexas. El funcionamiento del programa es el siguiente: cargaremos la imagen con la que deseemos trabajar con el primer botón que aparece en la barra de botones. Todas las acciones que proporcionan los botones pueden realizarse a través de la barra de menús. Los botones y las opciones del menú están preparados para habilitarse en el momento adecuado, con lo cual es imposible que el usuario se pierda en el proceso. Barba Riquel, Mari Carmen 32 Texturas Caracterizadas Topológicamente Al cargar la imagen se habilita el botón de conversión a escala de grises, una vez pulsado este botón, el programa muestra la imagen convertida a niveles de gris, se deshabilitará el botón y se habilitará el siguiente botón, que en este caso será el del cálculo del histograma. Una vez mostrado el histograma podremos seleccionar el umbral de binarización mediante la barra que aparece debajo del histograma. Cuando se pulsa el botón de binarizar, se obtiene la imagen binarizada para el umbral seleccionado, y el cálculo del número de componentes conexas, que tiene la imagen. Además se pinta la imagen de componentes con un color para cada componente conexa que tiene la imagen. Se habilitará entonces el botón de estadísticas. Mientras el botón de binarizar esté marcado, se calcularán automáticamente la binarización de la imagen cuando cambie el valor del umbral. Mientras que esté marcado el botón de estadísticas, se obtendrán también las estadísticas una vez que se binarice y se calculen las componentes conexas de la imagen. El botón de ecualizar se habilita cuando se pulsa el botón del histograma. Se puede usar o no, y está activo hasta que se use. Si no se usa los cálculos se harán con el histograma normal. Si se usa, se harán los nuevos cálculos con los datos de la imagen ecualizada. De esta manera, se pueden ver resultados con la imagen original, y más tarde ecualizar y comprobar los nuevos resultados con la imagen ecualizada. Barba Riquel, Mari Carmen 33 Texturas Caracterizadas Topológicamente 9. CONCLUSIONES El MRCG es una secuencia de grafos de la forma {Ns(t)}s I tal que dado un valor s, definimos la función Ns(t) como el número de componentes conexas con un número de píxeles >=s en una imagen binarizada con un umbral t. En el peor de los casos la complejidad es casi lineal. Es un método bueno tanto para macrotexturas como para microtexturas. Es invariante respecto de la orientación. Barba Riquel, Mari Carmen 34 Texturas Caracterizadas Topológicamente 10. REFERENCIAS "Efficient Topological Characterization of Gray-Level Textures, Using a Multiresolution Representation". Graphical Models and Image Processing. Vol. 59, n. 1, 1-17, 1997 "Tratamiento digital de imágenes" González, R.C. y Woods, R.E. Editorial:Addison-Wesley/Díaz de Santos, 1996 Apuntes de Tecnologías para Imagen Documental (3º ITIG) Apuntes de Tratamiento de Imágenes (5º II) Trabajo dirigido de Texturas: Propiedades estadísticas.(José.A. Díaz-Otero Muñoz-Repiso Federico Navarro Giráldez) "Microsoft Visual Basic 5, manual del programador" Editorial: McGraw-Hill 1998 "Programación avanzada con Visual Basic 6.0" Francesco Balena Editorial: McGraw-Hill 1999 "The pocket handbook of image processing algorithms in C" Harley R. Myler, Arthur R. Weeks Editorial: Prentice Hall 1993 "Microsoft Visual Basic 6.0. Developer's Workshop. Fifth edition" John Clark Craig, Jeff Webb Microsoft Press (1998) http://www.ee.siue.edu "Color Conversion Algorithms" http://www.cs.rit.edu/~ncs/color/t_convert.html Nan C. Schaller Professor, Computer Science Department Rochester Institute of Technology Barba Riquel, Mari Carmen 35 Texturas Caracterizadas Topológicamente ANEXO I TEST 1. Si el número de componentes conexas cambia rápidamente al coger umbrales cercanos, estaremos ante una imagen... a) muy granulosa b) granulosa c) poco granulosa 2. El a) b) c) MRCG es... un método matemático para medir 4-conectividad un método para texturizar una imagen un método para caracterizar texturas 3. En la expresión {Ns(t)}s S, t es... a) el tamaño b) la textura c) el umbral 4. Los resultados obtenidos por el MRCG... a) dependen de la orientación de la imagen b) no dependen de la orientación de la imagen c) en ocasiones dependen de la orientación de la imagen 5. Si a) b) c) una textura es poco fina significa que en la imagen hay... componentes conexas grandes componentes conexas pequeñas no hay componentes conexas 6. Las texturas formadas por una repetición de elementos básicos se denominan... a) estadísticas b) estructurales c) topológicas 7. El a) b) c) MRCG se basa en... 4-conectividad 6-conectividad 8-conectividad Barba Riquel, Mari Carmen 36 Texturas Caracterizadas Topológicamente 8. Un vértice abierto en un modelo de filtro es equivalente dentro de una imagen binaria a ... a) un píxel blanco b) un píxel negro c) a ninguno de los anteriores 9. Señale cuál de estas afirmaciones es correcta: a) El MRCG es un método para caracterizar macrotexturas b) El cálculo de los grafos del MRCG es complejo pero obtenemos unos resultados muy buenos c) El cálculo de los grafos del MRCG es de orden lineal 10. ¿Es bueno realizar la ecualización del histograma antes de trabajar con la imagen? a) Sí b) No c) Depende Barba Riquel, Mari Carmen 37