(image-filtering:background_removal=)

Hintergrundentfernungs-Filter#

Es gibt auch Filter zur Hintergrundentfernung. Wenn eine mehr oder weniger homogene Intensität über das gesamte Bild verteilt ist, die sich möglicherweise in eine Richtung verstärkt, wird empfohlen, diesen Hintergrund vor der Segmentierung des Bildes zu entfernen.

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

Als Beispielbild werden wir mit einem Zebrafisch-Augen-Datensatz arbeiten (mit freundlicher Genehmigung von Mauricio Rocha Martins, Norden Labor, MPI CBG). Wie Sie sehen können, gibt es eine gewisse Intensitätsverteilung um die Zellkerne, die wir später segmentieren möchten. Die Quelle dieses Hintergrundsignals ist Licht außerhalb des Fokus.

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

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

Um den Hintergrund zu subtrahieren, müssen wir ihn zuerst bestimmen. Dafür können wir den Rolling-Ball-Algorithmus verwenden. Der Radius-Parameter konfiguriert, wie weit entfernte Pixel bei der Bestimmung der Hintergrundintensität berücksichtigt werden sollen.

background_rolling = rolling_ball(zfish_image, radius=25)

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

Anschließend subtrahieren wir den Hintergrund vom Original und zeigen alle drei Bilder an:

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("Hintergrund (Rolling Ball)")
imshow(zfish_rolling, plot=axs[2])
axs[2].set_title("Hintergrund subtrahiert")
Text(0.5, 1.0, 'Background subtracted')
../_images/16e0ef132a8c3044828f5bd3a3680a13e85633e17b1f80b2358985f630b01804.png

Wir könnten dasselbe mit einem Gaußschen Unschärfefilter machen.

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("Hintergrund (Gauß)")
imshow(zfish_gaussian, plot=axs[2])
axs[2].set_title("Hintergrund subtrahiert")
Text(0.5, 1.0, 'Background subtracted')
../_images/bd8edff7a7a2173f32a4bba7fe103e4c6ce04f284d168421b4cbbeecd5d94398.png

In einigen Szenarien kann es auch sinnvoll sein, das Bild durch den Hintergrund zu teilen. Dies hilft zum Beispiel dabei, dass alle Zellkerne in diesem Bild ähnliche Intensitäten haben. Dies könnte für die Zellkernsegmentierung vorteilhaft sein.

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("Hintergrund (Gauß)")
imshow(zfish_gaussian, plot=axs[2])
axs[2].set_title("Hintergrund dividiert")
Text(0.5, 1.0, 'Background divided')
../_images/0cef8beab053ca83614950d24616b9fb269c2029f80c8812a2a1c51575539140.png

Andere Techniken zur Hintergrundsubtraktion#

Es gibt andere Techniken zur Hintergrundsubtraktion wie den Top-Hat. Darüber hinaus ist die Differenz der Gaußschen (DoG) eine Technik für kombinierte Entrauschung und Hintergrundentfernung.

# 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("Differenz der Gaußschen")
imshow(zfish_top_hat, plot=axs[1])
axs[1].set_title("Top-Hat")
imshow(zfish_rolling, plot=axs[2])
axs[2].set_title("Rolling-Ball-Algorithmus")
Text(0.5, 1.0, 'Rolling ball algorithm')
../_images/cb7e3ad06dbfde79fde51846d287d6ac6cbc03444765db0a3a919249a082095a.png

Übung#

Wenden Sie verschiedene Algorithmen und Radien an, um den Hintergrund im Zebrafisch-Augen-Datensatz zu entfernen. Zoomen Sie in den Datensatz mithilfe von Cropping und finden Sie heraus, wie Sie den Hintergrund optimal entfernen können.