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>
../_images/2ddad22da785740fbcc5ea1360bad5c375c120b84ea46a9be1503289729c400a.png

À 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.