From 1e7c3a9e6831b211e3d35d0e097831aa9f5c8c03 Mon Sep 17 00:00:00 2001 From: danblooomberg Date: Fri, 24 May 2024 00:12:04 -0700 Subject: [PATCH] Add pixCropImage() option to aggressively remove side noise * This is from the left and right sides, and is invoked in prog/croppdf by using a negative input paramater for edgeclean. * New prog/misctest2.c to have page cropping and cleaning examples, with two sample music notation images. Existing cropping and cleaning examples have been removed from prog/misctest1.c. --- prog/CMakeLists.txt | 1 + prog/Makefile.am | 2 +- prog/boismort.1.tif | Bin 0 -> 42020 bytes prog/boismort.15.tif | Bin 0 -> 28604 bytes prog/croppdf.c | 6 ++- prog/makefile.static | 10 ++-- prog/misctest1.c | 32 ------------- prog/misctest2.c | 94 ++++++++++++++++++++++++++++++++++++ src/allheaders.h | 2 +- src/morphseq.c | 3 +- src/pageseg.c | 111 +++++++++++++++++++++++++++++++++++++------ src/pdfapp.c | 4 +- sw.cpp | 1 + version-notes.html | 5 +- 14 files changed, 214 insertions(+), 57 deletions(-) create mode 100644 prog/boismort.1.tif create mode 100644 prog/boismort.15.tif create mode 100644 prog/misctest2.c diff --git a/prog/CMakeLists.txt b/prog/CMakeLists.txt index 4b2fd2e88..73fd28b59 100644 --- a/prog/CMakeLists.txt +++ b/prog/CMakeLists.txt @@ -260,6 +260,7 @@ add_prog_target(maketile maketile.c) add_prog_target(maptest maptest.c) add_prog_target(messagetest messagetest.c) add_prog_target(misctest1 misctest1.c) +add_prog_target(misctest2 misctest2.c) add_prog_target(modifyhuesat modifyhuesat.c) add_prog_target(morphseq_reg morphseq_reg.c) add_prog_target(morphtest1 morphtest1.c) diff --git a/prog/Makefile.am b/prog/Makefile.am index 25b0e6ece..af3fb8cc7 100644 --- a/prog/Makefile.am +++ b/prog/Makefile.am @@ -98,7 +98,7 @@ OTHER_PROGS = adaptmap_dark \ listtest lightcolortest livre_adapt livre_hmt \ livre_makefigs livre_orient \ livre_pageseg livre_seedgen livre_tophat \ - maketile maptest messagetest misctest1 \ + maketile maptest messagetest misctest1 misctest2 \ modifyhuesat morphtest1 \ numaranktest otsutest1 otsutest2 \ pagesegtest1 pagesegtest2 \ diff --git a/prog/boismort.1.tif b/prog/boismort.1.tif new file mode 100644 index 0000000000000000000000000000000000000000..ef8725613abfa374f61222d8c66eb6b9d5f9a8e9 GIT binary patch literal 42020 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 literal 0 HcmV?d00001 diff --git a/prog/croppdf.c b/prog/croppdf.c index f78d451db..ca543b36d 100644 --- a/prog/croppdf.c +++ b/prog/croppdf.c @@ -48,8 +48,10 @@ * The %lrclear and %tbclear parameters give the number of background * pixels to be added to the foreground region. * - * The %edgeclean parameter is used to remove edge noise, going from - * 0 (default, no removal) to 15 (maximally aggressive removal). + * The %edgeclean parameter is used to remove edge noise: + * -1: aggressively removes left and right side noise + * 0: default, no removal + * 1-15: removal of random noise, where 15 is maximally aggressive * * The suggested value for %lradd and %tbadd is 50. Laser printers do not * print foreground pixels very close to the page edges, and using a diff --git a/prog/makefile.static b/prog/makefile.static index 8169b7195..01ed170da 100644 --- a/prog/makefile.static +++ b/prog/makefile.static @@ -238,7 +238,8 @@ SRC = adaptmap_reg.c adaptnorm_reg.c affine_reg.c \ lightcolortest.c listtest.c \ livre_adapt.c livre_hmt.c livre_makefigs.c livre_orient.c \ livre_pageseg.c livre_seedgen.c livre_tophat.c \ - maketile.c maptest.c messagetest.c misctest1.c \ + maketile.c maptest.c messagetest.c \ + misctest1.c misctest2.c \ modifyhuesat.c morphtest1.c \ numaranktest.c otsutest1.c otsutest2.c \ pagesegtest1.c pagesegtest2.c \ @@ -516,10 +517,10 @@ findcorners_reg: findcorners_reg.o $(LEPTLIB) $(CC) -o findcorners_reg findcorners_reg.o $(ALL_LIBS) $(EXTRALIBS) findpattern1_reg: findpattern1_reg.o $(LEPTLIB) - $(CC) -o findpattern_reg findpattern1_reg.o $(ALL_LIBS) $(EXTRALIBS) + $(CC) -o findpattern1_reg findpattern1_reg.o $(ALL_LIBS) $(EXTRALIBS) findpattern2_reg: findpattern2_reg.o $(LEPTLIB) - $(CC) -o findpattern_reg findpattern2_reg.o $(ALL_LIBS) $(EXTRALIBS) + $(CC) -o findpattern2_reg findpattern2_reg.o $(ALL_LIBS) $(EXTRALIBS) flipdetect_reg: flipdetect_reg.o $(LEPTLIB) $(CC) -o flipdetect_reg flipdetect_reg.o $(ALL_LIBS) $(EXTRALIBS) @@ -1037,6 +1038,9 @@ messagetest: messagetest.o $(LEPTLIB) misctest1: misctest1.o $(LEPTLIB) $(CC) -o misctest1 misctest1.o $(ALL_LIBS) $(EXTRALIBS) +misctest2: misctest2.o $(LEPTLIB) + $(CC) -o misctest2 misctest2.o $(ALL_LIBS) $(EXTRALIBS) + modifyhuesat: modifyhuesat.o $(LEPTLIB) $(CC) -o modifyhuesat modifyhuesat.o $(ALL_LIBS) $(EXTRALIBS) diff --git a/prog/misctest1.c b/prog/misctest1.c index 7baedf65b..7cde4e54f 100644 --- a/prog/misctest1.c +++ b/prog/misctest1.c @@ -40,8 +40,6 @@ * * Show sampled scaling with and without source indexing shift * * Display differences in images with pixDisplayDiff() * * Demonstrate read of cmap+alpha png, and I/O of rgba pnm, bmp, webp - * * Demonstrate image cropping function - * * Demonstrate image cleaning function */ #ifdef HAVE_CONFIG_H @@ -414,35 +412,5 @@ PIXCMAP *cmap, *cmapg; #endif /* HAVE_LIBWEBP */ pixDestroy(&pix1); - /* Page cropping */ - pix1 = pixRead("tel_3.tif"); - pix2 = pixCropImage(pix1, 30, 30, 4, 25, 25, 1.15, - "/tmp/lept/misc/cropdebug.pdf", NULL); - pixDestroy(&pix1); - pixDestroy(&pix2); - - /* Page cleaning */ - pixa1 = pixaCreate(3); - pix1 = pixRead("tel_3.tif"); - pix2 = pixRotate(pix1, 0.02, L_ROTATE_SAMPLING, L_BRING_IN_WHITE, 0, 0); - pix3 = pixCleanImage(pix2, 1, 0, 1, 0); - pixaAddPix(pixa1, pix3, L_INSERT); - pixDisplay(pix3, 800, 800); - pixDestroy(&pix1); - pixDestroy(&pix2); - pix1 = pixRead("w91frag.jpg"); - pixaAddPix(pixa1, pixScale(pix1, 2.5, 2.5), L_INSERT); - pix2 = pixRotate(pix1, 0.02, L_ROTATE_AREA_MAP, L_BRING_IN_WHITE, 0, 0); - pix3 = pixCleanImage(pix2, 1, 0, 1, 0); - pixaAddPix(pixa1, pixScale(pix3, 2.5, 2.5), L_INSERT); - pixDisplay(pix3, 1200, 800); - pixDestroy(&pix1); - pixDestroy(&pix2); - pixDestroy(&pix3); - lept_stderr("Writing /tmp/lept/misc/pageclean.pdf\n"); - pixaConvertToPdf(pixa1, 0, 1.0, L_DEFAULT_ENCODE, 50, NULL, - "/tmp/lept/misc/pageclean.pdf"); - pixaDestroy(&pixa1); - return 0; } diff --git a/prog/misctest2.c b/prog/misctest2.c new file mode 100644 index 000000000..76972b3d6 --- /dev/null +++ b/prog/misctest2.c @@ -0,0 +1,94 @@ +/*====================================================================* + - 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. + *====================================================================*/ + +/* + * misctest2.c + * * Page cropping with light filtering + * * Page cropping with removal of fg on left and right sides + * * Demonstrate image cleaning function + */ + +#ifdef HAVE_CONFIG_H +#include +#endif /* HAVE_CONFIG_H */ + +#include "allheaders.h" + +int main(int argc, + char **argv) +{ +PIX *pix1, *pix2, *pix3; +PIXA *pixa1; + + setLeptDebugOK(1); + lept_mkdir("lept/misc"); + + /* Page cropping with light filtering */ + pix1 = pixRead("tel_3.tif"); + pix2 = pixCropImage(pix1, 30, 30, 4, 25, 25, 1.15, + "/tmp/lept/misc/crop_tel3.pdf", NULL); + pixDestroy(&pix1); + pixDestroy(&pix2); + + /* Page cropping with removal of fg on left and right sides */ + pix1 = pixRead("boismort.1.tif"); + pix2 = pixCropImage(pix1, 50, 50, -1, 70, 70, 1.1, + "/tmp/lept/misc/crop_bois1.pdf", NULL); + pixDestroy(&pix1); + pixDestroy(&pix2); + + /* Page cropping with removal of fg on left and right sides */ + pix1 = pixRead("boismort.15.tif"); + pix2 = pixCropImage(pix1, 50, 50, -1, 70, 70, 1.1, + "/tmp/lept/misc/crop_bois15.pdf", NULL); + pixDestroy(&pix1); + pixDestroy(&pix2); + + /* Page cleaning */ + pixa1 = pixaCreate(3); + pix1 = pixRead("tel_3.tif"); + pix2 = pixRotate(pix1, 0.02, L_ROTATE_SAMPLING, L_BRING_IN_WHITE, 0, 0); + pix3 = pixCleanImage(pix2, 1, 0, 1, 0); + pixaAddPix(pixa1, pix3, L_INSERT); + pixDisplay(pix3, 800, 800); + pixDestroy(&pix1); + pixDestroy(&pix2); + pix1 = pixRead("w91frag.jpg"); + pixaAddPix(pixa1, pixScale(pix1, 2.5, 2.5), L_INSERT); + pix2 = pixRotate(pix1, 0.02, L_ROTATE_AREA_MAP, L_BRING_IN_WHITE, 0, 0); + pix3 = pixCleanImage(pix2, 1, 0, 1, 0); + pixaAddPix(pixa1, pixScale(pix3, 2.5, 2.5), L_INSERT); + pixDisplay(pix3, 1200, 800); + pixDestroy(&pix1); + pixDestroy(&pix2); + pixDestroy(&pix3); + lept_stderr("Writing /tmp/lept/misc/pageclean.pdf\n"); + pixaConvertToPdf(pixa1, 0, 1.0, L_DEFAULT_ENCODE, 50, NULL, + "/tmp/lept/misc/pageclean.pdf"); + pixaDestroy(&pixa1); + + return 0; +} diff --git a/src/allheaders.h b/src/allheaders.h index 5f172e7ee..f457610ae 100644 --- a/src/allheaders.h +++ b/src/allheaders.h @@ -1377,7 +1377,7 @@ LEPT_DLL extern PIX * pixGenerateHalftoneMask ( PIX *pixs, PIX **ppixtext, l_int LEPT_DLL extern PIX * pixGenTextlineMask ( PIX *pixs, PIX **ppixvws, l_int32 *ptlfound, PIXA *pixadb ); LEPT_DLL extern PIX * pixGenTextblockMask ( PIX *pixs, PIX *pixvws, PIXA *pixadb ); LEPT_DLL extern PIX * pixCropImage ( PIX *pixs, l_int32 lr_clear, l_int32 tb_clear, l_int32 edgeclean, l_int32 lr_border, l_int32 tb_border, l_float32 maxwiden, const char *debugfile, BOX **pcropbox ); -LEPT_DLL extern PIX * pixRescaleForCropping ( PIX *pixs, l_int32 w, l_int32 h, l_int32 lr_border, l_int32 tb_border, l_float32 maxwiden, PIX **ppixsc ); +LEPT_DLL extern l_int32 pixMaxCompAfterVClosing ( PIX *pixs, BOX **pbox ); LEPT_DLL extern PIX * pixCleanImage ( PIX *pixs, l_int32 contrast, l_int32 rotation, l_int32 scale, l_int32 opensize ); LEPT_DLL extern BOX * pixFindPageForeground ( PIX *pixs, l_int32 threshold, l_int32 mindist, l_int32 erasedist, l_int32 showmorph, PIXAC *pixac ); LEPT_DLL extern l_ok pixSplitIntoCharacters ( PIX *pixs, l_int32 minw, l_int32 minh, BOXA **pboxa, PIXA **ppixa, PIX **ppixdebug ); diff --git a/src/morphseq.c b/src/morphseq.c index 1fa3fc18e..39280255a 100644 --- a/src/morphseq.c +++ b/src/morphseq.c @@ -241,7 +241,8 @@ SARRAY *sa; } if (pdfout) { - snprintf(fname, sizeof(fname), "/tmp/lept/seq_output_%d.pdf", L_ABS(dispsep)); + snprintf(fname, sizeof(fname), "/tmp/lept/seq_output_%d.pdf", + L_ABS(dispsep)); pixaConvertToPdf(pixa, 0, 1.0, L_FLATE_ENCODE, 0, fname, fname); pixaDestroy(&pixa); } diff --git a/src/pageseg.c b/src/pageseg.c index dab3058a1..de3575218 100644 --- a/src/pageseg.c +++ b/src/pageseg.c @@ -43,10 +43,11 @@ * PIX *pixGenTextblockMask() * * Location and extraction of page foreground; cleaning pages - * PIX *pixCropImage() - * PIX *pixRescaleForCropping() - * PIX *pixCleanImage() - * BOX *pixFindPageForeground() + * PIX *pixCropImage() + * static l_int32 pixMaxCompAfterVClosing() + * static PIX *pixRescaleForCropping() + * PIX *pixCleanImage() + * BOX *pixFindPageForeground() * * Extraction of characters from image with only text * l_int32 pixSplitIntoCharacters() @@ -94,6 +95,10 @@ static const l_int32 MinWidth = 100; static const l_int32 MinHeight = 100; +static PIX *pixRescaleForCropping(PIX *pixs, l_int32 w, l_int32 h, + l_int32 lr_border, l_int32 tb_border, + l_float32 maxwiden, PIX **ppixsc); + /*------------------------------------------------------------------* * Top level page segmentation * *------------------------------------------------------------------*/ @@ -534,9 +539,10 @@ PIX *pix1, *pix2, *pix3, *pixd; * \param[in] pixs full resolution (any type or depth) * \param[in] lr_clear full res pixels cleared at left and right sides * \param[in] tb_clear full res pixels cleared at top and bottom sides - * \param[in] edgeclean parameter for removing edge noise (0-15) + * \param[in] edgeclean parameter for removing edge noise (-1 to 15) * default = 0 (no removal); - * 15 is maximally aggressive + * 15 is maximally aggressive for random noise + * -1 for aggressively removing side noise * \param[in] lr_border full res final "added" pixels on left and right * \param[in] tb_border full res final "added" pixels on top and bottom * \param[in] maxwiden max fractional horizontal stretch allowed @@ -551,6 +557,9 @@ PIX *pix1, *pix2, *pix3, *pixd; * (b) Clears near the border by %lr_clear/2 and %tb_clear/2 pixels * (c) If %edgeclean > 0, it removes isolated sets of pixels, * using a close/open operation of size %edgeclean + 1. + * If %edgeclean < 0, it uses a large vertical morphological + * closing and the extraction of the largest resulting + * connected component to eliminate noise on left and right sides. * (d) Find the bounding box of remaining fg pixels and scales * the box up 2x back to full resolution. * (e) Crops the binarized image to the bounding box. @@ -566,7 +575,9 @@ PIX *pix1, *pix2, *pix3, *pixd; * (4) The "clear" parameters act on the input image, whereas the * "border" parameters act to give a white border to the final * image. They are not literally added, because the input and final - * images are the same size. + * images are the same size. If the resulting images are to be + * printed, it is useful to have border pixel parameters of at + * least 60 at 300 ppi, to avoid losing content at the edges. * (5) This is not intended to work on small thumbnails. The * dimensions of pixs must be at least MinWidth x MinHeight. * (6) Step (f) above helps with orthographically-produced music notation, @@ -586,7 +597,7 @@ pixCropImage(PIX *pixs, BOX **pcropbox) { char cmd[64]; -l_int32 w, h, val; +l_int32 w, h, val, ret; BOX *box1, *box2; PIX *pix1, *pix2, *pix3; PIXA *pixa1; @@ -594,7 +605,6 @@ PIXA *pixa1; if (pcropbox) *pcropbox = NULL; if (!pixs) return (PIX *)ERROR_PTR("pixs not defined", __func__, NULL); - if (edgeclean < 0) edgeclean = 0; if (edgeclean > 15) { L_WARNING("edgeclean > 15; setting to 15\n", __func__); edgeclean = 15; @@ -628,18 +638,30 @@ PIXA *pixa1; tb_clear / 2, PIX_CLR); if (pixa1) pixaAddPix(pixa1, pixScale(pix2, 2.0, 2.0), L_INSERT); - /* Optional morphological close/open and find the bounding box - * of the foreground pixels. */ + /* Choose one of three methods for extracting foreground pixels: + * (1) Include all foreground pixels + * (2) Do a morphological close/open to remove noise throughout + * the image before finding a b.b. for remaining f.g. pixels + * (3) Do a large vertical closing and choose the largest (by area) + * component to avoid foreground noise on left and right sides */ if (edgeclean == 0) { - pixClipToForeground(pix2, NULL, &box1); - } else { + ret = pixClipToForeground(pix2, NULL, &box1); + } else if (edgeclean > 0) { val = edgeclean + 1; snprintf(cmd, 64, "c%d.%d + o%d.%d", val, val, val, val); pix3 = pixMorphSequence(pix2, cmd, 0); - pixClipToForeground(pix3, NULL, &box1); + ret = pixClipToForeground(pix3, NULL, &box1); pixDestroy(&pix3); + } else { /* edgeclean < 0) */ + ret = pixMaxCompAfterVClosing(pix2, &box1); } pixDestroy(&pix2); + if (ret) { + L_ERROR("no returned b.b. for foreground\n", __func__); + pixDestroy(&pix1); + pixaDestroy(&pixa1); + return NULL; + } /* Transform to full resolution */ box2 = boxTransform(box1, 0, 0, 2.0, 2.0); /* full res */ @@ -683,6 +705,65 @@ PIXA *pixa1; } +/*! + * \brief pixMaxCompAfterVClosing() + * + * \param[in] pixs 1 bpp (input at 2x reduction) + * \param[out] **pbox main region at input resolution (2x reduction) + * \return 0 if OK, 1 on error + * + *
+ * Notes:
+ *      (1) This removes foreground noise along left and right edges,
+ *          returning a bounding box for the remaining foreground pixels
+ *          at the input resolution.
+ *      (2) The input %pixs should be at a resolution 100 - 150 ppi.
+ *      (3) It does two 2x level1 rank binary reductions, followed
+ *          by a large vertical close/open, and then a 4x expansion
+ *          back to the input resolution.
+ *      (4) It is used as an option to pixCropImage(), when given
+ *          a negative %edgecrop parameter.
+ * 
+ */ +l_int32 +pixMaxCompAfterVClosing(PIX *pixs, + BOX **pbox) +{ +l_int32 w, h, i, n, maxindex, maxarea, empty; +BOXA *boxa1; +PIX *pix1; + + if (!pbox) + return ERROR_INT("pbox not defined", __func__, 1); + *pbox = NULL; + if (!pixs || pixGetDepth(pixs) != 1) + return ERROR_INT("pixs undefined or not 1 bpp", __func__, 1); + + /* Strong vertical closing */ + pix1 = pixMorphSequence(pixs, "r11 + c1.50 + o1.50 + x4", 0); + pixZero(pix1, &empty); + if (empty) + return ERROR_INT("pix1 is empty", __func__, 1); + + /* Find the c.c. with largest area and return its bounding box */ + boxa1 = pixConnCompBB(pix1, 8); + pixDestroy(&pix1); + n = boxaGetCount(boxa1); + maxindex = 0; + maxarea = 0; + for (i = 0; i < n; i++) { + boxaGetBoxGeometry(boxa1, i, NULL, NULL, &w, &h); + if (w * h > maxarea) { + maxarea = w * h; + maxindex = i; + } + } + *pbox = boxaGetBox(boxa1, maxindex, L_COPY); + boxaDestroy(&boxa1); + return 0; +} + + /*! * \brief pixRescaleForCropping() * @@ -711,7 +792,7 @@ PIXA *pixa1; * unpleasingly distorted; hence the suggestion not to exceed it. * */ -PIX * +static PIX * pixRescaleForCropping(PIX *pixs, l_int32 w, l_int32 h, diff --git a/src/pdfapp.c b/src/pdfapp.c index 76890d58c..bf1107dff 100644 --- a/src/pdfapp.c +++ b/src/pdfapp.c @@ -232,8 +232,10 @@ PIXAC *pixac1 = NULL; * \param[in] sa sorted full pathnames of images * \param[in] lr_clear full res pixels cleared at left and right sides * \param[in] tb_clear full res pixels cleared at top and bottom sides - * \param[in] edgeclean parameter for removing edge noise (0-15) + * \param[in] edgeclean parameter for removing edge noise (-1 to 15) * default = 0 (no removal); + * 15 is maximally aggressive for random noise + * -1 for aggressively removing side noise * \param[in] lr_add full res expansion of crop box on left and right * \param[in] tb_add full res expansion of crop box on top and bottom * \param[in] maxwiden max fractional horizontal stretch allowed diff --git a/sw.cpp b/sw.cpp index 41f61d36a..18988f2f4 100644 --- a/sw.cpp +++ b/sw.cpp @@ -304,6 +304,7 @@ void build(Solution &s) {"maptest", {"maptest.c"}}, {"messagetest", {"messagetest.c"}}, {"misctest1", {"misctest1.c"}}, + {"misctest2", {"misctest2.c"}}, {"modifyhuesat", {"modifyhuesat.c"}}, {"morphseq_reg", {"morphseq_reg.c"}}, {"morphtest1", {"morphtest1.c"}}, diff --git a/version-notes.html b/version-notes.html index ce137cc1e..cb97be945 100644 --- a/version-notes.html +++ b/version-notes.html @@ -101,16 +101,19 @@

* Fix generation of bad colormap indices in jbcorrelation and jbrankhaus * Fixed coverity scan issues. * Added findpattern2_reg.c to show generation of sels and their use. + * Added misctest2.c to show crop and clean page functions. + * Added page crop option for removing noise on left and right sides. * Source files changed: adaptmap.c colormap.c, compare.c, gplot.c, grayquant.c, jbclass.c, jp2kheader.c, jp2kheaderstub.c, jp2kio.c, libversions.c, - partify.c, pdfio2.c, pixconv.c, + morphseq.c, pageseg.c partify.c, pdfapp.c, pdfio2.c, pixconv.c, psio2.c, readfile.c, sel1.c, utils2.c, writefile.c, allheaders.h, environ.h * Prog files changed: alltests_reg.c, binmorph3_reg.c, blend2_reg.c, cleanpdf.c, compressedpdf.c, croppdf.c, findpattern_reg.c, findpattern1_reg.c findpattern2_reg.c, htmlviewer.c, jp2kio_reg.c, libre_makefigs.c, + misctest1.c, misctest2.c, pdfio2_reg.c, printimage.c, printsplitimage.c, printtiff.c, psioseg_reg.c, splitpdf.c, string_reg.c, tiffpdftest.c, xtractprotos.c