A wing about measuring voxels and point clouds. Every picture is the real output of a registered Fullseye op, on synthetic data only (no real scans and no AI-generated material). Every number burned into a figure is computed on the spot, and the seed is pinned to 20260902, so a regeneration is byte-identical.
Anything that steps through slices is a GIF rather than a still. Each frame carries its position, units and measured values, so a single paused frame still reads.

↑ A processing domain cuts memory to 1/84 — A synthetic part floating in a 192³ field, stepped through slice by slice, with the full volume, the domain mask, the cropped sub-volume and the pasted-back result side by side. Only 0.42 % of the field is foreground, so vol_crop_domain takes memory from 56.62 MB to 0.678 MB (1/83.5), and the very same vol_gradient_magnitude now touches 84,747 voxels instead of 7,077,888 — the same 1/83.5. (The measured wall-clock times live in _wing3d_meta.json instead of being burned into the picture, so the image stays byte-reproducible.) vol_uncrop puts it back bit-identically. Ops used: vol_bounding_box, vol_crop_domain, vol_reduce_domain, vol_uncrop, vol_gradient_magnitude.

↑ Keep only the boundary and the shape drops to 6 % — A solid ball (267,731 voxels) reduced by vol_boundary to its inner one-voxel shell keeps only 6.1 % (16,418 voxels). Feeding that shell through vol_boundary_points (mm coordinates) into fit_sphere3 recovers the centre with an error of 0.000 mm (truth (25.6, 25.6, 25.6) mm). The radius is off by -0.175 mm — because the shell sits one layer inside — and that bias is written on the figure rather than hidden. Ops used: vol_boundary, vol_boundary_points, fit_sphere3.
↑ Run-length regions: 1/71 the memory — Holding a 256³ synthetic part as run-lengths costs 1/71 of the dense mask (16.78 MB to 0.237 MB, 19,764 runs). And nothing has to be decoded: the volume of 1,610,948 voxels, the bounding box, the centroid and the set operations (ball ∪ axle = 1,508,456 voxels) are all answered on the runs themselves, with no bitmap ever materialised. The decode round-trip is bit-identical. (The measured speed-ups are in _wing3d_meta.json — wall-clock numbers are kept out of the picture so it stays byte-reproducible.) Ops used: vol_rle_encode, vol_rle_decode, vol_rle_volume, vol_rle_bbox, vol_rle_centroid, vol_rle_union, vol_rle_intersect, vol_rle_difference.

↑ One CT volume, three windows, three different bodies — The same synthetic HU volume seen through three vol_window_level windows while the slice steps back and forth. In the soft-tissue window 67.1 % of the volume collapses to black and the ribs blow out to white; the bone window brings the blow-out down to 0.0 % so the bone reads; the lung window has only 0.0 % crushed to black and shows what is inside the lungs. The polyline underneath is the window itself — a linear HU → [0,1] map plus a clip. Ops used: vol_window_level.
↑ Frangi vs Sato — only a negative control (blobness) settles it — A synthetic CT holding one straight tube and two balls, run through two tubeness filters and one blobness filter. vol_frangi answers 1.26x stronger on the tube than on the balls, but vol_sato gives 0.97x — it barely tells them apart. The negative control vol_hessian_blobness gives 0.32x, i.e. it prefers the balls, so the direction cleanly reverses. “The vessels lit up” is not by itself evidence of tubeness — that obvious point, drawn. Ops used: vol_frangi, vol_sato, vol_hessian_blobness.

↑ Turning a 3-D skeleton into a graph — A synthetic branching structure (8,690 voxels) put through skeletonize_vol becomes a one-voxel-wide wire of 192 voxels (2.21 %), from which 4 branches, 1 junction and 4 endpoints are extracted as a graph. White marks junctions, rose marks endpoints, and branches are coloured per connected component. One turn of the turntable is enough to read how it is wired. Ops used: skeletonize_vol, skeleton_branches3d, skeleton_junctions3d, skeleton_endpoints3d.
↑ A virtual probe reads a 2.000 mm wall (truth 2.000 mm) — One probe pushed through a synthetic pipe of 10.000 mm outer / 8.000 mm inner diameter. vol_edge_probe picks up four edges at sub-sample precision and vol_wall_thickness pairs rising→falling to return 2.0000 mm / 2.0000 mm (truth 2.000 mm). Raise the smoothing sigma to 3.0 and it fattens to 2.1252 mm (+6.3 %) — the noise remedy turns straight into a dimensional bias, which is the other half of the lesson. Ops used: vol_profile_line, vol_edge_probe, vol_wall_thickness.

