inmensia |
Erode y Dilate
Juan Mellado, 1 Diciembre, 2011 - 18:26
Erosión y Dilatación son dos operadores morfológicos que se aplican dentro del campo del procesamiento de imágenes para encontrar mínimos y máximos locales. Su principio de funcionamiento consiste en recorrer todos los pixels de una imagen con una ventana deslizante de tamaño fijo, y para cada pixel calcular el mínimo (erosión) o máximo (dilatación) de entre todos los pixels cubiertos por la ventana. He creado una sencilla implementación en JavaScript, y un pequeño programa para poder comprobar el resultado de una forma visual. El programa genera una nueva imagen de forma aleatoria cada cinco segundos, la convierte a escala de grises, y le aplica erosión y dilatación. Como nota personal, comentar que la imagen resultante de la dilatación la encuentro bastante "festiva". El aumento del tamaño de los puntos los hace parece un montón de confeti cayendo. Con respecto a la implementación, he utilizado un tamaño fijo de ventana de 3x3, de forma que para cada pixel de la imagen se busca el mínimo (o máximo) para los nueve pixels cubiertos por la ventana. No obstante, para ser más estrictos con la definición formal de estos operadores, tendría que haber tenido en cuenta un parámetro de entrada que se conoce como elemento estructurante. Este parámetro es una matriz con el mismo tamaño que la ventana, es decir un array de 3x3 en mi caso, con valores que pueden ser 0 ó 1. Los valores a 0 indican que los pixels vecinos correspondientes no se tienen que tener en cuenta para el cálculo, y los valores a 1 que si se tienen que tener en cuenta. En mi caso quería tener en cuenta todos los vecinos, que es lo mismo que considerar un array con todos sus valores a 1, por lo que he podido obviarlo. De igual forma que he obviado el cálculo en el borde de la imagen para simplificar la implementación. Como se observa en las imágenes que se van generando, parece que en la erosión desaparece el ruido debido a los puntos aleatorios, mientras que en la dilatación se acentúa. Pero en realidad es un poco más complejo. Lo que se pierde son los valores altos cercanos a valores bajos en la erosión, y los valores bajos cercanos a valores altos en la dilatación. Pensando en ceros y unos se entiende más fácilmente. ![]() No obstante, hay que tener en cuenta que los operadores morfológicos se comportan "visualmente" de forma distinta sobre imágenes binarias (blanco y negro) que sobre imágenes en escala de grises. En las imágenes binarias la erosión "reduce" y la dilatación "aumenta". En las imágenes de escala de grises no necesariamente. La explicación es que en las imágenes binarias el valor 0 normalmente lo hacemos corresponder mentalmente con el color negro del fondo y el 1 con el blanco del frente. Al erosionar un imagen binaria se toma el mínimo que es el 0, por lo que desaparece el frente y hay más color de fondo. Pero en un imagen de escala de grises con el fondo claro mentalmente lo hacemos al revés. Esperamos que desaparezca el punto oscuro de frente y prevalezca el fondo claro, pero como el color de frente es "menor" (negro = valor 0) entonces lo que se consigue es el efecto contrario. Si alguien está pensando que las imágenes que se están generando automáticamente en este post están invertidas con respecto a lo que debería salir teniendo en cuenta la explicación que he puesto... ¡tiene razón! Me he tomado la licencia de invertirlas para que el resultado sea más intuitivo de entender. Erosionar adegalza. Dilatar engorda. En la práctica es sólo una mera búsqueda de mínimos y máximos. Por último, una característica a tener en cuenta de estos operadores es que se pueden aplicar varias veces seguidas, para erosionar o dilatar una imagen ya previamente erosionada o dilatada. Y que se pueden mezclar tomando la salida de uno como entrada de otro. De hecho, aplicar una dilatación después de una erosión se llama "apertura" (opening), y aplicar una erosión después de una dilatación se llama "cierre" (closing"). ¿No encontró lo que buscaba?Utilice el buscador para encontrar más páginas en esta web o en toda Internet. |