59 #include <config_auto.h>
62 #include "allheaders.h"
72 static l_int32 DefaultMinMax = 70;
75 static COLOREL *colorelCreate(l_int32 x, l_int32 y, l_uint32 color);
77 l_int32 x, l_int32 y,
L_QUEUE *lq,
78 l_int32 maxdiff, l_int32 minarea,
111 l_int32 i, j, w, h, tw, th, ntiles;
117 return (
L_COLORFILL *)ERROR_PTR(
"pixs not defined", __func__, NULL);
118 if (pixGetDepth(pixs) != 32)
119 return (
L_COLORFILL *)ERROR_PTR(
"pixs not 32 bpp", __func__, NULL);
124 if (tw < 10 || th < 10)
125 return (
L_COLORFILL *)ERROR_PTR(
"tile size too small", __func__, NULL);
127 for (i = 0; i < ny; i++) {
128 for (j = 0; j < nx; j++) {
161 L_WARNING(
"ptr address is null!\n", __func__);
165 if ((cf = *pcf) == NULL)
233 PIX *pix1, *pix2, *pix3;
237 return ERROR_INT(
"cf not defined", __func__, 1);
238 if (minmax <= 0) minmax = DefaultMinMax;
240 return ERROR_INT(
"minmax > 200; unreasonably large", __func__, 1);
245 return ERROR_INT(
"pix1 not returned", __func__, 1);
256 for (i = 0; i < n; i++) {
258 pix3 =
pixColorFill(pix2, minmax, maxdiff, smooth, minarea, 0);
303 PIX *pixm, *pixm1, *pixv, *pixnc, *pixncd, *pixss, *pixf;
307 if (!pixs || pixGetDepth(pixs) != 32)
308 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", __func__, NULL);
313 for (y = 0; y < h; y++) {
314 for (x = 0; x < w; x++) {
344 pixOr(pixv, pixv, pixncd);
351 if (debug)
lept_stderr(
"Start: x = %d, y = %d\n", x, y);
357 pixOr(pixm, pixm, pixm1);
409 l_int32 i, j, x, y, rval, gval, bval, start, end;
413 PIX *pix1, *pix2, *pix3, *pix4;
422 start = 128 - range / 2;
423 end = 128 + (range - 1) / 2;
424 for (i = 0; i < nseeds; i++) {
437 for (i = 0; i < nseeds; i++) {
449 for (i = 0; i < nseeds; i++) {
465 for (i = 0; i < h; i++) {
466 for (j = 0; j < w; j++) {
477 for (i = 0; i < nseeds; i++)
491 colorelCreate(l_int32 x,
547 el = colorelCreate(x, y, val);
573 el = colorelCreate(x - 1, y, color);
582 el = colorelCreate(x, y - 1, color);
591 el = colorelCreate(x + 1, y, color);
600 el = colorelCreate(x, y + 1, color);
609 el = colorelCreate(x - 1, y - 1, color);
618 el = colorelCreate(x + 1, y - 1, color);
627 el = colorelCreate(x - 1, y + 1, color);
636 el = colorelCreate(x + 1, y + 1, color);
649 if (debug)
lept_stderr(
" Too small. End: x = %d, y = %d, np = %d\n",
653 if (debug)
lept_stderr(
" Keep. End: x = %d, y = %d, np = %d\n",
754 l_int32 rdiff, gdiff, bdiff, maxindex, del1, del2, del3, maxdel;
755 l_int32 v1[3], v2[3];
759 rdiff = v1[0] - v2[0];
760 gdiff = v1[1] - v2[1];
761 bdiff = v1[2] - v2[2];
763 if (L_ABS(gdiff) > L_ABS(rdiff))
765 if (L_ABS(bdiff) > L_ABS(rdiff) && L_ABS(bdiff) > L_ABS(gdiff))
767 del1 = v1[maxindex] - v2[maxindex];
768 del2 = v1[(maxindex + 1) % 3] - v2[(maxindex + 1) % 3];
769 del3 = v1[(maxindex + 2) % 3] - v2[(maxindex + 2) % 3];
770 maxdel = L_MAX(L_ABS(del1 - del2), L_ABS(del1 - del3));
771 return (maxdel <= maxdiff) ? 1 : 0;
786 l_int32 rval, gval, bval;
789 if (rval < minmax && gval < minmax && bval < minmax)
816 if (neigh != val)
return TRUE;
820 if (neigh != val)
return TRUE;
824 if (neigh != val)
return TRUE;
828 if (neigh != val)
return TRUE;
845 l_int32 i, j, n, nc, w, h, x, y, count;
846 l_float32 rval, gval, bval;
853 PIX *pixm, *pix1, *pix2, *pixdb;
857 return ERROR_INT(
"cf not defind", __func__, 1);
861 for (i = 0; i < n; i++) {
870 pixdb = (debug) ?
pixCreate(w, h, 32) : NULL;
871 for (j = 0; j < nc; j++) {
876 &rval, &gval, &bval);
l_ok boxGetGeometry(const BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
void boxDestroy(BOX **pbox)
boxDestroy()
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
BOXA * boxaCreate(l_int32 n)
boxaCreate()
PIX * pixColorShiftWhitePoint(PIX *pixs, l_int32 rref, l_int32 gref, l_int32 bref)
pixColorShiftWhitePoint()
PIX * pixColorFill(PIX *pixs, l_int32 minmax, l_int32 maxdiff, l_int32 smooth, l_int32 minarea, l_int32 debug)
pixColorFill()
PIXA * makeColorfillTestData(l_int32 w, l_int32 h, l_int32 nseeds, l_int32 range)
makeColorfillTestData()
static l_int32 pixelColorIsValid(l_uint32 val, l_int32 minmax)
pixelColorIsValid()
l_ok pixColorContentByLocation(L_COLORFILL *cf, l_int32 rref, l_int32 gref, l_int32 bref, l_int32 minmax, l_int32 maxdiff, l_int32 minarea, l_int32 smooth, l_int32 debug)
pixColorContentByLocation()
static void pixColorFillFromSeed(PIX *pixs, PIX *pixv, PTA **ppta, l_int32 x, l_int32 y, L_QUEUE *lq, l_int32 maxdiff, l_int32 minarea, l_int32 debug)
pixColorFillFromSeed()
void l_colorfillDestroy(L_COLORFILL **pcf)
l_colorfillDestroy()
L_COLORFILL * l_colorfillCreate(PIX *pixs, l_int32 nx, l_int32 ny)
l_colorfillCreate()
static l_int32 colorsAreSimilarForFill(l_uint32 val1, l_uint32 val2, l_int32 maxdiff)
colorsAreSimilarForFill()
static l_int32 pixelIsOnColorBoundary(PIX *pixs, l_int32 x, l_int32 y)
pixelIsOnColorBoundary()
static l_int32 evalColorfillData(L_COLORFILL *cf, l_int32 debug)
evalColorfillData()
static void pixGetVisitedNeighbors(PIX *pixs, l_int32 x, l_int32 y, l_uint32 *visited)
pixGetVisitedNeighbors()
static l_int32 findNextUnvisited(PIX *pixv, l_int32 *px, l_int32 *py)
findNextUnvisited()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
l_int32 nextOnPixelInRaster(PIX *pixs, l_int32 xstart, l_int32 ystart, l_int32 *px, l_int32 *py)
nextOnPixelInRaster()
PIX * pixConvolveRGBSep(PIX *pixs, L_KERNEL *kelx, L_KERNEL *kely)
pixConvolveRGBSep()
L_DNA * l_dnaCreate(l_int32 n)
l_dnaCreate()
l_ok l_dnaAddNumber(L_DNA *da, l_float64 val)
l_dnaAddNumber()
L_DNAA * l_dnaaCreate(l_int32 n)
l_dnaaCreate()
l_ok l_dnaGetDValue(L_DNA *da, l_int32 index, l_float64 *pval)
l_dnaGetDValue()
l_ok l_dnaaAddDna(L_DNAA *daa, L_DNA *da, l_int32 copyflag)
l_dnaaAddDna()
void l_dnaDestroy(L_DNA **pda)
l_dnaDestroy()
void l_dnaaDestroy(L_DNAA **pdaa)
l_dnaaDestroy()
L_KERNEL * makeFlatKernel(l_int32 height, l_int32 width, l_int32 cy, l_int32 cx)
makeFlatKernel()
void kernelDestroy(L_KERNEL **pkel)
kernelDestroy()
PIX * pixErodeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeBrick()
PIX * pixDilateBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateBrick()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_ok numaWriteStderr(NUMA *na)
numaWriteStderr()
NUMA * numaCreate(l_int32 n)
numaCreate()
NUMA * numaaGetNuma(NUMAA *naa, l_int32 index, l_int32 accessflag)
numaaGetNuma()
void numaDestroy(NUMA **pna)
numaDestroy()
NUMAA * numaaCreate(l_int32 n)
numaaCreate()
l_ok numaaAddNuma(NUMAA *naa, NUMA *na, l_int32 copyflag)
numaaAddNuma()
void numaaDestroy(NUMAA **pnaa)
numaaDestroy()
l_ok pixSetColormap(PIX *pix, PIXCMAP *colormap)
pixSetColormap()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
PIX * pixClone(PIX *pixs)
pixClone()
l_ok pixSetBorderRingVal(PIX *pixs, l_int32 dist, l_uint32 val)
pixSetBorderRingVal()
l_ok pixSetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 val)
pixSetPixel()
l_ok pixGetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 *pval)
pixGetPixel()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
PIX * pixInvert(PIX *pixd, PIX *pixs)
pixInvert()
l_ok pixPaintThroughMask(PIX *pixd, PIX *pixm, l_int32 x, l_int32 y, l_uint32 val)
pixPaintThroughMask()
l_ok pixCountPixels(PIX *pixs, l_int32 *pcount, l_int32 *tab8)
pixCountPixels()
PIX * pixOr(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixOr()
l_int32 * makePixelSumTab8(void)
makePixelSumTab8()
PIX * pixSubtract(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixSubtract()
l_ok pixGetRankValueMaskedRGB(PIX *pixs, PIX *pixm, l_int32 x, l_int32 y, l_int32 factor, l_float32 rank, l_float32 *prval, l_float32 *pgval, l_float32 *pbval)
pixGetRankValueMaskedRGB()
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
BOX * pixaGetBox(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetBox()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
PIXA * pixaCreateFromBoxa(PIX *pixs, BOXA *boxa, l_int32 start, l_int32 num, l_int32 *pcropwarn)
pixaCreateFromBoxa()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
PIX * pixSelectByArea(PIX *pixs, l_float32 thresh, l_int32 connectivity, l_int32 type, l_int32 *pchanged)
pixSelectByArea()
l_ok ptaGetIPt(PTA *pta, l_int32 index, l_int32 *px, l_int32 *py)
ptaGetIPt()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
l_int32 ptaGetCount(PTA *pta)
ptaGetCount()
PTA * ptaCreate(l_int32 n)
ptaCreate()
void ptaDestroy(PTA **ppta)
ptaDestroy()
PIX * pixGenerateFromPta(PTA *pta, l_int32 w, l_int32 h)
pixGenerateFromPta()
l_int32 lqueueGetCount(L_QUEUE *lq)
lqueueGetCount()
void lqueueDestroy(L_QUEUE **plq, l_int32 freeflag)
lqueueDestroy()
void * lqueueRemove(L_QUEUE *lq)
lqueueRemove()
l_ok lqueueAdd(L_QUEUE *lq, void *item)
lqueueAdd()
L_QUEUE * lqueueCreate(l_int32 nalloc)
lqueueCreate()
PIX * pixSeedspread(PIX *pixs, l_int32 connectivity)
pixSeedspread()
l_ok genRandomIntOnInterval(l_int32 start, l_int32 end, l_int32 seed, l_int32 *pval)
genRandomIntOnInterval()
void lept_stderr(const char *fmt,...)
lept_stderr()