División por Gaussiana#
Al procesar imágenes con tinción de membrana, a veces ocurre que la intensidad de las membranas no es homogénea y cambia localmente. Esta variación de intensidad puede afectar a los algoritmos de segmentación celular. En estos casos, puede tener sentido homogeneizar la intensidad dividiendo la imagen por una versión desenfocada gaussiana de sí misma.
import pyclesperanto_prototype as cle
from skimage.io import imread, imshow
from skimage.filters import gaussian
En esta imagen puedes ver que la intensidad de las membranas disminuye de arriba a abajo.
image = imread('../../data/membranes_2d.tif')
cle.asarray(image)
|
|
cle._ image
|
Este gradiente de intensidad se puede eliminar dividiendo la imagen por su fondo, una versión desenfocada gaussiana de sí misma.
intensity_equivalized = cle.divide_by_gaussian_background(image, sigma_x=10, sigma_y=10)
intensity_equivalized
|
|
cle._ image
|
Cómo funciona#
Para demostrar cómo funciona, realizaremos la misma operación utilizando dos pasos con scikit-image y numpy.
background = gaussian(image, sigma=10)
imshow(background, cmap="Greys_r")
C:\Users\haase\mambaforge\envs\bio39\lib\site-packages\skimage\io\_plugins\matplotlib_plugin.py:150: UserWarning: Low image data range; displaying image with stretched contrast.
lo, hi, cmap = _get_display_range(image)
<matplotlib.image.AxesImage at 0x1aa03625160>
result = image / background
imshow(result, cmap="Greys_r")
C:\Users\haase\mambaforge\envs\bio39\lib\site-packages\skimage\io\_plugins\matplotlib_plugin.py:150: UserWarning: Float image out of standard range; displaying image with stretched contrast.
lo, hi, cmap = _get_display_range(image)
<matplotlib.image.AxesImage at 0x1aa0350d580>