tb_quantize — 2D typed op

Data kinds: signalsignal

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

tb_quantize: 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.*

Sweeping knob a (0.1 / 0.5 / 0.9, the other knob at its default):

tb_quantize: knob a sweep (docs site)

*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_quantize: stages (docs site)

On other images (synthetic scene / photo / coins. Top row: inputs, bottom row: their outputs. Knobs at default):

tb_quantize: other inputs (docs site)

Usage

Scalar quantiser with the error model stated, plus optional dither.

*bits* sets the number of levels `L = 2**bits` over the signal's own

min..max range. *mode* is `"round" (mid-tread, unbiased) or "truncate"`

(floor, the convention PIL's posterize and most fixed-point casts use).

The two differ by more than a rounding convention. With step

`Delta = range/(L-1) both have error variance Delta**2/12`, but

truncation also carries a mean of `-Delta/2`, so its mean square error is

truncate: Delta2/12 + (Delta/2)2 = Delta**2/3

round: Delta**2/12

— a factor of 4. Anything that measures a level (not just displays it)

must round.

*dither* adds noise before quantising so the error stops being a function

of the signal: `"tpdf"` (triangular, the audio standard — two uniform draws

summed, so the error's variance no longer depends on the sample value) or

`"rpdf"` (one uniform draw). Dither raises the total error power but removes

the correlation that makes quantisation audible as distortion rather than as

hiss. `seed` fixes the draw so the op stays deterministic.

Applicability. (1) The range is taken from *this* signal, so two signals

quantised separately do not share a scale. (2) `bits=1` with no dither is a

comparator, not a quantiser — the error model does not apply. (3) The error

model assumes the signal moves by more than a step between samples; on a flat

stretch the error is a constant offset, not noise.

Typed bridge of the 1d op `quantize into the 2-D evolution registry: the same implementation, called under the op(v, a, b) convention. a drives bits (default 8); b` is unused.

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_signal 0.50 0.50
tb_quantize 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 quantize. 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).

poc_cold_chain_excursionpy -3.11 examples/poc_cold_chain_excursion.py

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

identity · tb_create_funct_1d_array · tb_smooth_funct_1d_gauss · tb_smooth_funct_1d_mean · tb_derivate_funct_1d · tb_integrate_funct_1d · tb_zero_crossings_funct_1d · tb_abs_funct_1d

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.