Statistiques descriptives des images étiquetées#
En utilisant pandas et numpy, nous pouvons réaliser des statistiques descriptives de base. Avant de commencer, nous dérivons certaines mesures à partir d’une image étiquetée.
import pandas as pd
import numpy as np
from skimage.io import imread, imshow
from napari_segment_blobs_and_things_with_membranes import gauss_otsu_labeling
from skimage.measure import regionprops_table
Nous chargeons l’image en utilisant la fonction imread de scikit-image et la segmentons en utilisant Gauss-Otsu-Labeling.
image = imread('../../data/blobs.tif')
labels = gauss_otsu_labeling(image)
imshow(labels)
C:\Users\rober\miniconda3\envs\bio_39\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 0x2819ae7b370>
À partir de l’image étiquetée, nous pouvons dériver des statistiques descriptives d’intensité, de taille et de forme en utilisant la fonction regionprops_table de scikit-image.
Pour le post-traitement des mesures, nous les transformons en un DataFrame pandas.
table = regionprops_table(labels, image, properties=['area', 'minor_axis_length', 'major_axis_length', 'eccentricity', 'feret_diameter_max'])
data_frame = pd.DataFrame(table)
data_frame
| area | minor_axis_length | major_axis_length | eccentricity | feret_diameter_max | |
|---|---|---|---|---|---|
| 0 | 422 | 16.488550 | 34.566789 | 0.878900 | 35.227830 |
| 1 | 182 | 11.736074 | 20.802697 | 0.825665 | 21.377558 |
| 2 | 661 | 28.409502 | 30.208433 | 0.339934 | 32.756679 |
| 3 | 437 | 23.143996 | 24.606130 | 0.339576 | 26.925824 |
| 4 | 476 | 19.852882 | 31.075106 | 0.769317 | 31.384710 |
| ... | ... | ... | ... | ... | ... |
| 56 | 211 | 14.522762 | 18.489138 | 0.618893 | 18.973666 |
| 57 | 78 | 6.028638 | 17.579799 | 0.939361 | 18.027756 |
| 58 | 86 | 5.426871 | 21.261427 | 0.966876 | 22.000000 |
| 59 | 51 | 5.032414 | 13.742079 | 0.930534 | 14.035669 |
| 60 | 46 | 3.803982 | 15.948714 | 0.971139 | 15.033296 |
61 rows × 5 columns
Vous pouvez extraire une colonne du DataFrame. Dans ce contexte, cela fonctionne comme un dictionnaire Python.
data_frame["area"]
0 422
1 182
2 661
3 437
4 476
...
56 211
57 78
58 86
59 51
60 46
Name: area, Length: 61, dtype: int32
Bien que cette structure de données semble plus qu’un simple vecteur, numpy est capable d’appliquer des fonctions de statistiques descriptives de base :
np.mean(data_frame["area"])
358.42622950819674
np.min(data_frame["area"])
5
np.max(data_frame["area"])
899
Les cellules individuelles du DataFrame peuvent être accessibles comme ceci :
data_frame["area"][0]
422
Les boucles for peuvent également itérer sur les colonnes du tableau comme ceci :
for area_value in data_frame["area"]:
print(area_value)
422
182
661
437
476
277
259
219
67
19
486
630
221
78
449
516
390
419
267
353
151
400
426
246
503
278
681
176
358
544
597
181
629
596
5
263
899
476
233
164
394
411
235
375
654
376
579
64
161
457
625
535
205
562
845
280
211
78
86
51
46
Statistiques récapitulatives avec Pandas#
Pandas vous permet également de visualiser les statistiques récapitulatives des mesures en utilisant la fonction describe().
data_frame.describe()
| area | minor_axis_length | major_axis_length | eccentricity | feret_diameter_max | |
|---|---|---|---|---|---|
| count | 61.000000 | 61.000000 | 61.000000 | 61.000000 | 61.000000 |
| mean | 358.426230 | 17.127032 | 24.796851 | 0.657902 | 25.323368 |
| std | 210.446942 | 6.587838 | 9.074265 | 0.189669 | 8.732456 |
| min | 5.000000 | 1.788854 | 3.098387 | 0.312788 | 3.162278 |
| 25% | 205.000000 | 14.319400 | 18.630719 | 0.503830 | 19.313208 |
| 50% | 375.000000 | 17.523565 | 23.768981 | 0.645844 | 24.698178 |
| 75% | 503.000000 | 21.753901 | 30.208433 | 0.825665 | 31.384710 |
| max | 899.000000 | 28.409502 | 54.500296 | 0.984887 | 52.201533 |
Matrice de corrélation#
Si vous voulez savoir quels paramètres sont corrélés avec d’autres paramètres, vous pouvez le visualiser en utilisant la fonction corr() de pandas.
data_frame.corr()
| area | minor_axis_length | major_axis_length | eccentricity | feret_diameter_max | |
|---|---|---|---|---|---|
| area | 1.000000 | 0.890649 | 0.895282 | -0.192147 | 0.916652 |
| minor_axis_length | 0.890649 | 1.000000 | 0.664507 | -0.566486 | 0.716706 |
| major_axis_length | 0.895282 | 0.664507 | 1.000000 | 0.168454 | 0.995196 |
| eccentricity | -0.192147 | -0.566486 | 0.168454 | 1.000000 | 0.103529 |
| feret_diameter_max | 0.916652 | 0.716706 | 0.995196 | 0.103529 | 1.000000 |
Exercice#
Traitez le jeu de données de bananes, par exemple en utilisant une boucle for qui parcourt le dossier ../../data/banana/ et traite toutes les images. Segmentez tous les objets dans les images de tranches de banane et affichez la plus grande surface trouvée pour chaque tranche. Collectez ces valeurs dans une liste et visualisez-la sous forme de DataFrame pandas.