Tutorial y ejercicios
En esta práctica se aplica la morfología a imágenes en escala de grises. La idea geométrica sigue siendo la misma, pero ahora no se trabaja solo con objeto y fondo. La imagen puede imaginarse como una superficie de intensidades: las zonas claras tienen valores altos y las zonas oscuras tienen valores bajos. En este contexto, la dilatación tiende a tomar máximos locales y la erosión tiende a tomar mínimos locales.
Cargamos las imágenes en escala de grises que usaremos durante la sesión práctica
plane = imread("Imagenes\airplane.tif");
cells = imread("Imagenes\bloodcells.tif");
cameraman = imread("Imagenes\cameraman.tif");
butterfly = imread("Imagenes\mariposa.jpg");
montage({plane,cells,cameraman,butterfly})
_media/figure_0.png)
Operadores morfológicos primarios
En imágenes en escala de grises, la dilatación hace que las zonas brillantes se extiendan dentro del vecindario definido por el elemento estructurante. La erosión, en cambio, favorece los valores bajos y hace que las zonas oscuras ganen presencia. El efecto final depende del tamaño de las estructuras de la imagen: los detalles más pequeños que el elemento estructurante son los que se modifican con mayor facilidad.
Definición del elemento estructural a utilizar
SE = strel("disk",5);
Recordatorio! Tipos de elementos estructurales: diamond, parámetro - distancia del origen al extremo del diamante (1 para cruz); disk, parámetro - radio; line, parámetros - longitud y angulo; rectangle, parámetros - longitud y altura; square, parámetro - lado; nhood, forma definida por una matriz de 0s y 1s.
Dilatación
En escala de grises, la dilatación puede interpretarse como un filtro de máximo local. Cada píxel tiende a tomar el valor más alto de su vecindario, de modo que las zonas brillantes crecen y los detalles oscuros pequeños se reducen.
butterfly_dilate = imdilate(butterfly,SE);
montage({butterfly,butterfly_dilate})
_media/figure_1.png)
plane_dilate = imdilate(plane,SE);
montage({plane,plane_dilate})
_media/figure_2.png)
Erosión
La erosión en escala de grises equivale a observar mínimos locales dentro del vecindario. Esto hace crecer visualmente las zonas oscuras y reduce detalles brillantes pequeños. Es la operación dual de la dilatación.
butterfly_erode = imerode(butterfly,SE);
montage({butterfly,butterfly_erode})
_media/figure_3.png)
plane_erode = imerode(plane,SE);
montage({plane,plane_erode})
_media/figure_4.png)
Operadores secundarios
La apertura y la clausura también tienen una interpretación clara en escala de grises. La apertura elimina o reduce detalles brillantes pequeños, porque estos no sobreviven a la erosión inicial. La clausura actúa de forma dual y tiende a eliminar detalles oscuros pequeños o depresiones estrechas. Esto permite separar estructuras según su tamaño y su contraste respecto al entorno.
Apertura
plane_open = imopen(plane,SE);
montage({plane,plane_open})
_media/figure_5.png)
Clausura
plane_close = imclose(plane,SE);
montage({plane,plane_close})
_media/figure_6.png)
Otro ejemplo:
cells_open = imopen(cells,SE);
cells_close = imclose(cells,SE);
montage({cells,cells_open,cells_close})
_media/figure_7.png)
Comparacion entre apertura y erosion y entre clausura y dilatación
montage({plane,plane_erode,plane_open})
_media/figure_8.png)
montage({plane,plane_dilate,plane_close})
_media/figure_9.png)
Probamos el efecto sobre elementos claros u oscuros mediante usar un elemento estructural más grande.
SE = strel("disk",10);
cells_open = imopen(cells,SE);
cells_close = imclose(cells,SE);
montage({cells,cells_open,cells_close})
_media/figure_10.png)
Filtrado morfológico
El filtrado morfológico es útil cuando se desea eliminar ruido o detalles pequeños sin calcular una media de toda la imagen. A diferencia de los filtros lineales, no combina valores con pesos, sino que aplica operaciones de mínimos y máximos locales. Esto puede conservar mejor los bordes fuertes y las formas principales, siempre que el elemento estructurante esté bien escogido.
Filtros de suavizado morfológico
cameraman_sal_pimienta = imread("Imagenes\cameraman_ruido_sal_pimienta.png");
cameraman_gaussiano = imread("Imagenes\cameraman_ruido_gaussiano.png");
montage({cameraman_gaussiano,cameraman_sal_pimienta})
_media/figure_11.png)
Definimos el elemento estructural más usado para este tipo de filtros
SE1 = strel("diamond",1);
Recordad! Filtro de suavizado morfologico: Clausura de la apertura
cameraman_open1 = imopen(cameraman_sal_pimienta,SE1);
cameraman_close1 = imclose(cameraman_open1,SE1);
cameraman_open2 = imopen(cameraman_gaussiano,SE1);
cameraman_close2 = imclose(cameraman_open2,SE1);
montage({cameraman_sal_pimienta,cameraman_close1})
_media/figure_12.png)
montage({cameraman_gaussiano,cameraman_close2})
_media/figure_13.png)
Como aun hay ruido, aplicamos la tecnica de filtrado secuencial alternante.
El filtrado secuencial alternante aplica aperturas y clausuras con elementos estructurantes de tamaño creciente. La idea es eliminar ruido y detalles pequeños de varias escalas, no solo de un tamaño concreto. Hay que aplicarlo con moderación, porque también puede simplificar demasiado la imagen.
SE2 = strel("diamond",2);
cameraman_close1_open = imopen(cameraman_close1,SE2);
cameraman_close1_close = imclose(cameraman_close1_open,SE2);
montage({cameraman_sal_pimienta,cameraman_close1,cameraman_close1_close})
_media/figure_14.png)
Filtros de realce morfologico o gradiente morfologico
El gradiente morfológico mide la diferencia entre una imagen dilatada y una imagen erosionada. Cuando dentro del vecindario hay una transición fuerte de intensidad, esta diferencia es grande. Por este motivo, el gradiente morfológico resalta contornos y bordes, pero lo hace desde una perspectiva morfológica, basada en la forma y el tamaño del elemento estructurante.
Definimos el elemento estructural más usado en estos casos
SE3 = strel("square",3);
Primero gradiente morfologico interno
plane_realce_i = plane - imerode(plane,SE3);
Luego, el gradiente morfológico externo
plane_realce_e = imdilate(plane,SE3) - plane;
Y finalmente, el gradiente morfológico interno-externo
El gradiente interno resalta el lado interior del contorno, porque compara la imagen con su erosión. El gradiente externo resalta el lado exterior, porque compara la dilatación con la imagen original. El gradiente interno-externo combina ambos efectos y produce un borde más grueso.
plane_realce = imdilate(plane,SE3)-imerode(plane,SE3);
montage({plane,plane_realce_i,plane_realce_e,plane_realce})
_media/figure_15.png)
Otro ejemplo
cells_realce_i = cells-imerode(cells,SE3);
cells_realce_e = imdilate(cells,SE3)-cells;
cells_realce = imdilate(cells,SE3)-imerode(cells,SE3);
montage({cells,cells_realce_i,cells_realce_e,cells_realce})
_media/figure_16.png)
Se toma la imagen negativa para una mejor visualización
cells_realce_i_neg = 255 - cells_realce_i;
cells_realce_e_neg = 255 - cells_realce_e;
cells_realce_neg = 255 - cells_realce;
montage({cells,cells_realce_i_neg,cells_realce_e_neg,cells_realce_neg})
_media/figure_17.png)
Transformadas Top-Hat y Bottom-Hat
Las transformadas Top-Hat y Bottom-Hat comparan la imagen original con una versión simplificada obtenida con apertura o clausura. El Top-Hat destaca detalles brillantes que son más pequeños que el elemento estructurante. El Bottom-Hat destaca detalles oscuros pequeños. Estas transformaciones son muy útiles cuando se quieren detectar estructuras locales sobre un fondo que varía lentamente.
cells = imread("Imagenes\cells_internet.jpg");
cells = rgb2gray(cells);
montage(cells)
_media/figure_18.png)
Se calcula la transformada Top-Hat
El Top-Hat se calcula restando la apertura de la imagen original. Como la apertura elimina detalles brillantes pequeños, la resta deja precisamente estos detalles como respuesta destacada.
SE = strel("disk",30);
cells_top_hat = imtophat(cells,SE);
montage({cells,cells_top_hat})
_media/figure_19.png)
Se calcula la transformada Bottom-Hat
El Bottom-Hat se calcula comparando la clausura con la imagen original. Como la clausura rellena detalles oscuros pequeños, la diferencia permite resaltar estos elementos oscuros locales.
cells_bot_hat = imbothat(cells,SE);
montage({cells,cells_bot_hat})
_media/figure_20.png)
Con una clara aplicación, la binarización para el posterior etiquetado de componentes conexas
Este ejemplo muestra una idea importante en visión por ordenador: muchas veces no se segmenta directamente la imagen original. Primero se realza la información que interesa y se reducen variaciones que pueden confundir al umbral. Después, la binarización y el etiquetado de componentes conexas resultan más fiables.
cells_bin = imbinarize(cells);
cells_top_hat_bin = imbinarize(cells_top_hat);
cells_bot_hat_bin = imbinarize(cells_bot_hat);
montage({cells_bin,cells_top_hat_bin,cells_bot_hat_bin})
_media/figure_21.png)