Estadísticas descriptivas de imágenes etiquetadas#

Usando pandas y numpy, podemos hacer estadísticas descriptivas básicas. Antes de empezar, derivamos algunas medidas de una imagen etiquetada.

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

Cargamos la imagen usando imread de scikit-image y la segmentamos usando Etiquetado Gauss-Otsu.

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

A partir de la imagen etiquetada, podemos derivar estadísticas descriptivas de intensidad, tamaño y forma usando regionprops_table de scikit-image. Para el post-procesamiento de las mediciones, las convertimos en un DataFrame de 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

Puedes tomar una columna del DataFrame. En este contexto funciona como un diccionario de 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

Aunque esta estructura de datos parece más que un simple vector, numpy es capaz de aplicar funciones básicas de estadística descriptiva:

np.mean(data_frame["area"])
358.42622950819674
np.min(data_frame["area"])
5
np.max(data_frame["area"])
899

Se puede acceder a celdas individuales del DataFrame de esta manera:

data_frame["area"][0]
422

Los bucles for también pueden iterar sobre las columnas de la tabla de esta manera:

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

Estadísticas resumidas con Pandas#

Pandas también te permite visualizar estadísticas resumidas de mediciones usando la función 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

Matriz de correlación#

Si quieres saber qué parámetros están correlacionados con otros parámetros, puedes visualizarlo usando 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

Ejercicio#

Procesa el conjunto de datos de plátanos, por ejemplo, usando un bucle for que recorra la carpeta ../../data/banana/ y procese todas las imágenes. Segmenta todos los objetos en las imágenes de rodajas de plátano e imprime el área más grande encontrada para cada rodaja. Recopila estos valores en una lista y visualízalos como un DataFrame de pandas.