ImageJ: Operaciones morfológicas#
Show 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ú
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#
contiene los comandos , , y .
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 – 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
y , combinándolos si es necesario.Operaciones morfológicas en Fiji
Fiji contiene
, 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 Figura 116A).
, como era de esperar, elimina todos los píxeles interiores de los objetos binarios 2D, dejando sólo los perímetros (Figura 116B).
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 116C).
recorta todos los píxeles exteriores de un objeto hasta que sólo queda una línea central conectada (Análisis de esqueletos
Si estás analizando estructuras lineales (por ejemplo, vasos sanguíneos, neuronas), entonces este comando o los del submenú
de Fiji pueden ser útiles.Show 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)
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
. ¿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.