diff options
Diffstat (limited to 'leptonica/prog/binmorph2_reg.c')
-rw-r--r-- | leptonica/prog/binmorph2_reg.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/leptonica/prog/binmorph2_reg.c b/leptonica/prog/binmorph2_reg.c new file mode 100644 index 00000000..7b34794f --- /dev/null +++ b/leptonica/prog/binmorph2_reg.c @@ -0,0 +1,227 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +/* + * binmorph2_reg.c + * + * Thorough regression test for binary separable rasterops, + * using the sequence interpreters. This compares the + * results for 2-way composite Sels with unitary Sels, + * all invoked on the separable block morph ops. + */ + +#ifdef HAVE_CONFIG_H +#include <config_auto.h> +#endif /* HAVE_CONFIG_H */ + +#include "allheaders.h" + +static const l_int32 MAX_SEL_SIZE = 120; + +static void writeResult(const char *sequence, l_int32 same); + + +int main(int argc, + char **argv) +{ +char buffer1[256]; +char buffer2[256]; +l_int32 i, same, same2, factor1, factor2, diff, success; +PIX *pixs, *pixsd, *pixt1, *pixt2, *pixt3; +static char mainName[] = "binmorph2_reg"; + + if (argc != 1) + return ERROR_INT(" Syntax: binmorph2_reg", mainName, 1); + + setLeptDebugOK(1); + pixs = pixRead("feyn-fract.tif"); + pixsd = pixMorphCompSequence(pixs, "d5.5", 0); + success = TRUE; + for (i = 1; i < MAX_SEL_SIZE; i++) { + + /* Check if the size is exactly decomposable */ + selectComposableSizes(i, &factor1, &factor2); + diff = factor1 * factor2 - i; + lept_stderr("%d: (%d, %d): %d\n", i, factor1, factor2, diff); + + /* Carry out operations on identical sized Sels: dilation */ + snprintf(buffer1, sizeof(buffer1), "d%d.%d", i + diff, i + diff); + snprintf(buffer2, sizeof(buffer2), "d%d.%d", i, i); + pixt1 = pixMorphSequence(pixsd, buffer1, 0); + pixt2 = pixMorphCompSequence(pixsd, buffer2, 0); + pixEqual(pixt1, pixt2, &same); + if (i < 64) { + pixt3 = pixMorphCompSequenceDwa(pixsd, buffer2, 0); + pixEqual(pixt1, pixt3, &same2); + } else { + pixt3 = NULL; + same2 = TRUE; + } + if (same && same2) + writeResult(buffer1, 1); + else { + writeResult(buffer1, 0); + success = FALSE; + } + pixDestroy(&pixt1); + pixDestroy(&pixt2); + pixDestroy(&pixt3); + + /* ... erosion */ + snprintf(buffer1, sizeof(buffer1), "e%d.%d", i + diff, i + diff); + snprintf(buffer2, sizeof(buffer2), "e%d.%d", i, i); + pixt1 = pixMorphSequence(pixsd, buffer1, 0); + pixt2 = pixMorphCompSequence(pixsd, buffer2, 0); + pixEqual(pixt1, pixt2, &same); + if (i < 64) { + pixt3 = pixMorphCompSequenceDwa(pixsd, buffer2, 0); + pixEqual(pixt1, pixt3, &same2); + } else { + pixt3 = NULL; + same2 = TRUE; + } + if (same && same2) + writeResult(buffer1, 1); + else { + writeResult(buffer1, 0); + success = FALSE; + } + pixDestroy(&pixt1); + pixDestroy(&pixt2); + pixDestroy(&pixt3); + + /* ... opening */ + snprintf(buffer1, sizeof(buffer1), "o%d.%d", i + diff, i + diff); + snprintf(buffer2, sizeof(buffer2), "o%d.%d", i, i); + pixt1 = pixMorphSequence(pixsd, buffer1, 0); + pixt2 = pixMorphCompSequence(pixsd, buffer2, 0); + pixEqual(pixt1, pixt2, &same); + if (i < 64) { + pixt3 = pixMorphCompSequenceDwa(pixsd, buffer2, 0); + pixEqual(pixt1, pixt3, &same2); + } else { + pixt3 = NULL; + same2 = TRUE; + } + if (same && same2) + writeResult(buffer1, 1); + else { + writeResult(buffer1, 0); + success = FALSE; + } + pixDestroy(&pixt1); + pixDestroy(&pixt2); + pixDestroy(&pixt3); + + /* ... closing */ + snprintf(buffer1, sizeof(buffer1), "c%d.%d", i + diff, i + diff); + snprintf(buffer2, sizeof(buffer2), "c%d.%d", i, i); + pixt1 = pixMorphSequence(pixsd, buffer1, 0); + pixt2 = pixMorphCompSequence(pixsd, buffer2, 0); + pixEqual(pixt1, pixt2, &same); + if (i < 64) { + pixt3 = pixMorphCompSequenceDwa(pixsd, buffer2, 0); + pixEqual(pixt1, pixt3, &same2); + } else { + pixt3 = NULL; + same2 = TRUE; + } + if (same && same2) + writeResult(buffer1, 1); + else { + writeResult(buffer1, 0); + success = FALSE; + } + pixDestroy(&pixt1); + pixDestroy(&pixt2); + pixDestroy(&pixt3); + + } + pixDestroy(&pixs); + pixDestroy(&pixsd); + + if (success) + lept_stderr("\n---------- Success: no errors ----------\n"); + else + lept_stderr("\n---------- Failure: error(s) found -----------\n"); + return 0; +} + + +static void writeResult(const char *sequence, + l_int32 same) +{ + if (same) + lept_stderr("Sequence %s: SUCCESS\n", sequence); + else + lept_stderr("Sequence %s: FAILURE\n", sequence); +} + + +#if 0 + for (i = 1; i < 400; i++) { + selectComposableSizes(i, &factor1, &factor2); + diff = factor1 * factor2 - i; + lept_stderr("%d: (%d, %d): %d\n", + i, factor1, factor2, diff); + selectComposableSels(i, L_HORIZ, &sel1, &sel2); + selDestroy(&sel1); + selDestroy(&sel2); + } +#endif + +#if 0 + selectComposableSels(68, L_HORIZ, &sel1, &sel2); /* 17, 4 */ + str = selPrintToString(sel2); + lept_stderr(str); + selDestroy(&sel1); + selDestroy(&sel2); + lept_free(str); + selectComposableSels(70, L_HORIZ, &sel1, &sel2); /* 10, 7 */ + str = selPrintToString(sel2); + selDestroy(&sel1); + selDestroy(&sel2); + lept_stderr(str); + lept_free(str); + selectComposableSels(85, L_HORIZ, &sel1, &sel2); /* 17, 5 */ + str = selPrintToString(sel2); + selDestroy(&sel1); + selDestroy(&sel2); + lept_stderr(str); + lept_free(str); + selectComposableSels(96, L_HORIZ, &sel1, &sel2); /* 12, 8 */ + str = selPrintToString(sel2); + selDestroy(&sel1); + selDestroy(&sel2); + lept_stderr(str); + lept_free(str); + + { SELA *sela; + sela = selaAddBasic(NULL); + selaWrite("/tmp/junksela.sela", sela); + selaDestroy(&sela); + } +#endif |