Le filtre de mode pour corriger les résultats de segmentation sémantique#

En statistiques descriptives, il existe plusieurs mesures de synthèse. Le filtre de moyenne et le filtre médian permettent par exemple de moyenner localement une image de différentes manières. Le filtre de mode est moins courant mais reste utile dans certains scénarios. Le mode d’un pixel dans son voisinage correspond à l’intensité la plus populaire parmi les intensités existantes. Ainsi, il peut être utilisé pour éliminer les pixels individuels mal classés dans un résultat de segmentation sémantique.

import numpy as np
import pyclesperanto_prototype as cle
import stackview

Pour démontrer le filtre, nous créons une segmentation sémantique de taches.

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

En utilisant les fonctions mode_sphere et mode_box, nous pouvons rendre le résultat moins bruité.

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

Lorsque le rayon s’élargit de plus en plus, le résultat contient de moins en moins d’informations locales.

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

Ajuster manuellement le rayon peut aider à trouver une bonne configuration.

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)