(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)
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)
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')
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')
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')
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')
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.