Surface quality measurements using vedo in napari#
This notebook shows how to visualize quantitatvie measurements on surface data in napari.
See also
import napari_process_points_and_surfaces as nppas
import napari
import numpy as np
import pandas as pd
from skimage.measure import label
from skimage.data import cells3d
viewer = napari.Viewer(ndisplay=3)
def hide_all(viewer):
for layer in viewer.layers:
layer.visible = False
def show_all(viewer):
for layer in viewer.layers:
layer.visible = True
surface = nppas.gastruloid()
surface_layer = viewer.add_surface(surface, blending='translucent', shading='flat')
surface = surface_layer.data
napari.utils.nbscreenshot(viewer)
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
hide_all(viewer)
area_surface = nppas.add_quality(surface, quality_id=nppas.Quality.AREA)
viewer.add_surface(area_surface, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
aspect_ratio_surface = nppas.add_quality(surface, quality_id=nppas.Quality.ASPECT_RATIO)
viewer.add_surface(aspect_ratio_surface, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
distortion_surface = nppas.add_quality(surface, quality_id=nppas.Quality.DISTORTION)
viewer.add_surface(distortion_surface, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
min_angle_surface = nppas.add_quality(surface, quality_id=nppas.Quality.MIN_ANGLE)
viewer.add_surface(min_angle_surface, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
condition_surface = nppas.add_quality(surface, quality_id=nppas.Quality.CONDITION)
viewer.add_surface(condition_surface, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
max_angle_surface = nppas.add_quality(surface, quality_id=nppas.Quality.MAX_ANGLE)
viewer.add_surface(max_angle_surface, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
curvature1 = nppas.add_quality(surface, quality_id=nppas.Quality.MEAN_CURVATURE)
viewer.add_surface(curvature1, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
curvature2 = nppas.add_quality(surface, quality_id=nppas.Quality.SPHERE_FITTED_CURVATURE_DECA_VOXEL)
viewer.add_surface(curvature2, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
curvature3 = nppas.add_quality(surface, quality_id=nppas.Quality.SPHERE_FITTED_CURVATURE_HECTA_VOXEL)
viewer.add_surface(curvature3, colormap='jet')
napari.utils.nbscreenshot(viewer)
hide_all(viewer)
curvature4 = nppas.add_quality(surface, quality_id=nppas.Quality.SPHERE_FITTED_CURVATURE_KILO_VOXEL)
viewer.add_surface(curvature4, colormap='jet')
napari.utils.nbscreenshot(viewer)
Reading out values#
After measurements have been visualized, you can read them out:
vertices, faces, values = viewer.layers[-1].data
table = {
"X": vertices[:,2],
"Y": vertices[:,1],
"Z": vertices[:,0],
"value":values
}
pd.DataFrame(table)
X | Y | Z | value | |
---|---|---|---|---|
0 | 224.082855 | 220.405991 | 14.174363 | 0.000019 |
1 | 220.321533 | 208.158768 | 13.983076 | 0.000019 |
2 | 229.455795 | 219.060226 | 14.819012 | 0.000019 |
3 | 209.542557 | 150.734894 | 14.348864 | 0.000019 |
4 | 214.309753 | 145.722107 | 14.344353 | 0.000019 |
... | ... | ... | ... | ... |
3319 | 428.314514 | 349.007416 | 112.390945 | 0.000019 |
3320 | 412.195129 | 354.458801 | 112.101349 | 0.000019 |
3321 | 430.368317 | 356.983643 | 112.182083 | 0.000019 |
3322 | 421.842499 | 360.458557 | 112.378403 | 0.000019 |
3323 | 422.173492 | 352.256104 | 112.865425 | 0.000019 |
3324 rows × 4 columns
Other mesh quality measurements#
There are more mesh quality measurements available. Not all work on all meshes. Watch out for an error message in a grey window.
for q in nppas.Quality:
print(q)
Quality.EDGE_RATIO
Quality.ASPECT_RATIO
Quality.RADIUS_RATIO
Quality.ASPECT_FROBENIUS
Quality.MED_ASPECT_FROBENIUS
Quality.MAX_ASPECT_FROBENIUS
Quality.MIN_ANGLE
Quality.COLLAPSE_RATIO
Quality.MAX_ANGLE
Quality.CONDITION
Quality.SCALED_JACOBIAN
Quality.SHEAR
Quality.RELATIVE_SIZE_SQUARED
Quality.SHAPE
Quality.SHAPE_AND_SIZE
Quality.DISTORTION
Quality.MAX_EDGE_RATIO
Quality.SKEW
Quality.TAPER
Quality.VOLUME
Quality.STRETCH
Quality.DIAGONAL
Quality.DIMENSION
Quality.ODDY
Quality.SHEAR_AND_SIZE
Quality.JACOBIAN
Quality.WARPAGE
Quality.ASPECT_GAMMA
Quality.AREA
Quality.ASPECT_BETA
Quality.GAUSS_CURVATURE
Quality.MEAN_CURVATURE
Quality.MAXIMUM_CURVATURE
Quality.MINIMUM_CURVATURE
Quality.SPHERE_FITTED_CURVATURE_1_PERCENT
Quality.SPHERE_FITTED_CURVATURE_2_PERCENT
Quality.SPHERE_FITTED_CURVATURE_5_PERCENT
Quality.SPHERE_FITTED_CURVATURE_10_PERCENT
Quality.SPHERE_FITTED_CURVATURE_25_PERCENT
Quality.SPHERE_FITTED_CURVATURE_50_PERCENT
Quality.SPHERE_FITTED_CURVATURE_MICRO_VOXEL
Quality.SPHERE_FITTED_CURVATURE_MILLI_VOXEL
Quality.SPHERE_FITTED_CURVATURE_CENTI_VOXEL
Quality.SPHERE_FITTED_CURVATURE_DECI_VOXEL
Quality.SPHERE_FITTED_CURVATURE_VOXEL
Quality.SPHERE_FITTED_CURVATURE_DECA_VOXEL
Quality.SPHERE_FITTED_CURVATURE_HECTA_VOXEL
Quality.SPHERE_FITTED_CURVATURE_KILO_VOXEL
Quality.SPHERE_FITTED_CURVATURE_MEGA_VOXEL
show_all(viewer)
viewer.grid.enabled = True
viewer.grid.stride = -1
napari.utils.nbscreenshot(viewer)