↑ Richardson-Lucy — forward consistency 0.033x, but RMSE to truth only 0.689x — A synthetic volume blurred by a sigma-2.0 Gaussian PSF and deconvolved iteratively with vol_richardson_lucy. Re-blurring the estimate and comparing it with the observation — the forward consistency — drops to 0.033x almost immediately, while the RMSE against the ground truth only reaches 0.689x. What is left is the staircase at the balls’ rims: “it explains the observation well” is not “it is close to the truth”, and the counter-example is the exhibit. Ops used: vol_gaussian_psf, vol_richardson_lucy.

↑ Visual hull — carving a shape out of stacked shadows — An L-shaped synthetic object carved by visual_hull from silhouettes taken in 16 directions. One view gives a column-like blob at 5.12x the true volume; adding views shrinks it to 1.24x (IoU 0.755) at 16 views. The concave notch of the L, though, never fills in no matter how many views are stacked — that is not implementation slop but the principled limit of a visual hull, and the figure shows the convergence target is not the truth. Ops used: visualhull.look_at, synthesize_silhouette, visual_hull.

↑ The box that holds it (OBB) and the box that fits inside (inner_box3) — A synthetic cuboid tilted 30° about z (13,617 voxels) with three boxes drawn on it at once, turned through a full revolution. The axis-aligned AABB swells to 1.99x the voxel count, while obb (a PCA-oriented bounding box) shrinks to 0.94x with half-extents 19.99 / 10.00 / 8.00 voxels (truth 20 / 10 / 8). It reads below 1.0 because the point set is voxel *centres and the box bounds those (the half-voxel rim is outside). The largest inscribed box from inner_box3 goes the other way, down to 0.32x. Grip width: OBB. Will the part pass through: inner box. Ops used: obb, inner_box3, vol_bounding_box.*

↑ Point-cloud registration — ICP in 29 iterations, GICP in 5 — A synthetic surface cloud of 3100 points, rotated by 22° and translated, put back by icp_point2point_3d. The initial RMSE of 3.804 falls to 1.8e-14 in 29 iterations, and the recovered pose is off by 1.7e-06 degrees and 5.6e-15 in translation. gicp, which uses the local surface covariances, reaches the same answer in 5 iterations. Ops used: icp_point2point_3d, gicp.
↑ Anisotropic voxels — forget the spacing and the volume is 4.17x off — A synthetic ellipsoid sampled at (1.5, 0.4, 0.4) mm/voxel — coarse in z only — with a true volume of 19301.9 mm³. Hand vol_region_props the spacing and it answers 19273.2 mm³ (-0.15 %); forget to and it answers 80305 (+316 %, 4.17x). No exception is raised. A plausible number is returned quietly — which is the whole point of this exhibit. Ops used: vol_label, vol_region_props, vol_boundary_points.

↑ A turntable of MIP and X-ray projection — A synthetic CT volume (96³) turned through a full revolution by render_volume_projection. On the left, maximum-intensity projection (MIP, bone window) keeps only the brightest sample along each ray, so bone floats out; on the right, attenuation summing (X-ray) accumulates along the ray, so thickness shows. 72 projections in all (the wall-clock cost is in _wing3d_meta.json, not in the picture). The normalisation ceiling is shared across all frames on purpose — normalise per frame and the brightness flickers as it turns, which is indistinguishable from the shape changing. Ops used: vol_window_level, render_volume_projection.

↑ Local thickness from a distance transform (max inscribed radius 4.528 mm) — Run vol_distance_transform over three synthetic tubes and every voxel becomes “how many mm am I from the edge”. Its maximum is the radius of the largest inscribed ball — the local thickness — measured at 4.5277 mm (truth 4.500 mm, off by +0.0277 mm because the edge lands half a voxel inside on a discrete grid). The rainbow contours step every 0.5 mm. Ops used: vol_distance_transform.
↑ Change only the connectivity and the shell gets 1.9x thicker — The shell of a synthetic ball of radius 30 voxels (112,931 voxels), taken six ways by varying nothing but vol_boundary’s connectivity (6 / 18 / 26) and side (inner / outer). The 6-neighbour inner shell — face contact only — is 9,170 voxels (8.12 %); the 26-neighbour outer shell, which counts diagonal contact too, is 17,570 voxels (15.56 %). The same shape, 1.92x apart. Six panels showing that “the number of surface voxels” means nothing without the definition. The near half is cut away so the thickness is visible. Ops used: vol_boundary.

