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
|
labeled_blobs = cle.voronoi_otsu_labeling(blobs, spot_sigma=3.5)
labeled_blobs
|
|
cle._ image
|
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')
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')