Mediciones de calidad de segmentación de imágenes#
Para determinar qué tan bueno es un algoritmo de segmentación, y para comparar diferentes algoritmos, necesitamos una métrica. Una métrica común es el Índice de Jaccard, que es una medida de superposición entre una segmentación de referencia y la segmentación que produjo un algoritmo, por ejemplo. Si trabajamos con imágenes etiquetadas, un método justo es determinar la superposición de cada objeto anotado con el objeto más superpuesto en la segmentación automática. Si promediamos este valor sobre todos los objetos anotados, obtenemos el Índice de Jaccard Disperso como se define en The Segmentation Game.
import os
import napari
import napari_segment_blobs_and_things_with_membranes as nsbatwm
from the_segmentation_game import metrics
from skimage.io import imread
Para demostrar esto, elegimos una imagen de ejemplo aleatoria del conjunto de datos BBBC007 (Jones et al., Proc. ICCV Workshop on Computer Vision for Biomedical Image Applications, 2005), disponible en la Broad Bioimage Benchmark Collection [Ljosa et al., Nature Methods, 2012].
image_folder = "../../data/BBBC007_batch/"
sparse_annotation_folder = "../../data/BBBC007_sparse_instance_annotation/"
test_image_filename = "17P1_POS0013_D_1UL.tif"
Para visualizar la imagen y la anotación manual correspondiente, usamos napari.
viewer = napari.Viewer()
La imagen de ejemplo#
image = imread(folder + test_image_filename)
viewer.add_image(image)
napari.utils.nbscreenshot(viewer)
La anotación manual#
sparse_labels = imread(sparse_annotation_folder + test_image_filename)
viewer.add_labels(sparse_labels)
napari.utils.nbscreenshot(viewer)
# ocultar la última capa de etiquetas
viewer.layers[-1].visible = False
La segmentación automática#
Con fines de demostración, usamos la sustracción de fondo y el etiquetado de Voronoi-Otsu para segmentar automáticamente los núcleos en esta imagen.
def my_segmentation_algorithm(input_image):
# sustracción de fondo
background_subtracted = nsbatwm.white_tophat(input_image, radius = 10)
# segmentación de instancias / etiquetado
labels_result = nsbatwm.voronoi_otsu_labeling(background_subtracted, spot_sigma=5, outline_sigma=1)
return labels_result
labels = my_segmentation_algorithm(image)
viewer.add_labels(labels)
napari.utils.nbscreenshot(viewer)
Estimación de calidad: Índice de Jaccard Disperso#
A partir de las dos imágenes de etiquetas cargadas y producidas anteriormente, podemos calcular el Índice de Jaccard Disperso.
metrics.jaccard_index_sparse(sparse_labels, labels)
0.8357392602053431
Ejercicio#
Utiliza el siguiente bucle for y fragmentos de código de arriba para calcular la calidad de segmentación de todas las imágenes en la carpeta. Proporciona la calidad promedio de todas las imágenes.
for image_filename in os.listdir(image_folder):
print(image_folder + image_filename)
../../data/BBBC007_batch/17P1_POS0013_D_1UL.tif
../../data/BBBC007_batch/20P1_POS0005_D_1UL.tif
../../data/BBBC007_batch/20P1_POS0007_D_1UL.tif
../../data/BBBC007_batch/20P1_POS0010_D_1UL.tif
../../data/BBBC007_batch/A9 p7d.tif
../../data/BBBC007_batch/AS_09125_040701150004_A02f00d0.tif