(image-filtering:background_removal=)

Filtros de eliminación de fondo#

También existen filtros de eliminación de fondo. Si hay una intensidad más o menos homogénea distribuida por toda la imagen, potencialmente aumentando en una dirección, se recomienda eliminar este fondo antes de segmentar la imagen.

import numpy as np
from skimage.io import imread
from pyclesperanto_prototype import imshow
from skimage.filters import gaussian
from skimage.restoration import rolling_ball 
from skimage.morphology import disk
import matplotlib.pyplot as plt
from skimage.filters import difference_of_gaussians
from skimage.morphology import white_tophat

Como imagen de ejemplo, trabajaremos con un conjunto de datos del ojo de pez cebra (Cortesía de Mauricio Rocha Martins, laboratorio Norden, MPI CBG). Como puede ver, hay cierta dispersión de intensidad alrededor de los núcleos que queremos segmentar más adelante. La fuente de esta señal de fondo es luz fuera de foco.

# load zfish image and extract a channel
zfish_image = imread('../../data/zfish_eye.tif')[:,:,0]

imshow(zfish_image)
../_images/9909e90f457c0ef059140aa402af24f8da867b93b4edebcceb2cc17958351494.png

Para restar el fondo, primero necesitamos determinarlo. Podemos usar el algoritmo de bola rodante para eso. El parámetro de radio configura qué tan distantes deben ser los píxeles que se consideran para determinar la intensidad del fondo.

background_rolling = rolling_ball(zfish_image, radius=25)

imshow(background_rolling)
../_images/7a496ccc45dfa3e32107383d52290e27293b8ca065c906f992754260d0ade160.png

Después, restamos el fondo del original y mostramos las tres imágenes:

zfish_rolling = zfish_image - background_rolling

fig, axs = plt.subplots(1, 3, figsize=(15,10))

# first row
imshow(zfish_image, plot=axs[0])
axs[0].set_title("Original")
imshow(background_rolling, plot=axs[1])
axs[1].set_title("Fondo (bola rodante)")
imshow(zfish_rolling, plot=axs[2])
axs[2].set_title("Fondo restado")
Text(0.5, 1.0, 'Background subtracted')
../_images/16e0ef132a8c3044828f5bd3a3680a13e85633e17b1f80b2358985f630b01804.png

Podríamos hacer lo mismo usando un filtro de desenfoque gaussiano.

background_gaussian = gaussian(zfish_image, sigma=20, preserve_range=True)

zfish_gaussian = zfish_image - background_gaussian

fig, axs = plt.subplots(1, 3, figsize=(15,10))

# first row
imshow(zfish_image, plot=axs[0])
axs[0].set_title("Original")
imshow(background_gaussian, plot=axs[1])
axs[1].set_title("Fondo (Gaussiano)")
imshow(zfish_gaussian, plot=axs[2])
axs[2].set_title("Fondo restado")
Text(0.5, 1.0, 'Background subtracted')
../_images/bd8edff7a7a2173f32a4bba7fe103e4c6ce04f284d168421b4cbbeecd5d94398.png

En algunos escenarios, también tiene sentido dividir la imagen por el fondo. Esto ayuda, por ejemplo, a que todos los núcleos en esta imagen tengan intensidades similares. Esto podría ser ventajoso para la segmentación de núcleos.

background_gaussian = gaussian(zfish_image, sigma=50, preserve_range=True)

zfish_gaussian = zfish_image / background_gaussian

fig, axs = plt.subplots(1, 3, figsize=(15,10))

# first row
imshow(zfish_image, plot=axs[0])
axs[0].set_title("Original")
imshow(background_gaussian, plot=axs[1])
axs[1].set_title("Fondo (Gaussiano)")
imshow(zfish_gaussian, plot=axs[2])
axs[2].set_title("Fondo dividido")
Text(0.5, 1.0, 'Background divided')
../_images/0cef8beab053ca83614950d24616b9fb269c2029f80c8812a2a1c51575539140.png

Otras técnicas de sustracción de fondo#

Existen otras técnicas para la sustracción de fondo, como el top-hat. Además, la Diferencia de Gaussianas (DoG) es una técnica para la eliminación combinada de ruido y fondo.

# DoG

zfish_dog = difference_of_gaussians(zfish_image, 0, 15)

# Top-Hat
zfish_top_hat = white_tophat(zfish_image, disk(15))

fig, axs = plt.subplots(1, 3, figsize=(15,10))

# first row
imshow(zfish_dog, plot=axs[0], min_display_intensity=0)
axs[0].set_title("Diferencia de Gaussianas")
imshow(zfish_top_hat, plot=axs[1])
axs[1].set_title("Top hat")
imshow(zfish_rolling, plot=axs[2])
axs[2].set_title("Algoritmo de bola rodante")
Text(0.5, 1.0, 'Rolling ball algorithm')
../_images/cb7e3ad06dbfde79fde51846d287d6ac6cbc03444765db0a3a919249a082095a.png

Ejercicio#

Aplique diferentes algoritmos y radios para eliminar el fondo en el conjunto de datos del ojo de pez cebra. Haga zoom en el conjunto de datos usando recorte y descubra cómo hacer que el fondo desaparezca de manera óptima.