El filtro de moda para corregir resultados de segmentación semántica#

En estadísticas descriptivas existen múltiples medidas de resumen. El filtro de media y el de mediana, por ejemplo, permiten promediar localmente una imagen de diferentes maneras. El filtro de moda es menos común pero sigue siendo útil en algunos escenarios. La moda de un píxel en su vecindad corresponde a la intensidad más popular entre las intensidades existentes. Por lo tanto, se puede usar para eliminar píxeles individuales que han sido clasificados erróneamente en un resultado de segmentación semántica.

import numpy as np
import pyclesperanto_prototype as cle
import stackview

Para demostrar el filtro, creamos una segmentación semántica de objetos.

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

Usando las funciones mode_sphere y mode_box podemos hacer que el resultado sea menos ruidoso.

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

Cuando el radio se hace más y más ancho, el resultado contiene cada vez menos información local.

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

Ajustar el radio manualmente puede ayudar a encontrar una buena configuración.

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)