Un filtro de color fuzzy basado en el histograma para la restauración de imágenes Procesamiento de Imágenes Digitales Trabajo realizado por: Jesús López de la Cruz Escuela Técnica Superior de Ingeniería Informática Enero de 2011 Índice Resumen .................................................................................................................. 2 Introducción ............................................................................................................. 3 Planteamiento teórico .............................................................................................. 5 Resolución práctica .................................................................................................. 6 Experimentación .................................................................................................... 14 Manual de usuario ................................................................................................. 22 Conclusiones .......................................................................................................... 26 Referencias ............................................................................................................ 27 Plan de trabajo ....................................................................................................... 29 1 Resumen En este trabajo se presenta un nuevo método para reducir el ruido impulsivo en imágenes en color. Este nuevo método se conoce como filtro de color fuzzy basado en el histograma para la restauración de imágenes (HFC). Este filtro es particularmente efectivo para reducir el ruido altamente impulsivo en imágenes digitales, a la vez que se preserva la nitidez de los bordes. Las imágenes en color que están dañadas con ruido son generalmente filtradas aplicando un algoritmo diseñado para escala de grises en cada componente de color por separado. Este enfoque causa deterioros, especialmente en los píxeles del borde y en las texturas. Los métodos de filtrado basados en vectores fueron exitosamente introducidos para superar este problema. En este documento, discutimos una técnica alternativa que tampoco introduce este tipo de defectos. La principal diferencia entre el nuevo método propuesto y los clásicos métodos basados en vectores, es el uso de las diferencias entre las componentes de color para la detección de ruido impulsivo y la preservación de dichas diferencias. La construcción del filtro HFC conlleva tres pasos: (1) la detección de ruido, (2) la estimación de las diferencias entre las componentes de color y, por último, (3) el método de filtrado. 2 Introducción Las técnicas fuzzy ya han sido aplicadas en varios dominios del procesamiento de imágenes, como son el filtrado, la interpolación [20] o la morfología [12,13]. También tienen numerosas aplicaciones prácticas, como el procesamiento de imágenes médicas e industriales [2,15]. En este documento, nos centramos en técnicas fuzzy para filtrar imágenes digitales en color. Ya han sido desarrollados varios filtros fuzzy para la reducción de ruido, como el conocido filtro FIRE [16,17,18], el filtro de la media fuzzy con ponderación adaptativa [8,9], el filtro adaptativo fuzzy del histograma [21,22], el filtro de la mediana fuzzy [1], el filtro de la semejanza fuzzy [7] y el filtro iterativo fuzzy basado en el control [4,5]. Estos filtros fuzzy están principalmente desarrollados para imágenes dañadas con ruido impulsivo. También son capaces de superar a los sistemas de filtrado por orden de clasificación (tales como el filtro de la mediana). A pesar de que estos filtros están especialmente desarrollados para imágenes en escala de grises, pueden ser extendidos a imágenes en color aplicándolos en cada componente de color por separado. Esto introduce muchos defectos, especialmente en los elementos del borde y en las texturas. Para superar estos problemas, se introdujeron varios enfoques no lineales basados en vectores. Una de las familias más importantes de filtros no lineales, que se aprovecha de la teoría de las estadísticas robustas [3,6], está basada en la ordenación de vectores en una ventana deslizante predefinida [10,11,14]. Generalmente, cuando los vectores están clasificados usando el principio de ordenación reducida por medio de una distancia ajustable o una medida de semejanza, los vectores más bajos en la clasificación son aquellos que están más cercanos a los otros vectores en la ventana, de acuerdo a la distancia o la medida de semejanza utilizada. Tres de los métodos más populares basados en vectores son: el filtro de la mediana vectorial (VMF), el filtro direccional-vectorial básico (BVDF) y el filtro de la distancia direccional (DDF). En este documento, ofrecemos un método alternativo para filtrar imágenes en color, en el que cada píxel es filtrado de acuerdo a (i) las diferencias de magnitud entre un píxel central y sus vecinos, para cada componente de color por separado, y a (ii) las diferencias entre las componentes de color, que son utilizadas para dos propósitos. El primer propósito es estimar las diferencias entre las componentes originales en cada posición, y como segundo propósito, usaremos estas diferencias estimadas para filtrar el ruido impulsivo mientras preservamos las diferencias entre las componentes de color. Por ejemplo, si podemos estimar las diferencias entre las componentes de color originales para una cierta posición, es decir, si sabemos cuál debería ser la diferencia entre la roja y la verde, la roja y la azul, y la verde y la azul, entonces podemos mejorar o modificar el mecanismo de filtrado en escala de grises que se usa en imágenes en color. Primero, podemos mejorar los métodos de detección actuales, y segundo, podemos mejorar los métodos de filtrado preservando las diferencias entre las componentes de color. El método propuesto, llamado filtro de color fuzzy basado en el histograma (HFC), incorpora estas ideas en el sentido de que las diferencias entre las componentes de color son preservadas. Este método está especialmente desarrollado para el caso del ruido impulsivo, pero debería servir como motivación para construir otros filtros que preserven el color y traten también otras clases de ruido. 3 Los dos tipos de ruido impulsivo más comunes son el ruido sal y pimienta y el ruido impulsivo de valor aleatorio [14,19]. En una imagen dañada con ruido sal y pimienta, pueden pasarle dos cosas a cada una de las componentes de un píxel: la componente (i) puede permanecer sin cambios, (ii) obtener un valor n1 o (iii) cambiar a un valor n2. En general n1 = 0 y n2 = 2m-1, siendo m la cantidad de bits utilizados para almacenar un único valor de intensidad (en nuestro caso, m = 8). Un parámetro importante es la densidad de ruido, que expresa la fracción de los píxeles de la imagen que están dañados. 4 Planteamiento teórico En este apartado, se comenta la base teórica del algoritmo propuesto en el artículo de investigación proporcionado, que luego será ampliada paso a paso con detalles de implementación en el apartado de resolución práctica. El método propuesto (HFC) consta de tres pasos diferentes: (i) la detección de ruido, (ii) la estimación de las diferencias entre las componentes de color y (iii) el método de filtrado. Paso 1. La detección de ruido. En el primer paso del método propuesto, calculamos el grado de pertenencia al conjunto de ruido fuzzy para cada componente de color en cada posición. Un grado de pertenencia uno indica que la componente observada es ruidosa con total seguridad, mientras que un grado de pertenencia cero indica que esta componente está libre de ruido con total seguridad. Un grado de pertenencia entre cero y uno indica que no sabemos con certeza si la componente es o no ruidosa. Paso 2. La estimación de las diferencias entre las componentes de color. El segundo paso del método propuesto estima las diferencias entre las componentes de color libres de ruido, es decir, entre las componentes roja-verde, roja-azul y verde-azul en cada posición de la imagen. Esto se realiza de la siguiente manera: primero observamos las diferencias de entrada en las que ambas componentes tienen un pequeño grado de pertenencia al conjunto de ruido fuzzy. Para estas diferencias, calculamos los grados de pertenencia a los tres conjuntos fuzzy pequeño, mediano y grande. Después de eso, hallamos los promedios fuzzy para los tres conjuntos fuzzy pequeño, mediano y grande sobre todas las diferencias de entrada. Finalmente, tomamos como estimación de la diferencia entre las componentes de color el valor promedio que esté más cercano a un valor de referencia predefinido. Paso 3. El método de filtrado. En el paso final del método propuesto, calculamos el valor de salida filtrado de cada componente de color en cada posición por separado. Las componentes que tienen un grado de pertenencia cero al conjunto de ruido fuzzy se dejan sin cambiar, de forma que la nitidez es conservada. Sólo las componentes que tienen un grado de pertenencia distinto de cero al conjunto de ruido fuzzy son procesadas en esta etapa. El método de filtrado combina las diferencias entre las componentes de color estimadas en el segundo paso y los grados de pertenencia al conjunto de ruido fuzzy obtenidos en el primer paso para filtrar el ruido impulsivo, mientras se preservan las diferencias entre las componentes de color. 5 Resolución práctica En esta parte del documento, se realiza una explicación detallada de cada uno de los pasos seguidos para implementar el filtro presentado en el artículo de investigación proporcionado. Para ello, se analizan paulatinamente los métodos computacionales utilizados para resolver cada paso del algoritmo. En primer lugar, hemos de hacer referencia a la herramienta ImageJ, sobre la que hemos desarrollado el filtro HFC propuesto incluyéndolo como un plugin de la misma. Esta herramienta es un programa de procesamiento de imágenes digitales de dominio público, basada en el lenguaje de programación Java. Con ella puede visualizar, editar, analizar, procesar, guardar e imprimir imágenes de 8, 16 y 32 bits, almacenadas en cualquiera de los siguientes formatos: TIFF, GIF, JPEG, BMP, DICOM, FITS y “raw”. En el apartado del manual de usuario, se explica detenidamente cómo descargar y poner en funcionamiento dicha herramienta, así como extenderla con el plugin aquí desarrollado para poder probar el filtro HFC. Restricciones Este plugin, al igual que la herramienta ImageJ a la que extiende, está implementado en el lenguaje de programación Java. Está preparado para trabajar con imágenes RGB de 24 bits, con 8 bits de almacenamiento para componente de color RGB (roja, verde y azul); de hecho, rechazará cualquier otro tipo de imagen de entrada sobre la que se intente aplicar. Debido a la propia naturaleza del algoritmo propuesto en el artículo de investigación, no podemos trabajar con imágenes en escala de grises (pero sí con imágenes en escala de grises almacenadas como RGB, que tienen la misma proporción de rojo verde y azul en cada píxel). Tampoco podemos trabajar con imágenes en color de 8 bits (en lugar de 24 bits) como espacio de almacenamiento total para cada píxel, ya que algunos pasos del algoritmo necesitan tener fijado el número de bits de almacenamiento para cada componente RGB de la imagen (m = 8 bits). Por lo tanto, cada componente de color tratada en este filtro presenta valores en el intervalo [0,2m - 1], o lo que es lo mismo, [0,255]. Además, el tamaño de las imágenes de entrada debe tener una altura y una anchura múltiplos de 5 píxeles (no tienen por qué ser cuadradas), ya que de lo contrario la aplicación excedería los límites de la imagen y se produciría un error en la ejecución del programa. Esto se debe a que, según el artículo de investigación, debemos explorar cada componente de la imagen en bloques de 5x5 píxeles durante el primer método de detección de ruido impulsivo. Por último, comentar que el ruido en los bordes no será tratado en absoluto. Esto se debe a que las fórmulas utilizadas en el artículo de investigación para detectar el ruido y filtrarlo, hacen uso de vecindarios de 3x3 y de 5x5 píxeles alrededor de cada píxel central, por lo que las dos líneas más exteriores del borde de la imagen no cumplen las condiciones necesarias para ser exploradas y tratadas de igual forma que los demás píxeles de la imagen. 6 Pasando nuevamente a la explicación del filtro, nos adentrarnos en cada uno de los tres pasos del algoritmo propuesto para explicar su funcionamiento y comentar la manera en que han sido implementados. Antes de ello, debemos comentar que las componentes de color de la imagen serán extraídas en matrices independientes con nombres cR, cG y cB. Paso 1. La detección de ruido. El primer paso del método propuesto es construir un conjunto de ruido fuzzy. Los conjuntos fuzzy están normalmente representados por funciones de pertenencia, de las que podemos derivar los grados de pertenencia. Si un píxel, por ejemplo, tiene un grado de pertenencia uno (cero) en el conjunto de ruido fuzzy, significa que este píxel está considerado como ruidoso (libre de ruido) con total seguridad. Los grados de pertenencia entre cero y uno indican que no sabemos con certeza si tal píxel es o no ruidoso, por lo que existe cierta incertidumbre. Para más información acerca de la lógica fuzzy (lógica difusa), nos remitimos a la referencia [16]. Este conjunto de ruido fuzzy es implementado mediante tres matrices del mismo tamaño que la imagen, una para componente de color (fR, fG y fB). El contenido en cada posición de una matriz se corresponde con un valor en el intervalo [0,1], representando la probabilidad de que el valor de esa componente del píxel en dicha posición sea considerada como ruido. Así que la meta es derivar los grados de pertenencia al conjunto de ruido fuzzy para cada componente de color de la imagen. El cálculo de estos grados de pertenencia depende del tipo de ruido impulsivo, que puede ser de valor fijo o de valor aleatorio (se ha implementado un método de detección para cada tipo de ruido). Tras ejecutar el método de detección de ruido impulsivo de valor fijo (a), debe existir algún valor de intensidad con grado de pertenencia uno al conjunto de ruido fuzzy. De lo contrario, podemos concluir que la imagen no está dañada con ruido impulsivo de valor fijo, por lo que tendremos que lanzar el segundo método de detección (b). Este segundo método de detección está diseñado para encontrar ruido impulsivo de valor aleatorio, y sólo se ejecuta si no se ha detectado ruido impulsivo de valor fijo. (a) Método de detección de ruido impulsivo de valor fijo. En este subapartado, explicamos la detección de ruido impulsivo de valor fijo y el cálculo de las correspondientes funciones de pertenencia al conjunto de ruido fuzzy para cada componente de color de la imagen. Primero calculamos, para cada componente de color, un histograma con los valores de intensidad más propensos a estar dañados con ruido impulsivo. Estos histogramas, denotados en el código como hRnoise, hGnoise y hBnoise, se implementan mediante la clase SortedMap de Java, que permite asociar un valor (ocurrencias) a cada clave (intensidad) contenida en el objeto. El cálculo de estos histogramas de ruido se realiza mediante los siguientes pasos, llevados a cabo por una función denominada en el código calcNoiseHistogram, que actúa sobre una componente de color RGB: 7 (1) Dividimos la componente de color en bloques de tamaño 5x5 píxeles. Estos bloques se implementan mediante la clase List de Java, es decir, mediante una lista de 25 elementos enteros. Esto conlleva la restricción de que las imágenes deben tener una altura y una anchura múltiplos de 5 píxeles (no tienen por qué ser cuadradas), ya que de lo contrario la aplicación excedería los límites de la imagen y se produciría un error en la ejecución del programa. (2) Para decidir qué valores de intensidad de cada bloque deberían ser incluidos en el histograma de ruido, determinamos los valores máximo, mínimo, mediana y media de cada bloque. Estos valores máximo y mínimo, dentro de cada bloque, serán incluidos en el histograma de ruido si distan mucho de la mediana o de la media del bloque. La idea que se esconde tras este cálculo es que el ruido impulsivo en una ventana local (bloque) puede ser normalmente identificado por los valores máximo y mínimo de intensidad, ya que el valor de los píxeles dañados con ruido impulsivo de valor fijo es generalmente extremo comparado con los otros valores de intensidad de la ventana. Esto explica por qué todos los filtros basados en la mediana reducen el ruido impulsivo bastante bien. Con los tres histogramas de ruido obtenidos, finalmente calculamos las tres funciones de pertenencia fR, fG y fB correspondientes, que como explicamos anteriormente son tres matrices con los grados de pertenencia de cada componente de color al conjunto de ruido fuzzy. Estas matrices son calculadas mediante la función del código calcMembersDegrees, a la que se le pasa cada componente de color y su histograma de ruido como parámetro. El cálculo del grado de pertenencia de un valor de intensidad k, para cada componente de color, se realiza mediante la siguiente función: Los valores utilizados en el eje de abscisas para cada k se calculan con la siguiente fórmula: ℎ𝑁𝑜𝑖𝑠𝑒(𝑘) ∑255 ℎ𝑁𝑜𝑖𝑠𝑒(𝑙) 𝑙 8 (b) Método de detección de ruido impulsivo de valor aleatorio. En esta sección, explicamos dos métodos de detección combinados que se usan en el caso del ruido impulsivo de valor aleatorio, es decir, si no se ha detectado ruido impulsivo de valor fijo. El propósito de estos métodos de detección es determinar los grados de pertenencia para todos los valores de intensidad por separado (para cada componente de color en cada posición). Los métodos de detección se explican para una componente concreta, pero son aplicados de la misma forma sobre las otras dos. (i) Primer método de detección. El primer método de detección utiliza la diferencia media de un vecindario de tamaño 3x3 píxeles con respecto al píxel central en cada posición de la componente. Esta diferencia media de intensidades se almacena en una matriz o2 con el mismo tamaño de la imagen, en la que cada posición guarda el valor de la diferencia media entre el píxel de esa posición y sus vecinos. Para ello, se implementa la función calculateO2, que recibe como parámetro de entrada la componente en cuestión, así como la matriz o2 que va rellenando conforme se va llamando a la función para cada píxel de la componente. Como dijimos anteriormente, los bordes no serán tratados a la hora de detectar el ruido (ni a la hora de ser filtrados), debido a que no cumplen las condiciones necesarias de vecindad para utilizar las fórmulas de exploración que aparecen en el artículo de investigación. Para los píxeles del borde, el valor en la matriz o2 será igual a 0. Los píxeles de la imagen que estén dañados con ruido impulsivo generalmente tendrán grandes valores o2, ya que estos píxeles tendrán intensidades muy distintas a las de su vecindario. Sin embargo, algunas regiones como los bordes también tienen grandes valores de diferencia media con respecto a sus vecinos. Por tanto, emplearemos un nuevo valor o1 para distinguir los píxeles frontera de los píxeles ruidosos. Este valor se halla mediante la función calculateO1, que de la misma forma que la anterior almacena en una matriz o1 la media de las diferencias medias (o2) para cada píxel de la componente. Además, en cada llamada al método calculateO1, aparte del cálculo del valor o1 correspondiente, se hallará un valor mínimo (también en una matriz del tamaño de la imagen) para cada píxel de la componente. Este valor mínimo será utilizado para calcular los valores a y b correspondientes a cada píxel de la componente, usados como en el caso del ruido de valor fijo para definir los grados de pertenencia de cada valor de intensidad al conjunto de ruido fuzzy. El valor del parámetro a proviene de la región más homogénea alrededor de un píxel central, que correspondería a la región con la menor cantidad de píxeles dañados con ruido impulsivo. Los resultados experimentales muestran que el valor de b debe calcularse como b = 1.2 · a, es decir, cuanto mayor sea a, mayor será el intervalo de incertidumbre comprendido entre a y b. Aquí los píxeles del borde también tendrán valor o1 igual a cero y valor mínimo igual a 1, por el mismo motivo anteriormente comentado. Un píxel puede ser considerado como un píxel frontera si los valores o1 y o2 asociados son grandes, mientras que un píxel que tenga una gran diferencia entre o1 y o2 es considerado como ruido. 9 Con estos valores calculados para cada valor de intensidad k, obtenemos finalmente los grados de pertenencia al conjunto de ruido fuzzy para una componente de color, obtenidos por medio del primer método. Estos grados de pertenencia se almacenan en una matriz auxiliar conocida como nNoise, y son hallados de forma similar a los grados de pertenencia obtenidos mediante el método de detección de ruido impulsivo de valor fijo: Los valores utilizados en el eje de abscisas para cada valor de intensidad se calculan con la siguiente fórmula: |𝑜1 − 𝑜2 | Por último, falta comentar que este primer método de detección está implementado en la función calcAleatMembersDegreesM1 presente en el código, que a su vez utiliza otras funciones auxiliares menos relevantes. (ii) Segundo método de detección. En el segundo método de detección, usamos la misma ventana de tamaño 3x3 alrededor de cada píxel de la componente (aquí también explicamos el método para una componente, siendo análogo para las otras dos componentes). Para los ocho vecinos alrededor de cada píxel, calculamos el valor gradiente definido como la diferencia de intensidad entre el vecino en una dirección (N, NE, E, SE, S, SW, W, NW) y el píxel central de la ventana. Además de los ocho valores gradientes, denominados gradientes básicos, también usamos dos valores gradientes relativos para cada dirección, que se calculan a partir de los dos píxeles ortogonalmente adyacentes al central según la dirección del gradiente básico y sus vecinos en la dirección que corresponda. Estos gradientes quedan contenidos en la matriz de cuatro dimensiones gradients, siendo el gradiente básico gradients[i][j][0][k], y los gradientes relativos gradients[i][j][1][k] y gradients[i][j][2][k], en la dirección k para el píxel situado en la posición (i,j). Para cada dirección, finalmente se calcula un grado de pertenencia al conjunto auxiliar de ruido impulsivo fuzzy, implementado como tDNoise, y al conjunto auxiliar libre de ruido impulsivo, tDFree. Estos conjuntos auxiliares se implementan mediante una matriz de tres dimensiones (altura, anchura, dirección). Como el cálculo de los gradientes relativos implica la utilización de elementos contenidos en una ventana de 10 5x5 alrededor de un píxel central, volvemos a perder información relevante en los bordes. Por lo tanto, tenemos que asignar valores tDNoise = 0 y tDFree = 1 en las dos líneas exteriores del borde de la imagen, de forma que en la combinación de ambos métodos de detección los bordes no sean tomados como ruido. Para el caso de los píxeles interiores, exploramos cada píxel y, si el gradiente básico es grande y los gradientes relativos son pequeños o viceversa, el valor de tDNoise en la posición del píxel será igual a uno. Por el contrario, si el gradiente básico es grande y los gradientes relativos también lo son o los tres gradientes son pequeños, el valor de tDFree en la posición del píxel tendrá un grado de pertenencia uno al conjunto libre de ruido impulsivo fuzzy. Este apartado del artículo de investigación es muy confuso, ya que explica que para realizar estos cálculos se hace uso de operaciones producto y de sumas probabilísticas, así como de negadores estándar (Nx = 1 - x). En cambio, las reglas fuzzy asociadas para asignar valores a los conjuntos fuzzy de ruido impulsivo y libre de ruido impulsivo, realizan la asignación de valores de una manera más simple. Para definir lo que es grande y lo que no, se utilizan unos valores a y b, de forma que un valor es grande si es mayor que b. En este caso, a se calcula a partir de la matriz o2 descrita anteriormente, mientras que b vuelve a ser b = 1.2 · a. La salida del segundo método de detección, como ya hemos mencionado, está compuesta por los ocho grados de pertenencia al conjunto de ruido impulsivo fuzzy, así como los ocho grados de pertenencia al conjunto libre de ruido impulsivo fuzzy en cada una de las ocho direcciones alrededor de cada píxel central. (iii) Combinación de ambos métodos de detección. Finalmente, combinamos ambos métodos de detección para calcular el grado de pertenencia final al conjunto de ruido fuzzy para cada píxel de cada componente. Para cada píxel, si el sumatorio de sus valores tDNoise en cada dirección es mayor que el sumatorio de valores tDFree en cada dirección, entonces se le asigna un grado de pertenencia al conjunto de ruido fuzzy igual al valor de nNoise hallado en el primer método de detección. En caso contrario, este píxel tiene un grado de pertenencia al conjunto de ruido fuzzy igual a cero (no es ruidoso en absoluto). Estos grados de pertenencia finales al conjunto de ruido fuzzy se asignan a las mismas matrices creadas para tal fin en el método de reducción de ruido impulsivo de valor fijo: fR, fG y fB. Por último, falta comentar que este segundo método de detección está implementado en la función calcAleatMembersDegreesM2 presente en el código, que a su vez utiliza otras funciones auxiliares menos relevantes. 11 Paso 2. La estimación de las diferencias entre las componentes de color. Como mencionamos al principio, no filtramos las componentes por separado, sino que usamos la información acerca de las diferencias entre las componentes de color. Por tanto, se calculan las siguientes matrices, del mismo tamaño que la imagen original: mRG = cR - cG mRB = cR - cB mGR = -mRG mGB = cG - cB mBR = -mRB mBG = -mGB Estas matrices son usadas para estimar los histogramas de las diferencias de color (rojaverde, roja-azul y verde-azul). Explicaremos cómo se calcula el histograma de diferencias, que tiene un rango de diferencias entre -255 y +255, para un par de componentes en concreto. Cada diferencia entre dos componentes se incluye en el histograma si, y sólo si, el grado de pertenencia al conjunto fuzzy de ruido para ambas componentes es igual a cero. En el caso roja-verde, por poner un ejemplo más claro, si fR(i,j) = 0 y fG(i,j) = 0, entonces añadimos al histograma las diferencias mRG(i,j) y mGR(i,j). Los tres histogramas obtenidos hRG, hRB y hGB se usan para configurar algunos parámetros necesarios para calcular la pertenencia a los conjuntos fuzzy pequeño, mediano y grande, durante la estimación de las diferencias entre las componentes de color. Éstos parámetros se obtienen por medio de la función calcParameters del código, tal y como se detalla en el artículo de investigación proporcionado, haciendo uso de funciones como la densidad potencial, la masa o el centroide de los histogramas. Sin más preámbulos, pasaremos a explicar el método de estimación de las diferencias entre las componentes de color, implementado en la función del código estimateDiff. Para simplificar, transferimos los valores de las matrices de diferencias del intervalo [-255,255] al [0,1], mediante la función transferInterval1. Se utilizan ventanas de tamaño 3x3 para analizar las matrices normalizadas, siendo el valor de salida de este método el valor estimado de la diferencia que debería de haber entre las dos componentes de entrada del método. Los elementos de la ventana antes mencionada, implementada como window, son utilizados para calcular los tres grados de pertenencia a los conjuntos fuzzy pequeño, mediano y grande. Esto se realiza mediante funciones de pertenencia con forma de campana que utilizan los parámetros que mencionamos anteriormente, calculados a partir de los histogramas de las diferencias entre componentes. De forma paralela, calculamos el grado de pertenencia de cada elemento de la ventana al conjunto fuzzy libre de ruido, a partir de las funciones de pertenencia al conjunto de ruido fuzzy de cada componente involucrada en la operación. 12 A continuación, calculamos los pesos fuzzy asociados a cada uno de los tres conjuntos antes calculados, a partir de los conjuntos y del conjunto libre de ruido antes mencionado. Estos pesos indican los grados de pertenencia de cada elemento de la ventana a los conjuntos fuzzy pequeño, mediano y grande. Finalmente, calculamos los promedios fuzzy con los valores de entrada normalizados, tras lo que se determina el valor de salida del método. La salida es igual al promedio fuzzy más cercano al valor de la diferencia de referencia, denominada en el código refDifference. En el caso excepcional en que el valor de referencia se encuentre justo entre dos promedios fuzzy, el valor de salida es igual a aquel promedio fuzzy que tenga un sumatorio mayor de pesos fuzzy. Si esta suma también es igual, tomamos como valor de salida la media entre ambos promedios fuzzy. La diferencia de referencia se calcula generalmente (cuando el denominador es distinto de cero) como sigue: 𝑟𝑒𝑓𝐷𝑖𝑓𝑓𝑒𝑟𝑒𝑛𝑐𝑒 = ∑9𝑘=1 𝑟𝑔𝑘 · 𝑚𝑘 ∑9𝑘=1 𝑚𝑘 Para terminar con la explicación de este paso, transformamos los valores de salida normalizados al intervalo [-255,255], mediante la función del código transferInterval2. Estos valores de salida son usados más adelante durante el método de filtrado, de forma que se preservan las diferencias entre las componentes de color. Paso 3. El método de filtrado. Las diferencias de intensidad calculadas en un vecindario local alrededor en un píxel central en cada posición de las diferencias entre dos componentes, son finalmente utilizadas para filtrar las componentes de color que están dañadas con ruido impulsivo. Cada componente de color que tenga un grado de pertenencia cero al conjunto de ruido fuzzy se verá como una componente libre de ruido y no será filtrada en absoluto. Así que sólo las componentes que tengan un grado de pertenencia distinto de cero al conjunto de ruido fuzzy serán cambiadas. El método de filtrado, llevado a cabo por la función filter en el código, distingue cuatro casos diferentes para sustituir el valor de un píxel ruidoso: Las otras dos componentes son ruido en esa posición. La primera de las otras dos componentes tiene ruido en esa posición. La segunda de las otras dos componentes tiene ruido en esa posición. Ninguna de las otras dos componentes tienen ruido en esa posición. 13 Experimentación En este apartado de la documentación, se hace referencia a todas las pruebas realizadas con el programa, así como a los comentarios y opiniones que derivan de dichas pruebas. Antes de comenzar, hemos de señalar que el filtro no funciona como se esperaba de él, a pesar de haber seguido minuciosamente todos los pasos del algoritmo. Es por ello que se muestra un mensaje, tras aplicar el filtro sobre una imagen, para informar a cualquier usuario del problema en cuestión. Por favor, lea las restricciones comentadas al principio de la resolución práctica para saber el tipo de imágenes que acepta el filtro HFC aquí implementado. Tras realizar algunas pruebas, hemos visto que el filtro no funciona con imágenes en formato GIF, debido a que no presentan las características de una imagen RGB de 24 bits, con 8 bits por cada componente de color. Además, hemos comprobado que una misma imagen guardada en PNG y en JPEG (con su mejor calidad), es mejor tratada en el primer formato, por la forma inherente en que se guarda la información. Pruebas con ruido aleatorio de valor fijo Prueba 1. Original Imagen filtrada Como se puede observar, se ha eliminado una pequeña parte de ruido impulsivo de valor fijo. 14 Prueba 2. Original Imagen filtrada En este caso, se ha eliminado una enorme cantidad de ruido impulsivo de valor fijo, comparado con la prueba uno. Además, podemos ver que los píxeles que no ha filtrado bien han sido sustituidos por valor negro. Prueba 3. Original Imagen filtrada Con un fondo negro, se ha conseguido eliminar la totalidad del ruido impulsivo de valor fijo, a pesar de la multitud de colores utilizados para componer la capa de ruido (8 en total). 15 Prueba 4. Original Imagen filtrada Ahora, hemos aplicado el filtro a una imagen con un fondo degradado simple. El filtro, lejos de eliminar el ruido, crea aún más ruido en la imagen debido a las variaciones de intensidad, que afectan a los histogramas de la misma. Prueba 5. Original Imagen filtrada Sobre una imagen con pocos colores (3 en total), el filtro ha eliminado el ruido de algunos valores de intensidad concretos, cambiando el resto por negro o rojo. Sin embargo, el ruido sigue presente en la imagen. Si utilizamos menos colores de ruido, a veces los consigue eliminar totalmente. 16 Prueba 6. Original Imagen filtrada En esta imagen en escala de grises, ha introducido más ruido en algunas partes, pero también es cierto que lo ha disminuido considerablemente en otras. Los píxeles ruidosos han sido sustituidos por diferentes tonos de gris. Prueba 7. Original Imagen filtrada Al utilizar una imagen en tres dimensiones con pocos colores, ha reducido bastante el ruido. De hecho, también ha conseguido disimularlo, al sustituir los píxeles ruidosos por colores parecidos a los de la imagen. 17 Prueba 8. Original Imagen filtrada En la imagen del desierto, vemos como ha conseguido eliminar la mayor parte del ruido, o al menos ha conseguido cambiarlo por tonos más parecidos a los de la imagen. Se ve que algunos valores de intensidad de ruido son filtrados completamente. Prueba 9. Original Imagen filtrada En esta ocasión, esta imagen con distintos tonos de azul ha sido empeorada con el filtro. A pesar de que, como siempre, ha conseguido sustituir el ruido por colores de la imagen, ha introducido mucho ruido que antes no estaba presente. 18 Prueba 10. Original Imagen filtrada En la imagen del césped, podemos ver que ha filtrado el ruido bastante bien. Quizá sea porque hay bastante contraste, lo que hace que no se aprecien tantas diferencias con respecto al fondo. Prueba 11. Original Imagen filtrada En esta imagen, ha conseguido disimular bastante el ruido con respecto al fondo, aunque ha introducido más ruido del que había. 19 Prueba 12. Original Imagen filtrada Con esta imagen pasa algo similar a lo que sucede con la del césped, es decir, ha filtrado bastante bien el ruido, pero la cantidad de texturas rugosas de la imagen permite apreciar pocas zonas claramente afectadas con ruido. Prueba 13. Original Imagen filtrada De nuevo, los contrastes en la imagen ocultan un poco la adición de ruido en la imagen. En el fondo negro, por el contrario, se ha eliminado el ruido bastante bien. 20 Prueba 14. Original Imagen filtrada En este caso, la imagen ha sido filtrada con bastante efectividad, lo que puede apreciarse a simple vista. Aun así, no ha conseguido eliminar totalmente el ruido, pero lo ha asemejado a los colores de la imagen. Prueba 15. Original Imagen filtrada En esta última, como en el caso del degradado simple, se ha introducido ruido en algunas partes de la imagen. Sin embargo, hay otras partes (sobre todo las oscuras) que han sido bien filtradas. 21 Manual de usuario Para probar el plugin aquí desarrollado, que implementa el filtro HFC propuesto en el artículo de investigación, es necesario descargar la herramienta ImageJ a partir del siguiente enlace: http://rsbweb.nih.gov/ij/download.html Una vez descargado e instalado esta potente aplicación de tratamiento de imágenes digitales, se puede proceder a incluir el nuevo plugin. Para ello, acceder a la carpeta “plugins”, ubicada en el directorio en el que haya instalado el software. Una vez dentro, copie en dicha carpeta el archivo del plugin que hemos desarrollado. Sólo es necesario copiar el archivo Filtro_HFC.class, aunque si le resulta tedioso saber cuál de los dos ficheros es, puede añadir ambos archivos (ya que añadir el archivo Filtro_HFC.java no causará defecto alguno en ImageJ). Cuando todo esté preparado, puede lanzar el ejecutable de ImageJ y realizar los pasos que se detallan a continuación: 1) Esta es la pantalla inicial que muestra ImageJ: 22 2) Haga clic en File > Open... para abrir un archivo de imagen: 3) Acto seguido, seleccione la imagen que desea filtrar y pulse Aceptar: 23 4) Aparecerá la imagen cargada sobre la pantalla de su ordenador: 5) Ahora haga clic en Plugins > Filtro_HFC para aplicar el filtro: 24 6) Le aparecerá un mensaje en pantalla, léalo detenidamente: 7) Pulse OK para ver el resultado del filtro sobre la imagen seleccionada: Con este sencillo manual, ya sabe cómo añadir a ImageJ este filtro desarrollado en Java. Si desea añadir otro plugin, sólo tiene que añadir los archivos correspondientes, de la misma forma que aquí se ha detallado. Para hacerlo funcionar, siga estos mismo pasos. 25 Conclusiones Como se ha podido comprobar en el apartado de experimentación, este filtro no funciona con la eficacia que se esperaba de él, después de haber escrito cerca de 1400 líneas de código. Aun así, tampoco funciona del todo mal con según qué imágenes reciba como entrada. En general, este filtro añade un poco más de ruido a la imagen; esto es así debido al uso de la lógica fuzzy para determinar la probabilidad de ruido de los píxeles. El valor de los píxeles filtrados toma valores parecidos a los valores de entrada, y no simplemente los valores de los píxeles vecinos como hace el filtro de la mediana; esto surge de la utilización de los histogramas y de las diferencias entre las componentes de color RGB. Por último, se ha podido comprobar que las zonas oscuras y la mayoría de imágenes rugosas consiguen un efecto de filtrado bastante aceptable. Además, el negro es el color “favorito” para el plugin aquí desarrollado, lo cual queda evidenciado en la prueba sobre un fondo simple negro. Tras estudiar el artículo de investigación, implementar el algoritmo que explica y desarrollar la documentación del mismo, consideramos cumplido el objetivo fundamental de este proyecto: desarrollar conceptos tratados en clase y profundizar en el campo de la restauración de imágenes digitales. Las dificultades encontradas en el proceso de implementación del algoritmo nos han servido para adquirir un mayor dominio del lenguaje de programación Java, así como en el desarrollo de plugins para aplicaciones de terceros como ImageJ. Tras desarrollar totalmente la aplicación, hemos detectado varias carencias que consideramos que podrían mejorar el funcionamiento general del filtro. Una de ellas es el tratamiento de los bordes, para los que, como comentamos en su momento, faltaban vecinos que permitieran calcular los mismo aspectos que para otros píxeles de la imagen (en el artículo ni siquiera se hacía referencia a los bordes). Otro aspecto mejorable podría ser la restricción de que la imagen tenga altura y anchura múltiplos de 5, debido al recorrido de la misma en ventanas de 5x5 píxeles, lo cual podría cambiarse por ventanas de otro tamaño u otros métodos de recorrido más complejos. Por último, queríamos resaltar que gracias a este primer contacto con el procesamiento de imágenes digitales, hemos tenido la oportunidad de conocer este campo de nuestra profesión que nos era bastante desconocido. Nos ha aportado nuevos conocimientos y maneras de enfrentarse a los problemas reales de computación, así como experiencias útiles para nuestro posterior desarrollo profesional. 26 Referencias A continuación, se anexan una serie de referencias relacionadas con el artículo de investigación: [1] K. Arakawa, Fuzzy rule-based image processing with optimization, in: E. Kerre, M. Nachtegael (Eds.), Fuzzy Techniques in Image Processing, Springer-Verlag, New York, 2000, pp. 222–247. [2] S. Bothorel, B. Bouchon, S. Muller, A fuzzy logic-based approach for seniological analysis of nicrocalcification in nianiniographic images, International Journal of Intelligent Systems 12 (1997) 819–843. [3] H.A. David, H.N. Nagaraja, Order Statistics, third ed., Wiley, New York, 2003. [4] F. Farbiz, M.B. Menhaj, A fuzzy logic control based approch for image filtering, in: E. Kerre, M. Nachtegael (Eds.), Fuzzy Techniques in Image Processing, Springer-Verlag, New York, 2000, pp. 194–221. [5] F. Farbiz, M.B. Menhaj, S.A. Motamedi, Edge preserving image filtering based on fuzzy logic, in: Proceedings of the 6th EUFIT conference, 1998, pp. 1417–1421. [6] P.J. Huber, Robust Statistics, Wiley, New York, 1981. [7] I. Kalaykov, C. Tolt, Real-time image noise cancellation based on fuzzy similarity, in: M. Nachtegael, D. VanderWeken, D. VanDe-Ville, E.E. Kerre (Eds.), Fuzzy Filters for Image Processing, Springer-Verlag, Heidelberg, 2003, pp. 54–71. [8] C.S. Lee, Y.H. Kuo, P.T. Yu, Weighted fuzzy mean filters for image processing, Fuzzy Sets and Systems 89 (1997) 157–180. [9] C.S. Lee, Y.H. Kuo, Adaptive fuzzy filter and its application to image enhancement, in: E. Kerre, M. Nachtegael (Eds.), Fuzzy Techniques in Image Processing, Springer-Verlag, New York, 2000, pp. 172–193. [10] R. Lukac, K.N. Plataniotis, A.N. Venetsanopoulos, B. Smolka, A statistically-switched adaptive vector median filter, Journal of Intelligent and Robotic Systems 42 (4) (2005) 361–391. [11] R. Lukac, B. Smolka, K. Martin, K.N. Plataniotis, A.N. Venetsanopoulos, Vector filtering for color imaging, IEEE Signal Processing Magazine 22 (1) (2005) 74–86. [12] M. Nachtegael, E.E. Kerre, Connections between binary, gray-scale and fuzzy mathematical morphologies, Fuzzy Sets and Systems 124 (2001) 73–85. [13] M. Nachtegael, E.E. Kerre, Decomposing and constructing fuzzy morphological operations over alpha-cuts: continuous and discrete case, IEEE Transactions on Fuzzy Systems 8 (2000) 615–626. 27 [14] K.N. Plataniotis, A.N. Venetsanopoulos, Color Image Processing and Applications, Springer, Berlin, 2000. [15] B. Reusch, M. Fathi, L. Hildebrand, Fuzzy color processing for quality improvement, in: International Forum on Multimedia and Image Processing, 1998, pp. 841–848. [16] F. Russo, C. Ramponi, A fuzzy operator for the enhancement of blurred and noisy images, IEEE Transactions on Image Processing 4 (1995) 1169–1174. [17] F. Russo, C. Ramponi, A fuzzy filter for images corrupted by impulse noise, IEEE Signal Processing Letters 3 (1996) 168–170. [18] F. Russo, Fire operators for image processing, Fuzzy Sets and Systems 103 (2) (1999) 265– 275. [19] S. Schulte, M. Nachtegael, V. De Witte, D. Van der Weken, E.E. Kerre, A fuzzy impulse noise detection and reduction method, IEEE Transactions on Image Processing 15 (5) (2006) 1153–1162. [20] D. Van de Ville, W. Philips, I. Lemahieu, Fuzzy-based motion detection and its application to de-interlacing, in: E. Kerre, M. Nachtegael (Eds.), Fuzzy Techniques in Image Processing, Springer-Verlag, New York, 2000, pp. 337–369. [21] J.H. Wang, H.C. Chiu, An adaptive fuzzy filter for restoring highly corrupted images by histogram estimation, Proceedings of the National Science Council ROC(A) 23 (1999) 630– 643. [22] J.H. Wang, W.J. Liu, L.D. Lin, An histogram-based fuzzy filter for image restoration, IEEE Transactions on Systems man and cybernetics part B-cybernetics 32 (2) (2002) 230–238. 28 Plan de trabajo Se incluye el plan de trabajo detallado. Actividades: Actividad 1: Comprensión del problema y búsqueda de información. Actividad 2: Implementación. Actividad 3: Documentación. Actividad 4: Pruebas. Fecha 14/12/2010 15/12/2010 16/12/2010 20/12/2010 21/12/2010 21/12/2010 22/12/2010 22/12/2010 23/12/2010 23/12/2010 26/12/2010 26/12/2010 27/12/2010 27/12/2010 28/12/2010 28/12/2010 29/12/2010 29/12/2010 30/12/2010 02/01/2011 02/01/2011 03/01/2011 03/01/2011 04/01/2011 04/01/2011 07/01/2011 07/01/2011 Inicio 10.30 15.30 15.00 15.30 9.30 15.00 9.30 15.30 9.30 15.00 9.00 15.30 9.00 15.00 10.00 15.00 9.00 15.00 11.00 10.45 15.00 9.30 17.00 9.30 17.00 9.00 15.00 Fin 13.30 19.00 18.30 19.30 14.00 21.00 14.00 20.00 14.00 21.00 14.00 20.00 14.00 20.30 14.30 20.30 14.00 21.00 13.30 13.30 21.00 14.00 20.00 14.00 20.00 14.00 21.00 Tiempo (min) 180 210 210 240 270 360 270 270 270 360 240 270 240 330 270 330 240 360 150 165 360 270 300 270 300 240 360 Actividad 1 1 1 1 1 1 2 2 2 2, 3 2, 3 2, 3 2, 3 2, 3 2, 3 2, 3 2, 3 2, 3 2, 3 2, 3 2, 4 3, 4 4 4 4 4 3 29