Skip to content

A C++17 port of the JavaScript pixelmatch library (with python binding), providing a small pixel-level image comparison library.

License

Notifications You must be signed in to change notification settings

cubao/pybind11_pixelmatch

 
 

Repository files navigation

about python package

install

pip install pybind11-pixelmatch

diff image

pip install fire # for CLI
python3 -m pybind11_pixelmatch --help
python3 -m pybind11_pixelmatch data/pic1.png data/pic2.png diff_output.png
label image
img1
img2
diff
# diffColor -> delete
# diffColorAlt -> insert
python3 -m pybind11_pixelmatch data/pic1.png data/pic2.png --output data/diff.png --diffColor='#ff0000' --diffColorAlt='#00ff00'
label image
img1
img2
diff

If you want a pure python package, then try pip install pixelmatch. But it's much slower.


pixelmatch-cpp17

Build Status License: ISC codecov

A C++17 port of the JavaScript pixelmatch library, providing a small pixel-level image comparison library.

Features accurate anti-aliased pixels detection and perceptual color difference metrics.

Based on mapbox/pixelmatch. pixelmatch-cpp17 is around 300 lines of code, and has no dependencies, operating on RGBA-encoded buffers.

pixelmatch::Options options;
options.threshold = 0.1f;

const std::vector<uint8_t> img1 = ...;
const std::vector<uint8_t> img2 = ...;
std::vector<uint8_t> diffImage(img1.size());

const int numDiffPixels = pixelmatch::pixelmatch(img1, img2, diffImage, width, height, stride, options);

Compared to mapbox/pixelmatch-cpp, pixelmatch-cpp17 ports the latest features from the JavaScript library, and is built with production-grade practices, including thorough test coverage and fuzz-testing. Build files are included for Bazel, but contributions for other build systems are welcome.

Implements ideas from the following papers:

Example output

expected actual diff
1diff
1diff
1diff

API

pixelmatch(img1, img2, output, width, height, strideInPixels[, options])

  • img1, img2 — Image data of the images to compare, as a RGBA-encoded byte array. Note: image dimensions must be equal.
  • output — Image data to write the diff to, or std::nullopt if you don't need a diff image.
  • width, height — Width and height of the images. Note that all three images need to have the same dimensions.
  • strideInPixels — Stride of the images. Note that all three images need to have the same stride.
  • options is a struct with the following fields:
    • threshold — Matching threshold, ranges from 0.0f to 1.0f. Smaller values make the comparison more sensitive. 0.1 by default.
    • includeAA — If true, disables detecting and ignoring anti-aliased pixels. false by default.
    • alpha — Blending factor of unchanged pixels in the diff output. Ranges from 0 for pure white to 1 for original brightness. 0.1 by default.
    • aaColor — The color of anti-aliased pixels in the diff output as an RGBA color. (255, 255, 0, 255) by default.
    • diffColor — The color of differing pixels in the diff output as an RGBA color (255, 0, 0, 255) by default.
    • diffColorAlt — An alternative color to use for dark on light differences to differentiate between "added" and "removed" parts. If not provided, all differing pixels use the color specified by diffColor. std::nullopt by default.
    • diffMask — Draw the diff over a transparent background (a mask), rather than over the original image. Will not draw anti-aliased pixels (if detected).

Compares two images, writes the output diff and returns the number of mismatched pixels.

Usage

Bazel

Add the following to your WORKSPACE file:

git_repository(
    name = "pixelmatch-cpp17",
    branch = "main",
    remote = "https://github.com/jwmcglynn/pixelmatch-cpp17",
)

Then add a dependency on @pixelmatch-cpp17:

cc_test(
    name = "my_test",
    # ...
    data = glob([
      "testdata/*.png",
    ]),
    deps = [
        "@pixelmatch-cpp17",
        # ...
    ],
)

In your test file, include pixelmatch with:

#include <pixelmatch/pixelmatch.h>

About

A C++17 port of the JavaScript pixelmatch library (with python binding), providing a small pixel-level image comparison library.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 73.3%
  • Python 10.3%
  • Makefile 6.2%
  • Starlark 4.5%
  • Dockerfile 2.9%
  • CMake 2.4%
  • Shell 0.4%