Measure Operations
Measure Operations Tutorial.
This tutorial demonstrates the Measure Operations scripting API for computing histograms, statistics, mesh quality metrics, primitive fitting, and distance measurements. Each section provides a workflow example and prints results.
Note: The UI measure tools rely on interactive input (picking points, charts). Those interactions are not available via scripting. For interactive analysis, use the Measure tab in the UI. This tutorial focuses on scripting equivalents.
Prerequisites
- Volvicon application must be running
- Relevant objects loaded (volumes, masks, surfaces, and meshes as required)
Histogram Operations​
if all_volumes:
volume_name = all_volumes[0]
histogram_params = api.HistogramParams()
histogram_params.number_of_bins = 64
histogram_params.y_axis_mode = api.HistogramYAxisMode.Linear
histogram_params.graph_type = api.HistogramGraphType.Bars
histogram_params.target = api.VolumeStatisticsTarget.WholeVolume
histogram_params.slice_mode = api.SliceMode.AllSlices
histogram = MeasureOperations.generate_histogram(volume_name, histogram_params)
print(f"Histogram volume: {histogram.volume_name}")
print(f"Histogram bin count: {len(histogram.bin_values)}")
print(f"Histogram total count: {histogram.total_count}")
if histogram.bin_values:
print(f"Histogram first bin: {histogram.bin_values[0]}, freq: {histogram.frequencies[0]}")
histogram_txt = r"C:\output\histogram.txt"
MeasureOperations.export_histogram_to_disk(histogram, histogram_txt)
if all_masks:
mask_name = all_masks[0]
histogram_with_mask = MeasureOperations.generate_histogram_with_mask(volume_name, mask_name, histogram_params)
print(f"Histogram with mask: {histogram_with_mask.mask_name}")
Volume Statistics Operations​
if all_volumes:
volume_name = all_volumes[0]
volume_statistics_params = api.VolumeStatisticsParams()
volume_statistics_params.target = api.VolumeStatisticsTarget.WholeVolume
volume_statistics_params.slice_mode = api.SliceMode.AllSlices
volume_statistics_params.histogram_bins = 128
volume_stats = MeasureOperations.compute_volume_statistics(volume_name, volume_statistics_params)
print(f"Volume stats: {volume_stats.volume_name}")
print(f" Mean intensity: {volume_stats.mean_intensity}")
print(f" Std dev: {volume_stats.standard_deviation}")
print(f" Voxel count: {volume_stats.voxel_count}")
volume_stats_txt = r"C:\output\volume_statistics.txt"
MeasureOperations.export_volume_statistics_to_disk(volume_stats, volume_stats_txt)
if all_masks:
mask_name = all_masks[0]
stats_with_mask = MeasureOperations.compute_volume_statistics_with_mask(volume_name, mask_name, volume_statistics_params)
print(f"Volume stats with mask: {stats_with_mask.mask_name}")
print(f" Mean intensity: {stats_with_mask.mean_intensity}")
visible_stats = MeasureOperations.compute_volume_statistics_all_visible_masks(volume_name, volume_statistics_params)
print(f"Visible mask stats count: {len(visible_stats)}")
Volume Similarity Statistics​
if all_volumes:
source_volume = all_volumes[0]
target_volume = all_volumes[1] if len(all_volumes) > 1 else ""
if not target_volume:
duplicated = app.duplicate_volumes([source_volume])
if duplicated:
target_volume = duplicated[0]
if target_volume:
similarity = MeasureOperations.compute_volume_similarity(source_volume, target_volume)
print(f"Volume similarity: {similarity.source_volume_name} vs {similarity.target_volume_name}")
print(f" CC: {similarity.cross_correlation}")
print(f" MI: {similarity.mutual_information}")
similarity_txt = r"C:\output\volume_similarity.txt"
MeasureOperations.export_volume_similarity_to_disk(similarity, similarity_txt)
Mask Statistics Operations​
if all_masks:
mask_name = all_masks[0]
volume_name = all_volumes[0] if all_volumes else ""
requested_label_stats = [
api.LabelStatisticType.VoxelCount,
api.LabelStatisticType.Volume,
api.LabelStatisticType.MeanIntensity
]
whole_mask_stats = MeasureOperations.compute_whole_mask_statistics(mask_name, volume_name, requested_label_stats)
print(f"Whole mask stats: {whole_mask_stats.mask_name}")
print(f" Total regions: {whole_mask_stats.total_regions}")
print(f" Total voxel count: {whole_mask_stats.total_voxel_count}")
per_region_stats = MeasureOperations.compute_per_region_mask_statistics(mask_name, volume_name, requested_label_stats)
print(f"Per-region stats count: {len(per_region_stats.label_statistics)}")
if MaskOperations.is_multilabel_mask(mask_name):
per_label_stats = MeasureOperations.compute_per_label_mask_statistics(mask_name, volume_name, requested_label_stats)
print(f"Per-label stats count: {len(per_label_stats.label_statistics)}")
else:
print("Mask is not multi-label; skipping per-label statistics.")
mask_stats_txt = r"C:\output\mask_statistics.txt"
MeasureOperations.export_mask_statistics_to_disk(whole_mask_stats, mask_stats_txt)
Compare Masks​
if len(all_masks) >= 2:
mask_a = all_masks[0]
mask_b = all_masks[1]
comparison = MeasureOperations.compare_masks(mask_a, mask_b)
print(f"Mask comparison: {comparison.source_mask_name} vs {comparison.target_mask_name}")
print(f" Dice coefficient: {comparison.dice_coefficient}")
print(f" False negative: {comparison.false_negative}")
print(f" False positive: {comparison.false_positive}")
comparison_txt = r"C:\output\mask_comparison.txt"
MeasureOperations.export_mask_comparison_to_disk(comparison, comparison_txt)
Mask 3D Preview Statistics and Quality​
if all_masks:
mask_name = all_masks[0]
app.set_mask_3d_preview_quality(api.Mask3dPreviewQuality.Optimal)
app.generate_mask_3d_preview([mask_name])
requested_mesh_stats = [
api.SurfaceMeshStatisticType.NumVertices,
api.SurfaceMeshStatisticType.SurfaceArea
]
preview_stats = MeasureOperations.compute_per_region_mask_3d_preview_statistics(mask_name, requested_mesh_stats)
print(f"Mask 3D preview regions: {len(preview_stats.statistics)}")
if preview_stats.statistics:
stats0 = preview_stats.statistics[0]
print(f" Region {stats0.region_id}: vertices={stats0.num_vertices}, area={stats0.surface_area}")
if MaskOperations.is_multilabel_mask(mask_name):
preview_label_stats = MeasureOperations.compute_per_label_mask_3d_preview_statistics(mask_name, requested_mesh_stats)
print(f"Mask 3D preview labels: {len(preview_label_stats.statistics)}")
preview_quality = MeasureOperations.analyze_mask_3d_preview_mesh_quality(mask_name, api.SurfaceMeshQualityMetric.AspectRatio)
print(f"Mask 3D preview quality: {preview_quality.surface_name}")
print(f" Min: {preview_quality.statistics.min_value}")
Surface Mesh Statistics and Quality​
if all_surfaces:
surface_name = all_surfaces[0]
requested_mesh_stats = [
api.SurfaceMeshStatisticType.NumVertices,
api.SurfaceMeshStatisticType.SurfaceArea
]
surface_stats = MeasureOperations.compute_whole_surface_mesh_statistics(surface_name, requested_mesh_stats)
print(f"Surface stats: {surface_stats.surface_name}")
if surface_stats.statistics:
stats0 = surface_stats.statistics[0]
print(f" Vertices: {stats0.num_vertices}")
print(f" Surface area: {stats0.surface_area}")
visible_surface_stats = MeasureOperations.compute_all_visible_surface_mesh_statistics(requested_mesh_stats)
print(f"Visible surface stats count: {len(visible_surface_stats)}")
per_region_surface_stats = MeasureOperations.compute_per_region_surface_mesh_statistics(surface_name, requested_mesh_stats)
print(f"Surface regions: {len(per_region_surface_stats.statistics)}")
surface_stats_txt = r"C:\output\surface_statistics.txt"
MeasureOperations.export_surface_mesh_statistics_to_disk(surface_stats, surface_stats_txt)
surface_quality = MeasureOperations.analyze_surface_mesh_quality(surface_name, api.SurfaceMeshQualityMetric.AspectRatio)
print(f"Surface quality: {surface_quality.surface_name}")
print(f" Mean: {surface_quality.statistics.mean_value}")
surface_quality_txt = r"C:\output\surface_quality.txt"
MeasureOperations.export_surface_mesh_quality_to_disk(surface_quality, surface_quality_txt)
Volume Mesh Statistics and Quality​
if all_volume_meshes:
volume_mesh_name = all_volume_meshes[0]
requested_volume_mesh_stats = [
api.VolumeMeshStatisticType.NumVertices,
api.VolumeMeshStatisticType.TotalVolume
]
volume_mesh_stats = MeasureOperations.compute_volume_mesh_statistics(volume_mesh_name, requested_volume_mesh_stats)
print(f"Volume mesh stats: {volume_mesh_stats.volume_mesh_name}")
print(f" Vertices: {volume_mesh_stats.statistics.num_vertices}")
print(f" Total volume: {volume_mesh_stats.statistics.total_volume}")
visible_volume_mesh_stats = MeasureOperations.compute_all_visible_volume_mesh_statistics(requested_volume_mesh_stats)
print(f"Visible volume mesh stats count: {len(visible_volume_mesh_stats)}")
volume_mesh_stats_txt = r"C:\output\volume_mesh_statistics.txt"
MeasureOperations.export_volume_mesh_statistics_to_disk(volume_mesh_stats, volume_mesh_stats_txt)
volume_mesh_quality = MeasureOperations.analyze_volume_mesh_quality(volume_mesh_name, api.VolumeMeshQualityMetric.TetAspectRatio)
print(f"Volume mesh quality: {volume_mesh_quality.volume_mesh_name}")
print(f" Mean: {volume_mesh_quality.statistics.mean_value}")
volume_mesh_quality_txt = r"C:\output\volume_mesh_quality.txt"
MeasureOperations.export_volume_mesh_quality_to_disk(volume_mesh_quality, volume_mesh_quality_txt)
Primitive Fitting and Measurement Between Primitives​
if all_surfaces:
surface_name = all_surfaces[0]
primitive_fitting_params = api.PrimitiveFittingParams()
primitive_fitting_params.primitive_type = api.PrimitiveFittingType.Sphere
primitive_fitting_params.source = api.PrimitiveFittingSource.Surface
surface_fit = MeasureOperations.fit_primitive_to_surface(surface_name, primitive_fitting_params)
print(f"Primitive fit (surface): {surface_fit.primitive_name}")
print(f" Center: {surface_fit.center}")
fitted_primitive_name = surface_fit.primitive_name
if all_masks:
mask_name = all_masks[0]
app.set_mask_3d_preview_quality(api.Mask3dPreviewQuality.Optimal)
app.generate_mask_3d_preview([mask_name])
primitive_fitting_params = api.PrimitiveFittingParams()
primitive_fitting_params.primitive_type = api.PrimitiveFittingType.Sphere
primitive_fitting_params.source = api.PrimitiveFittingSource.Mask3DPreview
mask_fit = MeasureOperations.fit_primitive_to_mask_3d_preview(mask_name, primitive_fitting_params)
print(f"Primitive fit (mask 3D preview): {mask_fit.primitive_name}")
measurement = MeasureOperations.measure_between_primitives(fitted_primitive_name, mask_fit.primitive_name, True)
print(f"Measurement distance: {measurement.distance}")
print(f"Measurement name: {measurement.measurement_name}")
print("Measure operations tutorial completed successfully.")
Related Resources​
- API Reference - API documentation
- Quick Reference - Common methods at a glance