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

*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).*
Estimates the number of bits the image actually uses and returns it mapped to [0,1] (feature).
Even when stored in an 8-bit container, it is common for the content to be worth only 6 bits — a low-bit sensor that was stretched, a pass through JPEG, a gamma applied, and so on. Here the effective bit count is estimated from the actual spacing of the occupied grey levels:
the pixel values that occur are sorted, the mode of the differences between adjacent values is taken as the step Δ, and bits = log2(1 + 1/Δ). The return value is bits / 16 (a/b are unused).
Conditions of use and how it goes wrong: (1) ★The pixel count sets the upper limit. When the grey levels are almost continuous (images processed in floating point), the smallest step is "the mean spacing ~1/N when there are N values", so the estimate levels off near log2(N) — on a 128x128 (N=16384) continuous image the measurement was 13.7 bit. It does not saturate at 16, so draw the "cannot measure beyond this" line from the pixel count beforehand (measuring on a small crop gives low values). (2) After a nonlinear transform (gamma, logarithm), the step differs by location, so the mode is "a representative step", not a uniform step.
(3) On a dithered image the grey levels get filled in, so the effective bit count comes out high —
that answers "how many levels are used", not "how many bits of information there are".
• gallery2d_features family guide
• 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.
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.
effective_bit_depth 0.50 0.50
▸ Load this pipeline · Load & run
• gallery2d_features — py -3.11 examples/gallery2d_features.py
feature as input)features)blob_count · area_frac · count_contours · total_length · vol_count · sk_euler · sk_entropy_feat · sk_blur_effect
*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.