Image feature and quality kernels
Sobel edge/saliency features and color histograms, deterministic blur/exposure/entropy quality scores, pixel-level similarity metrics (MSE, PSNR, SSIM), and Otsu-based foreground region boxes over fla
Four modules answer the questions a serving stack needs answered before it spends an expensive vision-model call on an image: is this frame sharp enough and bright enough to bother with (image_quality), what does it visually contain and where is the interesting part (image_features), is it a near-duplicate of one already processed (image_similarity), and where exactly is the foreground subject or block of ink (image_regions). All four are zero-Python-import Mojo — image_quality.mojo's docstring names this explicitly as feeding the "Vision Gate," the cheap reject/route layer that decides whether to ask for a clearer image, skip it, or pay for a real model call. Every function is a plain deterministic formula over pixel buffers: no model weights, no randomness, and (box_iou aside, which takes List[Int]) no type but Float64 in or out. Grayscale functions take either a List[List[Float64]] grid (values 0-255) or a row-major flat buffer plus width/height for the runtime's calling convention; image_features' color functions take a flat interleaved RGB buffer (flat_rgb[i*3 + {0,1,2}], each channel 0-255).
from algenta import MojoRuntime
runtime = MojoRuntime(mode="local")
# 4x4 grayscale frame, flattened row-major, 0-255 -- flat background with two
# isolated bright pixels
frame = [
30, 30, 30, 30,
30, 220, 30, 30,
30, 30, 30, 30,
30, 30, 30, 220,
]
runtime.execute("image_quality", "blur_score_flat", [frame, 4, 4])["result"]
# 153425.0 -- variance of the Laplacian response; isolated bright pixels against a
# flat field read as very sharp (high blur_score), not blurry
runtime.execute("image_quality", "quality_score_flat", [frame, 4, 4])["result"]
# 0.5460996852346243 -- composite 40% sharpness + 30% exposure + 30% entropy usability scoreThe modules
image_features
Cheap grayscale/RGB visual features for routing and crop targeting: Sobel edge magnitude and density, an RGB color histogram plus three histogram-comparison metrics, top-3 dominant-color extraction, and a coarse saliency grid pointing at an image's most edge-dense region.
image_quality
Deterministic reject/route signals for the Vision Gate: variance-of-Laplacian blur score, mean brightness, contrast (pixel std-dev), 256-bin Shannon entropy, a dominant-bucket uniformity fraction, MAD-based noise estimate, over/under-exposure and near-blank flags, and a composite 0-1 usability score.
image_similarity
Pixel-level comparison between two same-declared-size grayscale flat buffers: MSE, MAE, PSNR (dB, capped at 99 for identity), normalized cross-correlation, a global (whole-image, not windowed) SSIM approximation, a changed-pixel diff fraction, crop-local similarity, and a weighted duplicate-detection score.
image_regions
Otsu-based foreground segmentation and box geometry: dark-ink foreground masks, connected-component bounding boxes sorted by descending pixel count, the single largest foreground box, the most salient grid cell expressed as a box, inclusive crop extraction, and box IoU.
image_features: edges, color histograms, and saliency
sobel_magnitude(image)
Per-pixel sqrt(gx² + gy²) gradient magnitude; valid-mode convolution, output is (H-2) x (W-2).
edge_density(image, mag_threshold)
Fraction of Sobel-magnitude pixels exceeding mag_threshold.
edge_density_flat(flat, width, height, mag_threshold)
edge_density from a flat buffer, via reshape_to_grid.
color_histogram(flat_rgb, width, height, bins_per_channel)
Normalized bins³ RGB histogram; index = (r_bin·bins + g_bin)·bins + b_bin. bins_per_channel is clamped to [1, 64].
histogram_intersection(a, b)
Σ min(aᵢ, bᵢ) — 1.0 for identical normalized histograms, 0.0 for disjoint ones.
histogram_chi_square(a, b)
½ Σ (aᵢ-bᵢ)²/(aᵢ+bᵢ) — 0.0 when identical, unbounded above.
histogram_correlation(a, b)
Pearson correlation of the two histograms, in [-1, 1]; 0.0 if either is flat.
dominant_colors(flat_rgb, width, height, levels)
Top-3 histogram bins by weight, decoded back to bin-center [r, g, b, weight], levels bins per channel.
saliency_grid(image, grid_rows, grid_cols)
grid_rows x grid_cols map of mean Sobel edge energy per cell.
most_salient_cell(saliency)
Flattened row*cols + col index of the highest-energy cell; -1 if the grid is empty.
most_salient_cell_flat(flat, width, height, grid_rows, grid_cols)
saliency_grid + most_salient_cell from a flat buffer; grid_rows/grid_cols are each clamped to MAX_SALIENCY_DIM = 1024.
A partial vertical edge, worked by hand. A 5×5 frame with columns 0-1 at intensity 0 and columns 2-4 at 255 — one hard edge, not a gradient — puts the step inside two of the three 3-wide Sobel windows and leaves the third window (columns 2-4, both sides at 255) flat:
sobel_x's middle column carries weight 0, so the gradient magnitude at each output cell depends only on the leftmost and rightmost columns of its 3-wide window, not the one in between — window columns [0,1,2] and [1,2,3] both straddle the edge (magnitude 1020.0), window [2,3,4] sits entirely inside the bright region (magnitude 0.0). saliency_grid(grid, 1, 3) on the same frame returns [[1020.0, 1020.0, 0.0]], and most_salient_cell picks index 0 — the first cell tied for the maximum, since the comparison is strict >, not >=.
Color histogram indexing, worked by hand. Two pixels — one reddish (200, 10, 10), one greenish (10, 200, 10) — through color_histogram(flat_rgb, 2, 1, 2) (2 bins per channel, bin_width = 128.0):
The greenish pixel maps to rb=0, gb=1, bb=0 → index (0·2+1)·2+0 = 2; the reddish pixel maps to rb=1, gb=0, bb=0 → index 4. dominant_colors always emits exactly 3 entries regardless of how many distinct colors the image actually has — with only two occupied bins here, the third pick finds every remaining bin at 0.0, decodes bin index 0 (the first one scanned) to its bin center (64.0, 64.0, 64.0), and reports weight 0.0. A caller that doesn't check the weight would read that third entry as "a third, low-weight color" rather than "no third color."
Comparing that mixed histogram against an all-reddish one ([0,0,0,0,1.0,0,0,0], both pixels (200,10,10)):
image_quality: blur, brightness, entropy, and a composite score
blur_score(image) / blur_score_flat
Variance of the 4-neighbour Laplacian response ([[0,1,0],[1,-4,1],[0,1,0]]); higher is sharper.
is_blurry(image, threshold)
blur_score(image) < threshold (the docstring suggests ~100 as a starting threshold for 0-255 images).
brightness_mean(image) / brightness_flat
Mean pixel value, 0-255.
contrast_std(image) / contrast_flat
Population standard deviation of pixel values.
shannon_entropy(image) / entropy_flat
256-bin intensity entropy in bits, 0 (flat) to 8 (maximally spread).
is_near_blank(image, std_threshold)
contrast_std(image) < std_threshold.
uniformity(image)
Fraction of pixels in the single most-populated 16-bin bucket.
noise_estimate(image)
1.4826 x the median absolute deviation of the Laplacian response — a robust (outlier-resistant) sigma estimate.
is_over_or_under_exposed(image, low, high)
True if brightness_mean falls outside [low, high].
quality_score(image) / quality_score_flat
Composite 0.4 * sharp + 0.3 * exposure + 0.3 * entropy, clamped to [0, 1] (see below).
The composite score, worked by hand. For the sharp 4×4 frame from the opening example (a flat 30-intensity field with two isolated 220-intensity pixels), the 2×2 valid-mode Laplacian response is [[-760.0, 190.0], [190.0, 0.0]] (mean -95.0), giving blur_score = 153425.0. brightness_mean = 53.75, so exposure = 1 - |53.75 - 128| / 128 = 0.419921875. The 256-bin histogram has only two occupied bins (fourteen pixels at 30, two at 220), so shannon_entropy = -(0.875·log₂0.875 + 0.125·log₂0.125) ≈ 0.5435644 bits, and entropy/8 ≈ 0.0679455. sharp = blur/(blur+100) ≈ 0.9993487. Combining: 0.4·0.9993487 + 0.3·0.419921875 + 0.3·0.0679455 ≈ 0.5460997, matching the quality_score_flat call above. The 100.0 constant inside sharp's denominator sets the scale at which blur_score starts to matter: at blur_score = 100 sharpness contributes exactly half its maximum weight (sharp = 0.5), and the term saturates toward 1.0 only for scores well above that, so is_blurry's suggested ~100 threshold and quality_score's own midpoint are the same number by design, not coincidence.
image_similarity: pixel-level comparison metrics
Unlike image_features and image_quality, none of these eight functions take a List[List[Float64]] grid variant or call reshape_to_grid — every one operates directly on two flat buffers over the declared width x height region, and a pixel past either buffer's end reads as 0.0 rather than being refused. That is a real, load-bearing difference in how out-of-range input is handled versus the other three modules in this family, not just an implementation detail: a caller that declares a width/height larger than one of its two buffers gets a silent comparison against zero-padding on the short side, not an error or an all-zero sentinel result.
mean_squared_error_flat(a, b, width, height)
Average squared pixel error.
mean_abs_error_flat(a, b, width, height)
Average absolute pixel error.
psnr_flat(a, b, width, height, max_value)
10 * log10(max_value² / mse) in dB; returns 99.0 (not +inf) when mse <= 1e-12.
normalized_cross_correlation_flat(a, b, width, height)
Pearson-style normalized cross-correlation, [-1, 1].
ssim_global_flat(a, b, width, height)
Global SSIM approximation from whole-image mean/variance/covariance — not the windowed, multi-scale SSIM some libraries compute.
diff_fraction_flat(a, b, width, height, diff_threshold)
Fraction of pixels whose absolute difference exceeds diff_threshold.
crop_region_similarity_flat(a, b, width, height, x0, y0, x1, y1)
1 - (MAE over the inclusive box) / 255, clamped to [0, 1].
duplicate_score_flat(a, b, width, height)
0.55 * ssim + 0.25 * ncc_rescaled + 0.20 * (1 - diff_fraction@12.0), clamped to [0, 1].
A near-duplicate pair, worked by hand. Two 2×2 frames, a = [10, 20, 30, 40] and b = [12, 18, 33, 42] (every pixel off by 2-3 intensity levels):
duplicate_score_flat composes the other functions: ssim = 0.98747..., ncc = 0.98798... rescaled from [-1,1] to [0,1] as 0.99399, and diff_fraction_flat(a, b, 2, 2, 12.0) = 0.0 (every pixel differs by less than 12.0) so stable = 1.0. 0.55*0.98747 + 0.25*0.99399 + 0.20*1.0 = 0.99161, comfortably in "these are the same image, lightly re-encoded" territory. psnr_flat's 99.0 cap only fires when mse <= 1e-12, essentially bit-identical buffers — this pair, at mse = 5.25, is nowhere near it and gets the real logarithmic value instead.
image_regions: composing Otsu, connected components, and box geometry
image_regions is the one module of the four that imports from outside this family: foreground_mask_otsu_flat delegates straight to document_vision.binarize_otsu_flat, and connected_component_boxes_flat delegates to image_morphology.connected_components_4_flat — both documented on their own pages, not here. saliency_box_flat closes the loop with image_features, calling that module's saliency_grid/most_salient_cell directly rather than re-implementing saliency scoring.
foreground_mask_otsu_flat(flat, width, height)
Otsu-threshold dark-ink mask: 255.0 where a pixel is <= the computed threshold, 0.0 otherwise.
connected_component_boxes_flat(mask_flat, width, height, fg_threshold, max_regions)
4-connected components (foreground = value >= fg_threshold) as flattened [x0,y0,x1,y1,area] boxes, sorted by descending area, capped at max_regions.
largest_foreground_box_flat(flat, width, height)
foreground_mask_otsu_flat piped into connected_component_boxes_flat with fg_threshold=128.0, max_regions=1.
saliency_box_flat(flat, width, height, grid_rows, grid_cols)
The most salient image_features grid cell, converted to a [x0,y0,x1,y1,area] box.
extract_box_flat(flat, width, height, x0, y0, x1, y1)
Inclusive crop as a flat list; out-of-range coordinates are clamped into bounds, a reversed box returns [].
box_iou(box_a, box_b)
Intersection-over-union for two [x0,y0,x1,y1,...] boxes (List[Int]); extra trailing values (e.g. an area field) are ignored.
largest_foreground_box_flat's two thresholds line up on purpose. foreground_mask_otsu_flat only ever emits 0.0 or 255.0 (_foreground_mask_value picks one of exactly two constants), and largest_foreground_box_flat hardcodes fg_threshold=128.0 when handing that mask to connected_component_boxes_flat — a value that sits exactly between the mask's two possible outputs, so it cleanly separates "dark, marked foreground" (255.0 >= 128.0) from "light, marked background" (0.0 < 128.0) regardless of what the original grayscale intensities were. connected_component_boxes_flat itself is generic — it works on any float mask against any threshold — but this particular composition is tuned for the specific two-level output foreground_mask_otsu_flat always produces.
Connected components, worked from a real test fixture. mojo/tests/libs/test_image_regions.mojo builds a 6×6 mask with two disconnected ink shapes: a 2-pixel vertical stroke and a 4-pixel L-shape. Flood-filling that mask by hand (4-connectivity, fg_threshold=128.0) gives exactly two components — the L-shape (pixels at (3,1), (4,1), (3,2), (3,3)) and the stroke ((0,1), (0,2)):
The first box is the L-shape: bounding box (3,1)-(4,3), but area=4 — the actual foreground pixel count, not the bounding-box area ((4-3+1)*(3-1+1) = 6). The two only agree when a component happens to fill its whole bounding box, which an L-shape by definition does not; reading area as a box-fill fraction rather than a raw pixel count would silently misjudge every non-rectangular region. The second box, the 2-pixel stroke, sorts second because 2 < 4, even though max_regions=4 would have room for both plus two more if they existed.
box_iou normalizes box order that the other box functions don't. From the same test file, box_iou([0,0,2,2], [1,1,3,3]) computes intersection 2x2 = 4 over union 9 + 9 - 4 = 14:
box_iou swaps x0/x1 and y0/y1 internally if either box is stored reversed, so a genuinely backwards box (x1 < x0) still produces the right IoU. extract_box_flat and crop_region_similarity_flat do not do this — they clamp each coordinate into [0, width) / [0, height) independently and then check right < left or bottom < top, so a box passed in with x1 < x0 returns an empty crop ([] or 0.0) rather than the auto-corrected region box_iou would compute for the same four numbers. The three functions accept the same [x0,y0,x1,y1] shape but disagree on what a reversed one means.
Guarantees and edge cases
Flat-buffer dimension guards are not uniform across the family.
image_featuresandimage_quality's*_flatfunctions all checkwidth <= 0 or height <= 0 or width > len(flat) // heightbefore reshaping, and return a degenerate0.0/-1/Falserather than ever lettingreshape_to_gridzero-pad a declared grid larger than the supplied pixels.image_similarityhas no such guard — its_pixel_valuehelper returns0.0for any out-of-range index, so a mismatchedwidth/heightsilently compares against zero-padding instead of being refused. See theimage_similaritysection above.Two size ceilings bound wire-supplied allocations, and they don't cover every caller.
image_features.color_histogram/dominant_colorsclampbins_per_channel/levelstoMAX_COLOR_HISTOGRAM_BINS = 64(bounding thebins³histogram array), andmost_salient_cell_flatclampsgrid_rows/grid_colstoMAX_SALIENCY_DIM = 1024. Neitherimage_features.saliency_grid(the non-flat variant) norimage_regions.saliency_box_flatapplies that second ceiling — both passgrid_rows/grid_colsstraight through to the grid allocation, so a caller reaching saliency scoring throughimage_regionsrather thanimage_features.most_salient_cell_flatdoes not get the same allocation bound for free.Non-finite RGB input is skipped, not rejected.
color_histogramchecks each channel withisnan/isinfbefore callingInt()on it (an uncatchable abort otherwise) and simply skips that pixel — a buffer with a handful ofNaNpixels produces a histogram normalized over the remaining finite pixels, not an error and not a zero-filled bin for the bad ones.Degenerate-input sentinels are specific values, not
0.0across the board.psnr_flatreturns99.0(not+inf) whenmse <= 1e-12;normalized_cross_correlation_flatreturns1.0if both images are flat and identical (mae <= 1e-12), else0.0if they're flat but different (e.g. solid black vs. solid white — genuinely uncorrelated by this metric, not undefined);histogram_correlationreturns0.0for either flat histogram;expert-style ties indominant_colors/most_salient_cellresolve to the first index scanned, since every comparison is strict>.
Verification
All four mojo/tests/libs/test_image_*.mojo files are auto-generated coverage smoke tests: they call every function once on small fixed fixtures (mostly a generic 5-element list, though test_image_similarity.mojo and test_image_regions.mojo build purpose-shaped 6×6/8×8 mask and "document" fixtures) and assert only that the result is finite or non-negative-length — none of the four pin a specific expected number. tests/mojo/test_wave*.mojo has no hand-verified suites for these four modules either. Every numeric example above was independently hand-traced against the real formulas in mojo/engine/image_features.mojo, image_quality.mojo, image_similarity.mojo, and image_regions.mojo (plus, for the connected-components and box-order examples, the real fixture data inside mojo/tests/libs/test_image_regions.mojo), then cross-checked with an independent line-by-line Python re-implementation of each formula — every number given can be reproduced by re-running that arithmetic.
Next: see Runtime library catalog for every module and function, or Data quality for the equivalent reject/route scoring pattern applied to tabular rather than image data.
Last updated
Was this helpful?