vol_granulometry — 3D feature op

Data kinds: voxelmeasurement

Call: import fullseye as fs; fs.ledger.vol_granulometry(vol_binary, radii=None, spacing=None) (to call the implementation directly, import volops; volops.vol_granulometry(vol_binary, radii=None, spacing=None); from the registry, ops3d.get("vol_granulometry"))

Return value through the ledger: fullseye.ledger.vol_granulometry(...) returns **only the declared out type measurement** (the underlying function also returns auxiliary values). When you need what was dropped, use fullseye.ledger.vol_granulometry.raw(...) or call volops.vol_granulometry directly.

• Underlying return: 中央径

Usage

Pore / particle size distribution of a binary volume (opening series).

Opening by a ball of radius `r deletes every feature narrower than 2r`.

Tracking the surviving volume fraction as `r` grows gives the cumulative

size distribution `F(r)`; its negative increment is the size density — the

fraction of material that sits in features of that size. This is Matheron's

granulometry, the measurement behind every "pore size distribution" plot in

casting, foam and powder work.

Computed from the local-thickness volume rather than by repeated openings:

the two agree exactly (a voxel survives the opening of radius `r` iff its

local thickness is at least `2r`) and one distance transform replaces N

morphological passes.

*radii* are in the units of *spacing* (millimetres when *spacing* is given,

voxels otherwise); leave it `None for min(spacing)`-steps up to the

largest thickness present. Returns ``{"radii": [...], "surviving_fraction":

[...], "density": [...], "mean_size": float, "d50": float, "units": "mm"|"voxel"}``

where sizes are diameters (`2r`), because that is what a pore diameter

means.

Applicability. (1) A distribution is only as good as the threshold that

made the binary volume — report it. (2) Features touching the volume border

are truncated and bias the distribution downward; crop or state it.

(3) `d50` is interpolated between the two bracketing radii, so it is no

finer than the radius step.

HALCON has no granulometry operator.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

Runnable examples (verified samples that actually call this op)

ct_porosity_and_fibre_morphometrypy -3.11 examples_3d/ct_porosity_and_fibre_morphometry.py

Ops the type connects to (they accept measurement as input)

vol_gaussian_psf · fuse_to_voxel · fresnel_reflectance · snell_angle

Same category (feature)

sobel3d · hessian3d · curvature_maps · edt_jfa · vol_frangi · vol_local_std · vol_local_thickness · vol_orientation_coherence


*Provenance: volops.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.