Oberflächenmessungen#

In diesem Notebook zeigen wir, wie man Oberflächen-/Vertex-Messungen in einer Tabelle abrufen und auf der Oberfläche visualisieren kann. Die verwendeten Beispieldaten sind eine Ableitung von AV Luque und JV Veenvliet (2023), lizenziert unter CC-BY. Siehe das creating_surfaces Notebook für die Erstellung der Oberfläche aus Rohdaten der Bildgebung.

Siehe auch

import napari
import matplotlib.pyplot as plt
from napari.utils import nbscreenshot
import numpy as np
import vedo
from napari_process_points_and_surfaces import add_curvature, Curvature, spherefitted_curvature
import napari_process_points_and_surfaces as nppas

import vedo
viewer = napari.Viewer(ndisplay=3)
viewer.camera.angles = (40, -30, 55)
surface = nppas.gastruloid()
The nppas gastruloid example is derived from AV Luque and JV Veenvliet (2023) which is licensed CC-BY (https://creativecommons.org/licenses/by/4.0/legalcode) and can be downloaded from here: https://zenodo.org/record/7603081

Oberflächenvisualisierung#

Die Oberfläche selbst kommt ohne Quantifizierung. Sie sieht so aus:

surface
nppas.SurfaceTuple
origin (z/y/x)[0. 0. 0.]
center of mass(z/y/x)57.561,308.175,440.144
scale(z/y/x)1.000,1.000,1.000
bounds (z/y/x)13.983...112.865
110.951...460.844
168.949...807.707
average size171.204
number of vertices3324
number of faces6643

Quantifizierung#

Wir können eine Tabelle (pandas Dataframe) wie folgt erstellen.

requested_measurements = [nppas.Quality.AREA, 
                          nppas.Quality.ASPECT_RATIO,
                          nppas.Quality.GAUSS_CURVATURE, 
                          nppas.Quality.MEAN_CURVATURE,
                          nppas.Quality.SPHERE_FITTED_CURVATURE_DECA_VOXEL,
                          nppas.Quality.SPHERE_FITTED_CURVATURE_HECTA_VOXEL,
                          nppas.Quality.SPHERE_FITTED_CURVATURE_KILO_VOXEL,
                         ]

df = nppas.surface_quality_table(surface, requested_measurements)
df
vertex_index Quality.AREA Quality.ASPECT_RATIO Quality.GAUSS_CURVATURE Quality.MEAN_CURVATURE Quality.SPHERE_FITTED_CURVATURE_DECA_VOXEL Quality.SPHERE_FITTED_CURVATURE_HECTA_VOXEL Quality.SPHERE_FITTED_CURVATURE_KILO_VOXEL
0 0 29.997389 1.600400 0.030287 0.000490 0.000691 0.000257 0.000019
1 1 46.087046 1.602183 0.011136 0.000018 NaN 0.000250 0.000019
2 2 35.886338 1.400599 0.012633 0.000142 0.000542 0.000253 0.000019
3 3 22.887296 1.751932 0.036979 0.000548 0.000339 0.000379 0.000019
4 4 29.952347 1.220882 0.010277 0.000047 0.000366 0.000391 0.000019
... ... ... ... ... ... ... ... ...
3319 3319 25.079661 1.340802 0.031878 0.000606 0.001081 0.000168 0.000019
3320 3320 47.213916 1.254924 0.004615 0.000003 NaN 0.000169 0.000019
3321 3321 35.964707 1.140267 0.015661 0.000198 0.000547 0.000163 0.000019
3322 3322 45.673529 1.189562 0.011380 0.000100 0.000026 0.000152 0.000019
3323 3323 30.105530 1.151230 0.014396 0.000190 0.000158 0.000163 0.000019

3324 rows × 8 columns

Um einen Überblick über die Messungen zu erhalten, können wir sie zusammenfassen:

df.describe().T
count mean std min 25% 50% 75% max
vertex_index 3324.0 1661.500000 959.700474 0.000000e+00 830.750000 1661.500000 2492.250000 3323.000000
Quality.AREA 3324.0 33.753233 10.790780 5.677486e+00 26.694735 32.956835 39.255080 125.564101
Quality.ASPECT_RATIO 3324.0 7.126810 89.909602 1.038034e+00 1.292444 1.437911 1.648299 3421.965459
Quality.GAUSS_CURVATURE 3324.0 0.016958 0.035275 -1.031106e+00 0.005509 0.013645 0.024739 0.348243
Quality.MEAN_CURVATURE 3324.0 0.000383 0.007653 -2.803460e-02 -0.000135 0.000010 0.000270 0.426018
Quality.SPHERE_FITTED_CURVATURE_DECA_VOXEL 2750.0 0.002875 0.004761 1.791201e-09 0.000341 0.001004 0.003054 0.043508
Quality.SPHERE_FITTED_CURVATURE_HECTA_VOXEL 3324.0 0.000258 0.000069 1.516446e-04 0.000214 0.000241 0.000275 0.000545
Quality.SPHERE_FITTED_CURVATURE_KILO_VOXEL 3324.0 0.000019 0.000000 1.853513e-05 0.000019 0.000019 0.000019 0.000019

Wir können eine einzelne Spalte aus der Tabelle als Liste extrahieren.

curvature = list(df['Quality.SPHERE_FITTED_CURVATURE_HECTA_VOXEL'])
curvature[:5]
[0.0002572409502622459,
 0.0002504286604301336,
 0.00025319922419934937,
 0.00037887302369609083,
 0.00039058361737075804]

Visualisierung der Messungen#

Um die Messungen zu visualisieren, müssen wir sie an die Oberfläche anhängen:

quantified_surface = nppas.set_vertex_values(surface, curvature)
quantified_surface
nppas.SurfaceTuple
origin (z/y/x)[0. 0. 0.]
center of mass(z/y/x)57.561,308.175,440.144
scale(z/y/x)1.000,1.000,1.000
bounds (z/y/x)13.983...112.865
110.951...460.844
168.949...807.707
average size171.204
number of vertices3324
number of faces6643
min0.00015164456647196744
max0.0005448766287854695

Die Visualisierung kann auch angepasst werden, z.B. durch Änderung des Betrachtungswinkels und der Farbskala.

nppas.show(quantified_surface, azimuth=-90, cmap='jet')
../_images/13abf23e68859a73f770150cd46cd9a8401173ce985deeb61dc5ed524e35e4d0.png
nppas.show(quantified_surface, azimuth=-90, cmap='hsv')
../_images/9cdfa9635a684cf753d004e356beaacccbb211db75833488385efdc000bc054d.png