voxel_to_hessian — REPRCONV derivative op

• Data kinds: voxel → hessian

• Call: import fullseye as fs; fs.ledger.voxel_to_hessian(vol, sigma=1.0, scale_normalize=False) (to call the implementation directly, import reprconv; reprconv.voxel_to_hessian(vol, sigma=1.0, scale_normalize=False); from the registry, opsreprconv.get("voxel_to_hessian"))

• GPU: none (CPU reference implementation only)

Usage

Volume voxel → the six components (zz, yy, xx, zy, zx, yx) of the 3-D Hessian hessian. The entry into hessian built with numpy and scipy only.

Returns the same form as hessian3d (torch conv3d): a list of length 6, each (D,H,W) float32, in the order (zz, yy, xx, zy, zx, yx) (axis 0=z, 1=y, 2=x), in units of 1/voxel², with replicated edges (mode="nearest" of scipy.ndimage). So hessian_determinant / hessian_vesselness read it as is, and the chain voxel → hessian → voxel works even in a plain pip install fullseye without torch.

sigma is the scale of the Gaussian smoothing (voxels). Diagonal components are "2nd order on that axis × smoothing on the other 2 axes", cross components are "1st order on 2 axes × smoothing on the remaining axis", as separable convolutions. The kernels have the shape of Gaussian derivatives, with the sum and the 1st/2nd moments matched exactly (a sampled Gaussian-derivative kernel does not sum to 0, so brightness leaks into the 2nd derivative), so for a quadratic ½xᵀAx + bᵀx the interior gives H = A to rounding. sigma=0 is not "no smoothing" but the same 3-tap kernels as hessian3d ([1,−2,1] / [−0.5,0,0.5] / [1,2,1]/4) —— it agrees with the torch version to float32 rounding. scale_normalize=True multiplies by σ² (Lindeberg's γ=1 normalisation, for comparing values across scales; the same convention as the internal Hessian of vol_frangi).

2-D images are not accepted: the hessian sort is the six 3-D components, and its consumers need (D,H,W). For a 2-D Hessian response use sk_hessian / sk_hessian_det / xsk_hessian_eig (image → image).

Args:

vol: a 3-D volume (D,H,W), real, finite.

sigma: scale of the Gaussian smoothing (voxels). Finite and >= 0. 0 gives the same kernels as hessian3d. Default 1.0.

scale_normalize: True multiplies every component by σ² (cannot be combined with sigma=0).

Returns:

list of 6 np.ndarray, each (D,H,W) float32, in the order (zz, yy, xx, zy, zx, yx).

Raises:

ValueError: empty / not 3-D / non-finite / sigma not a finite non-negative number /

scale_normalize combined with sigma=0.

Empty input (vol with 0 elements) raises ValueError.

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.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• hessian_numpy_chain — py -3.11 examples/hessian_numpy_chain.py

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

hessian_determinant · hessian_vesselness

Same category (derivative)

gradient_magnitude · gradient_coherence · hessian_determinant · hessian_vesselness


*Provenance: reprconv.py — REPRCONV 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.