tb_superquadric_residual — 2D typed op

• Data kinds: points → feature

• Call: fullseye.apply(img, "tb_superquadric_residual", a=0.5, b=0.5) (the 2-D model is one image plus two scalar knobs a,b∈[0,1])

tb_superquadric_residual: input → output

*The figure is the actual output on a synthetic 128×128 input. Left: input, right: output. Point clouds are drawn as a top-down scatter (brightness = z), 1-D series as a line plot, volumes as the maximum-intensity projection along z, videos as the middle frame, complex images as magnitude; return values that are not pictures are shown as the values themselves.*

*Knob a does not change the output (measured: identical at 0.1 / 0.5 / 0.9).*

*Knob b does not change the output (measured: identical at 0.1 / 0.5 / 0.9).*

Stages (the ops that come before → this op, left to right):

▸ tb_superquadric_residual: stages (docs site)

Usage

Gross-Boult volume-corrected residual: mean( (sqrt(a1 a2 a3)(F^eps1 - 1))^2 ).

inside_outside(points, a, eps, R, t) gives the inside-outside function F of each point, and the mean square of the per-point residual r_i = sqrt(a1*a2*a3) * (F_i**eps1 - 1) is returned as a float. A point on the surface has F=1, so its residual is 0; inside points get a negative and outside points a positive residual (squaring removes the sign). It is the same quantity that fit_superquadric minimises, and the residual of the returned dict is this value too.

• points: a point cloud that can be reshaped to (N,3) (world coordinates).

• a: radii (a1,a2,a3). eps: shape exponents (eps1,eps2) (computing F uses both; the outer F**eps1 uses eps1 only).

• R/t: pose (X_body = R.T @ (X - t)). None means identity rotation / origin.

Numerical guard: F is clipped to [0, 1e12], and a1*a2*a3 is raised to at least 1e-12 before the sqrt is taken (so that degenerate parameters do not give inf/NaN; values near the surface are unaffected).

Dimensions: sqrt(a1 a2 a3) is length to the power 3/2 and F^eps1 - 1 is dimensionless, so the return value has the dimension of length to the power 3 and depends on the scale of the point cloud. It is not suited to comparing objects of different sizes. That it is a radial-distance approximation rather than the true point-to-surface Euclidean distance, and that it has no protection against outliers, are as described in the module docstring.

The 3d op superquadric_residual bridged into the 2-D evolution registry. The implementation is the same; only the calling convention is adapted to op(v, a, b). This op has no tunable parameters; neither a nor b is used.

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.

Try it in Studio

The program below has been verified to run (same input as the figure). In Studio's help this block becomes buttons that load and run it on the spot.

img_to_points 0.50 0.50
tb_superquadric_residual 0.50 0.50

▸ Load this pipeline  ·  Load & run

Runnable examples (verified samples that actually call this op)

The examples below call the underlying ledger op superquadric_residual. This bridge op is the same implementation adapted to the fn(v, a, b) convention, so the behaviour carries over unchanged (only the call form differs).

• superquadric_fit — py -3.11 examples_3d/superquadric_fit.py

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

identity · feature_to_img

Same category (typed)

tb_points_to_voxel · tb_estimate_point_normals · tb_iss_keypoints · tb_project_points · tb_render_point_depth · tb_statistical_outlier_removal · tb_radius_outlier_removal · tb_voxel_grid_downsample


*Provenance: ops.py — 2D 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.