Supprimer les étiquettes sur les bords de l’image#

Lors de l’analyse scientifique d’images, il est souvent pertinent que seuls les objets entièrement capturés dans l’image soient analysés.

import pyclesperanto_prototype as cle
from skimage.segmentation import clear_border, relabel_sequential
from skimage.io import imread
import stackview
import numpy as np

Notre point de départ sera une image étiquetée ; par exemple dérivée de blobs.tif par seuillage et étiquetage des composants connexes :

# load data
image = imread('../../data/blobs.tif')

# process the image
blurred = cle.gaussian_blur(image, sigma_x=1, sigma_y=1)
binary = cle.threshold_otsu(blurred)
labeled = cle.connected_components_labeling_box(binary)

# show result
labeled
c:\structure\code\pyclesperanto_prototype\pyclesperanto_prototype\_tier9\_imshow.py:34: UserWarning: cle.imshow is deprecated, use stackview.imshow instead.
  warnings.warn("cle.imshow is deprecated, use stackview.imshow instead.")
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max62.0
num_labels = len(np.unique(labeled)) - 1
print("Nombre d'objets dans l'image : " + str(num_labels))
Number of objects in the image: 62

Si la taille des objets est pertinente, il faut exclure les objets qui n’ont pas été entièrement imagés et qui touchent donc le bord de l’image.

labels_excl_edges = clear_border(np.asarray(labeled))

stackview.insight(labels_excl_edges)
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max55

Notez que l’intensité maximale dans l’image étiquetée ci-dessus est de 55 et le nombre d’objets est de 44 (voir ci-dessous). Ainsi, il s’agit d’une image étiquetée où toutes les étiquettes entre 1 et 44 ne sont pas présentes.

num_labels = len(np.unique(labels_excl_edges)) - 1
print("Nombre d'objets dans l'image : " + str(num_labels))
Number of objects in the image: 44

Étiquetage consécutif#

De nombreux algorithmes pour le traitement ultérieur des images étiquetées nécessitent que les étiquettes soient consécutives. Nous devons donc corriger cela avec l’image ci-dessus.

relabeled, _, _ = relabel_sequential(labels_excl_edges)

stackview.insight(relabeled)
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max44

D’autres implémentations pour supprimer les objets sur les bords de l’image ne nécessitent pas cette étape :

# Exclude Labels On Edges
labels_excl_edges = cle.exclude_labels_on_edges(labeled)

labels_excl_edges
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max44.0
num_labels = len(np.unique(labels_excl_edges)) - 1
print("Nombre d'objets dans l'image : " + str(num_labels))
Number of objects in the image: 44