Skip to main content

blazediff-interpret

Structured region analysis for image diffs. Given two images and a set of changed regions, it says what changed in each one — not just where.

use blazediff_interpret::{interpret, ChangeSource};

// From a pixel diff — what `blazediff` does.
let result = interpret(&expected, &actual, ChangeSource::Diff {
    output: &diff_image.data,
    diff_count: diff.diff_count,
    diff_percentage: diff.diff_percentage,
})?;

// From a similarity map — what `blazediff-ssim` does.
let result = interpret(&expected, &actual, ChangeSource::ScoreMap {
    map: &outcome.map,
    width: outcome.map_width,
    height: outcome.map_height,
    floor: 0.99,
})?;

// From boxes you already have.
let result = interpret(&expected, &actual, ChangeSource::Regions(&boxes))?;

println!("{}", result.summary);
for region in &result.regions {
    println!("{:?} at {} ({:.2}%)", region.change_type, region.position, region.percentage);
}

Why it's a separate crate

The classifier is deliberately independent of whatever found the regions. Three producers feed it today:

Producer ChangeSource How it finds regions
blazediff Diff connected components over a pixel-diff mask
blazediff-ssim ScoreMap thresholding a local SSIM score map
your code Regions DOM rectangles, a JS-side diff, a crop list — anything

All three call the same function and get identical treatment; only the description of where differs. blazediff and blazediff-ssim are independent of each other, so a classifier living in either would be unreachable from the other. It sits below both instead.

Coarse regions are fine

A producer only has to know roughly where something changed. Before any statistic is computed, the supplied boxes are refined against the source pixels — every pixel whose YIQ delta falls below the noise floor is dropped — so shape, colour and gradient analysis stay per-pixel no matter how blocky the input was. (If a claimed box refines to nothing but the content does differ — a sub-threshold edit such as a subtle uniform recolor — the box is kept as-is so the region still gets meaningful statistics.)

// An 8x8 change, described exactly and then quantized to a 16px grid.
let exact  = interpret(&a, &b, ChangeSource::Regions(&[BoundingBox { x: 16, y: 16, width: 8,  height: 8  }]))?;
let coarse = interpret(&a, &b, ChangeSource::Regions(&[BoundingBox { x: 16, y: 16, width: 16, height: 16 }]))?;
assert_eq!(coarse.diff_count, exact.diff_count); // both 64

That is what makes an SSIM window map a usable region source: its grid is coarse, but the statistics derived from it are not. diff_count therefore means the same thing on every path — actually-changed pixels, never windows.

API

Item Purpose
interpret the entry point: a ChangeSource in, a full InterpretResult out
ChangeSource Diff (a pixel diff's output + counts), ScoreMap (a similarity map), or Regions
classify_region / classify_regions classify against a mask you already hold
detect_regions connected components over a boolean mask
merge_overlapping_components fuse fragmented components whose bboxes overlap or nearly touch
extract_change_mask recover a mask from an RGBA diff visualization
detect_shifts the shift-relabeling pass, for producers holding an exact mask
classify_severity, build_summary the pooling steps, exposed for custom pipelines

Regions arriving from a caller are validated: a box outside the image is an InterpretError::RegionOutOfBounds, not an out-of-bounds panic. That matters now that regions cross the wasm and N-API boundaries.

Python - blazediff-interpret

pip install blazediff-interpret

PyO3 bindings shipped as abi3-py38 wheels for CPython ≥ 3.8 (macOS, Linux manylinux, Windows; arm64 + x86_64). Built from this crate's python Cargo feature.

import blazediff_interpret as interpret

result = interpret.interpret_images("expected.png", "actual.png", "diff.png")
print(result["summary"])
for region in result["regions"]:
    print(region["changeType"], region["bbox"])

# Also: interpret_buffers(bytes, bytes), interpret_ssim(base, compare,
# metric=...) and interpret_regions(base, compare, regions).

The result crosses as a plain dict with camelCase keys, matching the N-API binding and the CLI's --json. interpret_regions takes (x, y, width, height) tuples or mappings with those keys, so a bbox from a prior result feeds straight back in.

What it classifies

Each region gets a change type, a shape, a position, a confidence, and the statistics behind them — colour delta, gradient/edge correlation, luminance correlation, chroma-plane movement (hue rotation, saturation, delta smoothness), fill ratios, and the signals the classifier used. See INTERPRET.md for the full algorithm: pipeline stages, formulas, and classification rules.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

blazediff_interpret-6.3.0-cp38-abi3-win_arm64.whl (607.5 kB view details)

Uploaded CPython 3.8+Windows ARM64

blazediff_interpret-6.3.0-cp38-abi3-win_amd64.whl (641.2 kB view details)

Uploaded CPython 3.8+Windows x86-64

blazediff_interpret-6.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (750.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

blazediff_interpret-6.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (700.9 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

blazediff_interpret-6.3.0-cp38-abi3-macosx_11_0_arm64.whl (629.7 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

blazediff_interpret-6.3.0-cp38-abi3-macosx_10_12_x86_64.whl (668.2 kB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file blazediff_interpret-6.3.0-cp38-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for blazediff_interpret-6.3.0-cp38-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 bf7b3d0f2cbad87d3b70108e237b381b6b9ae9bbe5b7657ae73364b9cb28e890
MD5 e0ac38a111732275d1eff5167545e1cf
BLAKE2b-256 2579ed0e7ee87b12e4b1ff0077ad1a51a29435f2a97a22299586e1ec66ded0d2

See more details on using hashes here.

File details

Details for the file blazediff_interpret-6.3.0-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for blazediff_interpret-6.3.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c8f45b319999fa2098734840b123e9477e2bf94966aed5575738d7675ed1b433
MD5 339f39c38c0814d897dc2defc869c988
BLAKE2b-256 d18f61d368b912e568f585f5cc8f542ce0ae30dfc9e2b33be97236b15e51ac57

See more details on using hashes here.

File details

Details for the file blazediff_interpret-6.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for blazediff_interpret-6.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 194a1bcbf5d6a032d99d149be5e5132fc4252cc441e2ea247ea5938e11065375
MD5 9db3606b09b98d3766819d80cfee1270
BLAKE2b-256 854e9b0b2dcb89a46a3affe7a87570339b02119493fb0ef945f3e975e24c20f7

See more details on using hashes here.

File details

Details for the file blazediff_interpret-6.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blazediff_interpret-6.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 174e8b6cb3affaa07e353a160dc0801906205bce1b42391c0702c134d07dbfce
MD5 e7240bf103257127c4066f3aea834ac5
BLAKE2b-256 4b61482243698b17f5e96410111a9d84d96901c758dee086a2f68119b1c110bc

See more details on using hashes here.

File details

Details for the file blazediff_interpret-6.3.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for blazediff_interpret-6.3.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fe2336a116bbff901201b41ccde2eaa43c648289bbb79d7e6274ae0a0c984a48
MD5 653a864bd2f2c3482a8766b8f04d4527
BLAKE2b-256 3cb10173f745cb7fcca99aa828a8bc72aff44bd6c955ff05779b0c9c33eb3477

See more details on using hashes here.

File details

Details for the file blazediff_interpret-6.3.0-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for blazediff_interpret-6.3.0-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ef578417ece66a73f914f578857afb387bc1afd24dccbb68ab24df8443aeb221
MD5 4dd68ef1065024fbddf7a84d4e069aa6
BLAKE2b-256 7944adc400842f043f8e9b6f4ce7fd55badabac3d3b4ef81513c666a70163792

See more details on using hashes here.

Release history Release notifications | RSS feed

6.4.0

6 files

This release

6.3.0 This release

6 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page