Superponer textos en imágenes#
Después de etiquetar elementos en una imagen, es posible que se desee ver algún texto sobre cada elemento describiendo, por ejemplo, su área, o simplemente el número de etiqueta de ese elemento. Una forma de hacerlo es utilizando la función annotate de los ejes de matplotlib.
Temas relacionados anteriores:
from skimage.io import imread
import matplotlib.pyplot as plt
from skimage import measure
import pyclesperanto_prototype as cle
Primero abrimos una imagen y etiquetamos objetos en ella.
# 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
|
Luego, analizamos los elementos etiquetados y obtenemos sus propiedades.
# Analyse objects
regionprops = measure.regionprops(labeled_blobs)
Finalmente, utilizamos la función axs.annotate() con los siguientes argumentos:
text: la cadena de texto a mostrar;xy: las coordenadas donde se dibujará el texto;fontsize: el tamaño del texto;color: el color del texto;
# 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')
Como se mencionó anteriormente, podemos escribir mediciones cuantitativas sobre cada elemento, como su área.
# 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')