(image-filtering:background_removal=)

Filtres de suppression d’arrière-plan#

Il existe également des filtres de suppression d’arrière-plan. S’il y a une intensité plus ou moins homogène répartie sur toute l’image, potentiellement croissante dans une direction, il est recommandé de supprimer cet arrière-plan avant de segmenter l’image.

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

Comme image d’exemple, nous allons travailler avec un ensemble de données de l’œil de poisson zèbre (Courtoisie de Mauricio Rocha Martins, laboratoire Norden, MPI CBG). Comme vous pouvez le voir, il y a une certaine répartition d’intensité autour des noyaux que nous voulons segmenter plus tard. La source de ce signal d’arrière-plan est la lumière hors focus.

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

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

Pour soustraire l’arrière-plan, nous devons d’abord le déterminer. Nous pouvons utiliser l’algorithme de la balle roulante pour cela. Le paramètre de rayon configure à quelle distance les pixels doivent être pris en compte pour déterminer l’intensité de l’arrière-plan.

background_rolling = rolling_ball(zfish_image, radius=25)

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

Ensuite, nous soustrayons l’arrière-plan de l’original et affichons les trois images :

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("Arrière-plan (balle roulante)")
imshow(zfish_rolling, plot=axs[2])
axs[2].set_title("Arrière-plan soustrait")
Text(0.5, 1.0, 'Background subtracted')
../_images/16e0ef132a8c3044828f5bd3a3680a13e85633e17b1f80b2358985f630b01804.png

Nous pourrions faire la même chose en utilisant un filtre de flou gaussien.

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("Arrière-plan (Gaussien)")
imshow(zfish_gaussian, plot=axs[2])
axs[2].set_title("Arrière-plan soustrait")
Text(0.5, 1.0, 'Background subtracted')
../_images/bd8edff7a7a2173f32a4bba7fe103e4c6ce04f284d168421b4cbbeecd5d94398.png

Dans certains scénarios, il est également logique de diviser l’image par l’arrière-plan. Cela aide par exemple à faire en sorte que tous les noyaux de cette image aient des intensités similaires. Cela pourrait être avantageux pour la segmentation des noyaux.

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("Arrière-plan (Gaussien)")
imshow(zfish_gaussian, plot=axs[2])
axs[2].set_title("Arrière-plan divisé")
Text(0.5, 1.0, 'Background divided')
../_images/0cef8beab053ca83614950d24616b9fb269c2029f80c8812a2a1c51575539140.png

Autres techniques de soustraction d’arrière-plan#

Il existe d’autres techniques de soustraction d’arrière-plan telles que le chapeau haut-de-forme. De plus, la Différence de Gaussiennes (DoG) est une technique combinant débruitage et suppression d’arrière-plan.

# 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("Différence de Gaussiennes")
imshow(zfish_top_hat, plot=axs[1])
axs[1].set_title("Chapeau haut-de-forme")
imshow(zfish_rolling, plot=axs[2])
axs[2].set_title("Algorithme de la balle roulante")
Text(0.5, 1.0, 'Rolling ball algorithm')
../_images/cb7e3ad06dbfde79fde51846d287d6ac6cbc03444765db0a3a919249a082095a.png

Exercice#

Appliquez différents algorithmes et rayons pour supprimer l’arrière-plan dans l’ensemble de données de l’œil de poisson zèbre. Zoomez sur l’ensemble de données en utilisant le recadrage et trouvez comment faire disparaître l’arrière-plan de manière optimale.