Quantitative Bildanalyse#

Nach der Segmentierung und Kennzeichnung von Objekten in einem Bild können wir Eigenschaften dieser Objekte messen.

Siehe auch

Bevor wir Messungen durchführen können, benötigen wir ein image und ein entsprechendes label_image. Daher rekapitulieren wir Filtern, Schwellenwertbildung und Kennzeichnung:

from skimage.io import imread
from skimage import filters
from skimage import measure
from pyclesperanto_prototype import imshow
import pandas as pd 
import numpy as np
# load image
image = imread("../../data/blobs.tif")

# denoising
blurred_image = filters.gaussian(image, sigma=1)

# binarization
threshold = filters.threshold_otsu(blurred_image)
thresholded_image = blurred_image >= threshold

# labeling
label_image = measure.label(thresholded_image)

# visualization
imshow(label_image, labels=True)
../_images/5257573298d6a444b6a34d09506d6cf9a10aab208bce52c927a91ea6491b20ee.png

Messungen / Regioneneigenschaften#

Um Eigenschaften von Regionen auszulesen, verwenden wir die Funktion regionprops:

# analyse objects
properties = measure.regionprops(label_image, intensity_image=image)

Die Ergebnisse werden als RegionProps-Objekte gespeichert, die nicht sehr informativ sind:

properties[0:5]
[<skimage.measure._regionprops.RegionProperties at 0x1c272b8f8e0>,
 <skimage.measure._regionprops.RegionProperties at 0x1c26d278af0>,
 <skimage.measure._regionprops.RegionProperties at 0x1c26d2784c0>,
 <skimage.measure._regionprops.RegionProperties at 0x1c26d278b20>,
 <skimage.measure._regionprops.RegionProperties at 0x1c26d278b80>]

Wenn Sie daran interessiert sind, welche Eigenschaften wir gemessen haben: Sie sind in der Dokumentation der Funktion measure.regionprops aufgelistet. Im Grunde haben wir jetzt eine Variable properties, die 40 verschiedene Merkmale enthält. Wir sind jedoch nur an einer kleinen Teilmenge davon interessiert.

Daher können wir die Messungen in ein Wörterbuch umorganisieren, das Arrays mit unseren interessierenden Merkmalen enthält:

statistics = {
    'area':       [p.area               for p in properties],
    'mean':       [p.mean_intensity     for p in properties],
    'major_axis': [p.major_axis_length  for p in properties],
    'minor_axis': [p.minor_axis_length for p in properties]
}

Das Lesen dieser Wörterbücher von Arrays ist nicht sehr bequem. Dafür führen wir pandas DataFrames ein, die von Datenwissenschaftlern häufig verwendet werden. “DataFrames” ist nur ein anderer Begriff für “Tabellen”, der in Python verwendet wird.

df = pd.DataFrame(statistics)
df
area mean major_axis minor_axis
0 429 191.440559 34.779230 16.654732
1 183 179.846995 20.950530 11.755645
2 658 205.604863 30.198484 28.282790
3 433 217.515012 24.508791 23.079220
4 472 213.033898 31.084766 19.681190
... ... ... ... ...
57 213 184.525822 18.753879 14.468993
58 79 184.810127 18.287489 5.762488
59 88 182.727273 21.673692 5.389867
60 52 189.538462 14.335104 5.047883
61 48 173.833333 16.925660 3.831678

62 rows × 4 columns

Sie können auch benutzerdefinierte Spalten hinzufügen, indem Sie Ihre eigene Metrik berechnen, zum Beispiel das aspect_ratio:

df['aspect_ratio'] = [p.major_axis_length / p.minor_axis_length for p in properties]
df
area mean major_axis minor_axis aspect_ratio
0 429 191.440559 34.779230 16.654732 2.088249
1 183 179.846995 20.950530 11.755645 1.782168
2 658 205.604863 30.198484 28.282790 1.067734
3 433 217.515012 24.508791 23.079220 1.061942
4 472 213.033898 31.084766 19.681190 1.579415
... ... ... ... ... ...
57 213 184.525822 18.753879 14.468993 1.296143
58 79 184.810127 18.287489 5.762488 3.173540
59 88 182.727273 21.673692 5.389867 4.021193
60 52 189.538462 14.335104 5.047883 2.839825
61 48 173.833333 16.925660 3.831678 4.417297

62 rows × 5 columns

Diese Dataframes können bequem auf der Festplatte gespeichert werden:

df.to_csv("blobs_analysis.csv")

Darüber hinaus kann man Eigenschaften aus unserer statistics-Tabelle mit numpy messen. Zum Beispiel die durchschnittliche Fläche:

# measure mean area
np.mean(df['area'])
355.3709677419355

Übungen#

Analysieren Sie das geladene image der Blobs.

  • Wie viele Objekte sind darin enthalten?

  • Wie groß ist das größte Objekt?

  • Was sind Mittelwert und Standardabweichung des Bildes?

  • Was sind Mittelwert und Standardabweichung der Fläche der segmentierten Objekte?