↑ From a lump of CT to a dimension, in 7 steps — The seven steps that turn a noisy synthetic CT (176³, 0.6 mm spacing) into a dimension, bundled as a flip-book. Window → threshold → labelling (1 connected component) → largest component (5816.9 mm³, sphericity 0.4702) → vol_crop_domain for 1/7.7 the memory → thinning (5 branches / 2 junctions / 4 endpoints) → distance transform giving a maximum inscribed radius of 4.8374 mm (truth 4.800 mm). Every frame carries its step name and progress, so a paused frame still reads. Ops used: vol_window_level, vol_label, vol_region_props, vol_crop_domain, vol_uncrop, skeletonize_vol, skeleton_branches3d, skeleton_endpoints3d, skeleton_junctions3d, vol_distance_transform.

↑ Stepping through slices — z = 48 / 95 means 38.40 mm — A synthetic CT (96×128×128, spacing (0.8, 0.3, 0.3) mm) stepped one slice at a time for 96 frames. Every frame carries both the index and the physical position (z = 48 / 95 = 38.40 mm) plus a position bar. One slice step is 0.80 mm while one in-plane pixel is 0.30 mm — 0.37x — so, as the plot below shows, “move the index by one” means a different distance on every axis. The easiest step to trip over in an anisotropic CT. Ops used: vol_window_level.

↑ Three orthogonal planes (MPR) and a crosshair — One point seen from three directions. Axial (vol[z]), coronal (vol[:, y, :]) and sagittal (vol[:, :, x]) side by side, with three crosshairs moving together as they track a helical marker. Each panel states which axis is horizontal and which is vertical, and the volume carries deliberately asymmetric landmarks — a ball at +x, a bar at -y, a ring at +z — so a swapped axis or a mirrored view would immediately show up as those three landing in the wrong place. (The three planes are plain array slices; the contrast comes from vol_window_level and the lines from imagedraw ops.) Ops used: vol_window_level, imagedraw.draw_line.

↑ Cut it obliquely and the circle becomes an ellipse (major axis grows as 1/cos) — A synthetic cylinder of radius 5.00 mm, cut by a plane tilted from 0° to 70° (done by counter-rotating with vol_rotate). The minor axis stays at 10.000 mm whatever the angle, while the major axis follows 2r / cos θ and reaches 29.238 mm at 70° — 2.92x. Across all 36 angles the measurement is within 0.0000 mm (0.00 pixels) of theory. A reminder never to take “the diameter I measured on an oblique slice” as a dimension. Ops used: vol_rotate.

↑ Sweeping the CT window — what you can see is decided by the window — The same single slice with nothing but the vol_window_level window changed, 70 ways. Moving the centre shifts the brightness reference; moving the width changes how much is thrown away. Every frame carries the real centre / width values, the fraction crushed to black and blown to white, and what colour each of six tissues currently reads as. In the soft-tissue window bone saturates at 1.00; in the bone window soft tissue and lung sink towards 0 — both are discarding information, and one clip shows it. Ops used: vol_window_level.

↑ An isosurface grows, necks and breaks as the threshold moves — Two blurred, overlapping balls run through voxel_to_mesh (marching cubes) with the level stepped from 0.06 to 0.82 in 40 stages. The surface area shrinks from 6679 to 2842 voxel², and past level 0.742 the one surface breaks into two. Each frame carries the level, vertex and triangle counts, surface area and number of connected components. Which is also to say: a 3-D measurement that does not state its threshold cannot be reproduced. Ops used: voxel_to_mesh, mesh_area.

↑ Reslicing along a vessel — cut off-axis and the bore reads 1.13x too wide — A synthetic tube tilted 28° with a stenosis in the middle, stepped through 49 cross-sections. The minor axis measured on planes orthogonal to the tube axis returns the true bore almost exactly (mean error 0.0206 mm), while the major axis of a naive z-slice stretches by 1/cos θ = 1.133x and is off by 0.5776 mm on average. At the stenosis a true 2.801 mm reads as 3.217 mm — the narrowing looks milder than it is. Ops used: vol_rotate.