Superposer des textes sur des images#

Après avoir étiqueté des éléments dans une image, on peut vouloir afficher du texte au-dessus de chaque élément décrivant, par exemple, sa surface, ou simplement le numéro d’étiquette de cet élément. Une façon de faire cela est d’utiliser la fonction annotate des axes matplotlib.

Sujets connexes précédents :

from skimage.io import imread
import matplotlib.pyplot as plt
from skimage import measure
import pyclesperanto_prototype as cle

Nous ouvrons d’abord une image et étiquetons les objets qui s’y trouvent.

# Load data
blobs = imread('../../data/blobs.tif')
cle.asarray(blobs)
cle._ image
shape(254, 256)
dtypefloat32
size254.0 kB
min8.0
max248.0
labeled_blobs = cle.voronoi_otsu_labeling(blobs, spot_sigma=3.5)
labeled_blobs
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max65.0

Ensuite, nous analysons les éléments étiquetés et obtenons leurs propriétés.

# Analyse objects
regionprops = measure.regionprops(labeled_blobs)

Enfin, nous utilisons la fonction axs.annotate() avec les arguments suivants :

  • text : la chaîne de caractères à afficher ;

  • xy : les coordonnées pour tracer le texte ;

  • fontsize : la taille du texte ;

  • color : la couleur du texte ;

# Visualization
fig, axs = plt.subplots(1, 1)
cle.imshow(blobs, continue_drawing=True, plot=axs)
cle.imshow(cle.reduce_labels_to_label_edges(labeled_blobs), labels=True, plot=axs, continue_drawing=True, alpha=0.7)

# Plot label number over each element (iterate over each element)
for element in regionprops:
    # Get element centroid (x, y)
    element_centroid = (element.centroid[1]-8, element.centroid[0]+5)
    
    # Get element label and convert it to string
    element_label = str(element.label)
    
    # Plot label number at the coordinates of that element centroid
    axs.annotate(text = element_label, xy = element_centroid, fontsize = 12, color = 'white')
../_images/954a2c74f4bbfebf42e38cf9fa40f8fc01d4acd1cd324bc1ee2a1e3234d3c189.png

Comme mentionné précédemment, nous pouvons écrire des mesures quantitatives au-dessus de chaque élément, comme sa surface.

# Visualization
fig, axs = plt.subplots(1, 1)
cle.imshow(blobs, continue_drawing=True, plot=axs)
cle.imshow(cle.reduce_labels_to_label_edges(labeled_blobs), labels=True, plot=axs, continue_drawing=True, alpha=0.7)

# Plot label number over each element (iterate over each element)
for element in regionprops:
    # Get element centroid (x, y)
    element_centroid = (element.centroid[1]-8, element.centroid[0]+5)
    
    # Get element label and convert it to string
    element_area = str(element.area)
    
    # Plot label number at the coordinates of that element centroid
    axs.annotate(text = str(element_area) + " px", xy = element_centroid, fontsize = 7, color = 'white')
../_images/f5b0ecfdb871be034dc6a1c42ed6a18ef252a37035ecc66ca9b734db27bc74a8.png