Fusion d’étiquettes#

En principe, tous les algorithmes de segmentation ont des limites. Dans le cas où les résultats sont sous-optimaux et qu’aucun meilleur algorithme de segmentation n’est disponible, le post-traitement des étiquettes peut être une option. Il existe certaines fonctions disponibles pour fusionner les étiquettes selon leurs propriétés telles que l’intensité le long du bord où les étiquettes se touchent ou le nombre de pixels des étiquettes combinées par paires.

import pyclesperanto_prototype as cle
from napari_segment_blobs_and_things_with_membranes import local_minima_seeded_watershed
import numpy as np
cle.select_device("TX")
<NVIDIA GeForce RTX 3050 Ti Laptop GPU on Platform: NVIDIA CUDA (1 refs)>

Fusion d’étiquettes en contact#

Le cas d’utilisation le plus trivial pourrait être la fusion d’objets étiquetés qui se touchent.

blobs = cle.imread("../../data/blobs.tif")
blobs_labels = cle.voronoi_otsu_labeling(blobs, spot_sigma=3)
blobs_labels
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max72.0
cle.merge_touching_labels(blobs_labels)
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max61.0

Fusion d’étiquettes selon l’intensité de la bordure#

Comme exemple, nous utilisons une tranche recadrée du jeu de données d’exemple cells3d dans scikit-image.

image = cle.imread("../../data/membranes_2d.tif")[30:130, 0:100]
image
cle._ image
shape(100, 100)
dtypefloat32
size39.1 kB
min1062.0
max20614.0

Dans l’exemple suivant, notre cellule au centre de l’image a été segmentée à tort comme deux cellules :

labels = local_minima_seeded_watershed(image, spot_sigma=5, outline_sigma=0)
labels
nsbatwm made image
shape(100, 100)
dtypeint32
size39.1 kB
min1
max12

Cela peut être corrigé en fusionnant les cellules dont l’intensité de la bordure est inférieure à un seuil donné.

merged_labels = cle.merge_labels_with_border_intensity_within_range(image, labels, maximum_intensity=5000)
merged_labels
c:\structure\code\pyclesperanto_prototype\pyclesperanto_prototype\_tier3\_generate_touch_mean_intensity_matrix.py:30: UserWarning: generate_touch_mean_intensity_matrix is supposed to work with images of integer type only.
Loss of information is possible when passing non-integer images.
  warnings.warn("generate_touch_mean_intensity_matrix is supposed to work with images of integer type only.\n" +
cle._ image
shape(100, 100)
dtypeuint32
size39.1 kB
min1.0
max8.0