Saltar a contenido

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})

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})

figure_1.png

plane_dilate = imdilate(plane,SE);

montage({plane,plane_dilate})

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})

figure_3.png

plane_erode = imerode(plane,SE);

montage({plane,plane_erode})

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})

figure_5.png

Clausura

plane_close = imclose(plane,SE);

montage({plane,plane_close})

figure_6.png

Otro ejemplo:

cells_open = imopen(cells,SE);
cells_close = imclose(cells,SE);

montage({cells,cells_open,cells_close})

figure_7.png

Comparacion entre apertura y erosion y entre clausura y dilatación

montage({plane,plane_erode,plane_open})

figure_8.png

montage({plane,plane_dilate,plane_close})

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})

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})

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})

figure_12.png

montage({cameraman_gaussiano,cameraman_close2})

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})

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})

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})

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})

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)

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})

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})

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})

figure_21.png