Terminologie#

Ce notebook sert à montrer des images et des images segmentées de différents types pour expliquer la terminologie courante.

from skimage.io import imread, imshow
import napari_segment_blobs_and_things_with_membranes as nsbatwm
import stackview
import numpy as np

Images d’intensité#

Nous commençons par les images d’intensité telles qu’elles sont couramment produites par les microscopes.

input_image = imread("../../data/BBBC022/IXMtest_A02_s9.tif")[:,:,0]

cropped_image = input_image[0:200, 200:400]

imshow(cropped_image, cmap='Greys_r')
C:\Users\haase\mambaforge\envs\bio39\lib\site-packages\skimage\io\_plugins\matplotlib_plugin.py:150: UserWarning: Low image data range; displaying image with stretched contrast.
  lo, hi, cmap = _get_display_range(image)
<matplotlib.image.AxesImage at 0x2ba68647e20>
../_images/7642ae17d367f89fcd614de0e62927e0d15176780e0bae08e20780f0a31028cc.png

Images binaires#

Les algorithmes de segmentation de base conduisent à des images binaires. Elles se caractérisent par le fait qu’elles n’ont que deux intensités différentes, comme 0 et 1.

binary_image = nsbatwm.threshold_otsu(cropped_image)
binary_image
nsbatwm made image
shape(200, 200)
dtypeint32
size156.2 kB
min0
max1

Segmentation d’instances#

Si chaque objet individuel a sa propre intensité / couleur, nous l’appelons une image d’étiquettes de segmentation d’instances. Les instances sont étiquetées avec des nombres entiers. L’intensité maximale (étiquette) dans cette image correspond généralement au nombre d’objets.

instance_segmentation = nsbatwm.voronoi_otsu_labeling(cropped_image, 
                                        spot_sigma=5, 
                                        outline_sigma=1)

instance_segmentation
nsbatwm made image
shape(200, 200)
dtypeint32
size156.2 kB
min0
max12

Lorsque vous exécutez ce notebook localement, vous pouvez survoler l’image avec votre souris et inspecter les intensités des pixels.

import stackview
stackview.picker(instance_segmentation)

Segmentation sémantique#

Les images d’étiquettes de segmentation sémantique peuvent avoir plus de deux étiquettes et étiquettent généralement les régions où les pixels ont la même signification, par exemple : noyaux, enveloppe nucléaire et arrière-plan.

semantic_segmentation = binary_image + nsbatwm.maximum_filter(binary_image).astype(np.uint32) + 1
semantic_segmentation
nsbatwm made made image
shape(200, 200)
dtypeint64
size312.5 kB
min1
max3

Annotations éparses#

Les images d’étiquettes annotées sont généralement dessinées par des humains. Lorsque vous exécutez ce notebook localement, vous pouvez dessiner quelques annotations. Si vous annotez précisément quelques noyaux, vous créez une annotation éparse de noyaux. Maintenez la touche ALT enfoncée pour effacer une annotation.

sparse_label_annotation = np.zeros_like(cropped_image, dtype=np.uint32)
stackview.annotate(cropped_image, sparse_label_annotation)
stackview.insight(sparse_label_annotation)
shape(200, 200)
dtypeuint32
size156.2 kB
min0
max4

Vous pouvez également créer une annotation sémantique éparse, par exemple en annotant quelques pixels à l’intérieur des noyaux et quelques pixels dans l’arrière-plan.

sparse_semantic_annotation = np.zeros_like(cropped_image, dtype=np.uint32)
stackview.annotate(cropped_image, sparse_semantic_annotation)
stackview.insight(sparse_semantic_annotation)
shape(200, 200)
dtypeuint32
size156.2 kB
min0
max3