ImageJ: Operaciones morfológicas#

Hide code cell content
%load_ext autoreload
%autoreload 2

# Default imports
import sys
sys.path.append('../../../')
from helpers import *
from matplotlib import pyplot as plt
from myst_nb import glue
import numpy as np
from scipy import ndimage

Introducción#

El submenú Process ‣ Binary de ImageJ contiene varios comandos útiles para trabajar con imágenes binarias, incluyendo algunas de las operaciones morfológicas que hemos visto.

Sin embargo, hay otras operaciones morfológicas útiles al acecho en otros lugares - aunque la mayoría requieren plugins adicionales, o cambiar a Fiji.

Erosión, dilatación, apertura y cierre#

Process ‣ Binary contiene los comandos Erode, Dilate, Open y Close-.

Estos son relevantes aquí, pero mi consejo es evitarlos. Por defecto trabajan con vecindarios fijos de 3×3 píxeles, pero podrían hacer algo diferente si alguien ha estado jugando con las opciones Iterations (1-100) o Count (1-8) en Process ‣ Binary ‣ Options… – y esta imprevisibilidad podría causar problemas.

Para realizar erosiones, dilataciones, aperturas y cierres con más control y posiblemente vecindarios más grandes, prefiero utilizar los comandos Process ‣ Filters ‣ Maximum… y Process ‣ Filters ‣ Minimum…, combinándolos si es necesario.

Operaciones morfológicas en Fiji

Fiji contiene Process ‣ Morphology ‣ Gray Morphology, que proporciona una implementación más flexible de erosión, dilatación, apertura y cierre utilizando una variedad de formas tanto para imágenes en escala de grises como binarias.

También puedes encontrar el plugin para ImageJ en https://imagej.nih.gov/ij/plugins/gray-morphology.html

Contornos, agujeros y esqueletización#

El comando Process ‣ Binary ‣ Outline, como era de esperar, elimina todos los píxeles interiores de los objetos binarios 2D, dejando sólo los perímetros (Figura 116A).

Process ‣ Binary ‣ Fill Holes volvería a rellenar estos píxeles interiores, o incluso rellenaría cualquier píxel de fondo que esté completamente rodeado por píxeles de primer plano (Figura 116B).

Process ‣ Binary ‣ Skeletonize recorta todos los píxeles exteriores de un objeto hasta que sólo queda una línea central conectada (Figura 116C).

Análisis de esqueletos

Si estás analizando estructuras lineales (por ejemplo, vasos sanguíneos, neuronas), entonces este comando o los del submenú Plugins ‣ Skeleton ‣ de Fiji pueden ser útiles.

Hide code cell content
fig = create_figure(figsize=(8, 4))

# There are different ways to generate outlines, depending upon how thick they should be
# and whether we get the 'inner' or 'outer'.
bw_outline = load_image('images/outline.png') > 0
bw_outlined = ndimage.binary_dilation(bw_outline) ^ bw_outline

# Fill holes
bw_fill = load_image('images/fill_holes.png') > 0
bw_filled = ndimage.binary_fill_holes(bw_fill)

# ndimage doesn't include skeletonize - so use skimage instead
# (Note that different skeletonize algorithms might give different results)
from skimage.morphology import skeletonize
bw_skeletonize = load_image('images/skeletonize.png') > 0
bw_skeletonized = skeletonize(bw_skeletonize)

# Show original concatenated with the filtered images
show_image(np.vstack((bw_outline, bw_outlined)), title="(A) Outline", pos=131)
show_image(np.vstack((bw_fill, bw_filled)), title="(B) Fill holes", pos=132)
show_image(np.vstack((bw_skeletonize, bw_skeletonized)), title="(C) Skeletonize", pos=133)
glue_fig('fig_outline_fill_skeleton', fig)
../../../_images/063a806c1efea730892f9c9f71aa0c4ae3e4d6ed92478986acb31a5ed19fb1f1.png

Figura 116 Los efectos de los comandos Outline, Fill holes y Skeletonize.#

El contorno de un objeto en una imagen binaria también puede determinarse aplicando otra operación morfológica a un duplicado de la imagen y utilizando después la Image Calculator. ¿Cómo?

Para contornear los objetos de una imagen binaria, basta con calcular la diferencia entre la imagen original y un duplicado erosionado (o dilatado, si se quieren los píxeles situados justo más allá de los objetos) de la imagen.

Otras operaciones morfológicas#

ImageJ no contiene una implementación de la reconstrucción morfológica y, por lo tanto, no admite todas las operaciones adicionales que se derivan de ella.

Sin embargo, existe una biblioteca llamada MorphoLibJ que puede añadirse a ImageJ o Fiji, que contiene reconstrucción morfológica y mucho más.

Consulta la excelente documentación en https://imagej.net/plugins/morpholibj para más detalles.