diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-12-05 20:14:20 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-12-05 20:14:20 +0000 |
commit | d8b258c5e97adbc8e73dd73b319d1cdacb4c15d7 (patch) | |
tree | 2e231f5f9b065898111a36b76e7bfab5d6e49b35 /third_party/fuzzymatch | |
parent | e1a6d0a8acf8c1b93d97f8fb22740bfee4ee7cda (diff) | |
download | chromium_src-d8b258c5e97adbc8e73dd73b319d1cdacb4c15d7.zip chromium_src-d8b258c5e97adbc8e73dd73b319d1cdacb4c15d7.tar.gz chromium_src-d8b258c5e97adbc8e73dd73b319d1cdacb4c15d7.tar.bz2 |
Add fuzzy image matching tool for Linux pixel tests
Review URL: http://codereview.chromium.org/13159
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6444 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/fuzzymatch')
-rw-r--r-- | third_party/fuzzymatch/SConstruct | 1 | ||||
-rw-r--r-- | third_party/fuzzymatch/fuzzymatch.c | 98 |
2 files changed, 99 insertions, 0 deletions
diff --git a/third_party/fuzzymatch/SConstruct b/third_party/fuzzymatch/SConstruct new file mode 100644 index 0000000..4fe7baa --- /dev/null +++ b/third_party/fuzzymatch/SConstruct @@ -0,0 +1 @@ +Program('fuzzymatch.c', LIBS = ['lept', 'png', 'jpeg', 'tiff', 'z', 'm']) diff --git a/third_party/fuzzymatch/fuzzymatch.c b/third_party/fuzzymatch/fuzzymatch.c new file mode 100644 index 0000000..b1624e0 --- /dev/null +++ b/third_party/fuzzymatch/fuzzymatch.c @@ -0,0 +1,98 @@ +// Copyright (c) 2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/* Fuzzy pixel test matching. + * + * This is designed to compare two layout test images (RGB 800x600) and manage + * to ignore the noise caused by the font renderers choosing slightly different + * pixels. + * + * A B + * | | + * |--->delta<---| + * | + * V + * gray + * | + * V + * binary + * | + * |-------------| + * | | + * 1x3 3x1 Morphological openings + * | | + * |-----OR------| + * | + * V + * count pixels + * + * The result is that three different pixels in a row (vertically or + * horizontally) will cause the match to fail and the binary exits with code 1. + * Otherwise the binary exists with code 0. + * + * This requires leptonica to be installed. On Ubuntu do + * # apt-get install libleptonica libleptonica-dev + * + * Build with: + * % gcc -o fuzzymatch fuzzymatch.c -llept -ljpeg -ltiff -lpng -lz -lm -Wall -O2 + */ + +#include <unistd.h> +#include <stdio.h> +#include <leptonica/allheaders.h> + +static int +usage(const char *argv0) { + fprintf(stderr, "Usage: %s <input a> <input b>\n", argv0); + return 1; +} + +int +main(int argc, char **argv) { + if (argc != 3) + return usage(argv[0]); + + PIX *a = pixRead(argv[1]); + PIX *b = pixRead(argv[2]); + + if (!a) { + fprintf(stderr, "Failed to open %s\n", argv[1]); + return 1; + } + + if (!b) { + fprintf(stderr, "Failed to open %s\n", argv[1]); + return 1; + } + + if (pixGetWidth(a) != pixGetWidth(b) || + pixGetHeight(a) != pixGetHeight(b)) { + fprintf(stderr, "Inputs are difference sizes\n"); + return 1; + } + + PIX *delta = pixAbsDifference(a, b); + pixInvert(delta, delta); + pixDestroy(&a); + pixDestroy(&b); + + PIX *deltagray = pixConvertRGBToGray(delta, 0, 0, 0); + pixDestroy(&delta); + + PIX *deltabinary = pixThresholdToBinary(deltagray, 254); + + PIX *hopened = pixOpenBrick(NULL, deltabinary, 3, 1); + PIX *vopened = pixOpenBrick(NULL, deltabinary, 1, 3); + pixDestroy(&deltabinary); + + PIX *opened = pixOr(NULL, hopened, vopened); + pixDestroy(&hopened); + pixDestroy(&vopened); + + l_int32 count; + pixCountPixels(opened, &count, NULL); + fprintf(stderr, "%d\n", count); + + return count; +} |