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