Der Modus-Filter zur Korrektur von Ergebnissen der semantischen Segmentierung#

In der deskriptiven Statistik gibt es mehrere zusammenfassende Maße. Der Mittelwert- und der Median-Filter ermöglichen beispielsweise eine lokale Mittelung eines Bildes auf verschiedene Arten. Der Modus-Filter ist weniger verbreitet, aber in einigen Szenarien dennoch nützlich. Der Modus eines Pixels in seiner Nachbarschaft entspricht der am häufigsten vorkommenden Intensität unter den vorhandenen Intensitäten. Somit kann er verwendet werden, um einzelne Pixel zu entfernen, die in einem semantischen Segmentierungsergebnis falsch klassifiziert wurden.

import numpy as np
import pyclesperanto_prototype as cle
import stackview

Um den Filter zu demonstrieren, erstellen wir eine semantische Segmentierung von Blobs.

blobs = cle.imread("../../data/blobs.tif")
semantic_segmentation = (blobs > 70) + \
                        (blobs > 200) + 1

semantic_segmentation.astype(np.uint32)
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min1.0
max3.0

Mit den Funktionen mode_sphere und mode_box können wir das Ergebnis weniger verrauscht machen.

cle.mode_sphere(semantic_segmentation, radius_x=2, radius_y=2).astype(np.uint32)
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min1.0
max3.0
cle.mode_sphere(semantic_segmentation, radius_x=4, radius_y=4).astype(np.uint32)
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min1.0
max3.0

Wenn der Radius immer breiter wird, enthält das Ergebnis immer weniger lokale Informationen.

cle.mode_sphere(semantic_segmentation, radius_x=10, radius_y=10).astype(np.uint32)
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min1.0
max3.0

Die manuelle Anpassung des Radius kann helfen, eine gute Konfiguration zu finden.

def mode_sphere(image, radius:float = 1):
    return cle.mode_sphere(image, radius_x=radius, radius_y=radius).astype(np.uint32)

stackview.interact(mode_sphere, semantic_segmentation, zoom_factor=1.5)