Un filtro de color fuzzy basado en el histograma para la

Anuncio
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
Descargar