71 #include <config_auto.h> 74 #include "allheaders.h" 78 static const l_int32 DefaultDistanceToBoundary = 1;
79 static const l_int32 MaxDistanceToBoundary = 4;
83 static const l_int32 DefaultMinRunlength = 3;
87 static const l_int32 DefaultSelScalefactor = 7;
88 static const l_int32 MaxSelScalefactor = 31;
91 #define DEBUG_DISPLAY_HM_SEL 0 159 l_int32 ws, hs, w, h, x, y, xval, yval, i, j, nh, nm;
160 l_float32 delh, delw;
162 PIX *pixt1, *pixt2, *pixfg, *pixbg;
166 PROCNAME(
"pixGenerateSelWithRuns");
168 if (ppixe) *ppixe = NULL;
170 return (
SEL *)ERROR_PTR(
"pixs not defined", procName, NULL);
171 if (pixGetDepth(pixs) != 1)
172 return (
SEL *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
173 if (nhlines < 1 && nvlines < 1)
174 return (
SEL *)ERROR_PTR(
"nvlines and nhlines both < 1", procName, NULL);
177 distance = DefaultDistanceToBoundary;
179 minlength = DefaultMinRunlength;
180 if (distance > MaxDistanceToBoundary) {
181 L_WARNING(
"distance too large; setting to max value\n", procName);
182 distance = MaxDistanceToBoundary;
188 return (
SEL *)ERROR_PTR(
"pixt1 not made", procName, NULL);
189 ws = pixGetWidth(pixt1);
190 hs = pixGetHeight(pixt1);
196 if (toppix || botpix || leftpix || rightpix) {
201 if (toppix < distance + minlength)
202 L_WARNING(
"no miss elements in added top pixels\n", procName);
206 if (botpix < distance + minlength)
207 L_WARNING(
"no miss elements in added bot pixels\n", procName);
212 if (leftpix < distance + minlength)
213 L_WARNING(
"no miss elements in added left pixels\n", procName);
217 if (rightpix < distance + minlength)
218 L_WARNING(
"no miss elements in added right pixels\n", procName);
232 distance, distance, SEL_HIT);
233 pixfg =
pixErode(NULL, pixt2, seld);
243 delh = (l_float32)h / (l_float32)(nhlines + 1);
244 for (i = 0, y = 0; i < nhlines; i++) {
245 y += (l_int32)(delh + 0.5);
250 for (j = 0; j < nh; j++) {
254 for (j = 0; j < nm; j++) {
263 delw = (l_float32)w / (l_float32)(nvlines + 1);
264 for (i = 0, x = 0; i < nvlines; i++) {
265 x += (l_int32)(delw + 0.5);
270 for (j = 0; j < nh; j++) {
274 for (j = 0; j < nm; j++) {
286 for (i = 0; i < nh; i++) {
291 for (i = 0; i < nm; i++) {
348 l_int32 ws, hs, w, h, x, y, i, j, thresh;
350 PIX *pixt1, *pixt2, *pixfg, *pixbg;
353 PROCNAME(
"pixGenerateSelRandom");
355 if (ppixe) *ppixe = NULL;
357 return (
SEL *)ERROR_PTR(
"pixs not defined", procName, NULL);
358 if (pixGetDepth(pixs) != 1)
359 return (
SEL *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
360 if (hitfract <= 0.0 && missfract <= 0.0)
361 return (
SEL *)ERROR_PTR(
"no hits or misses", procName, NULL);
362 if (hitfract > 1.0 || missfract > 1.0)
363 return (
SEL *)ERROR_PTR(
"fraction can't be > 1.0", procName, NULL);
366 distance = DefaultDistanceToBoundary;
367 if (distance > MaxDistanceToBoundary) {
368 L_WARNING(
"distance too large; setting to max value\n", procName);
369 distance = MaxDistanceToBoundary;
375 return (
SEL *)ERROR_PTR(
"pixt1 not made", procName, NULL);
376 ws = pixGetWidth(pixt1);
377 hs = pixGetHeight(pixt1);
383 if (toppix || botpix || leftpix || rightpix) {
409 distance, distance, SEL_HIT);
410 pixfg =
pixErode(NULL, pixt2, seld);
418 if (hitfract > 0.0) {
419 thresh = (l_int32)(hitfract * (l_float64)RAND_MAX);
420 for (i = 0; i < h; i++) {
421 for (j = 0; j < w; j++) {
430 if (missfract > 0.0) {
431 thresh = (l_int32)(missfract * (l_float64)RAND_MAX);
432 for (i = 0; i < h; i++) {
433 for (j = 0; j < w; j++) {
502 l_int32 ws, hs, w, h, x, y, ix, iy, i, npt;
503 PIX *pixt1, *pixt2, *pixt3, *pixfg, *pixbg;
504 SEL *selh, *selm, *sel_3, *sel;
507 PROCNAME(
"pixGenerateSelBoundary");
509 if (ppixe) *ppixe = NULL;
511 return (
SEL *)ERROR_PTR(
"pixs not defined", procName, NULL);
512 if (pixGetDepth(pixs) != 1)
513 return (
SEL *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
514 if (hitdist < 0 || hitdist > 4 || missdist < 0 || missdist > 4)
515 return (
SEL *)ERROR_PTR(
"dist not in {0 .. 4}", procName, NULL);
516 if (hitskip < 0 && missskip < 0)
517 return (
SEL *)ERROR_PTR(
"no hits or misses", procName, NULL);
522 return (
SEL *)ERROR_PTR(
"pixt1 not made", procName, NULL);
523 ws = pixGetWidth(pixt1);
524 hs = pixGetHeight(pixt1);
530 if (topflag || botflag || leftflag || rightflag) {
559 hitdist, hitdist, SEL_HIT);
560 pixt3 =
pixErode(NULL, pixt2, selh);
561 pixfg =
pixErode(NULL, pixt3, sel_3);
562 pixXor(pixfg, pixfg, pixt3);
570 missdist, missdist, SEL_HIT);
573 pixXor(pixbg, pixbg, pixt3);
586 for (i = 0; i < npt; i++) {
593 for (i = 0; i < npt; i++) {
643 l_int32 w, h, i, r, nruns, len;
646 PROCNAME(
"pixGetRunCentersOnLine");
649 return (
NUMA *)ERROR_PTR(
"pixs not defined", procName, NULL);
650 if (pixGetDepth(pixs) != 1)
651 return (
NUMA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
652 if (x != -1 && y != -1)
653 return (
NUMA *)ERROR_PTR(
"x or y must be -1", procName, NULL);
654 if (x == -1 && y == -1)
655 return (
NUMA *)ERROR_PTR(
"x or y cannot both be -1", procName, NULL);
658 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
659 w = pixGetWidth(pixs);
660 h = pixGetHeight(pixs);
674 for (i = 0; i < nruns; i++) {
681 if (len >= minlength)
716 l_int32 w, h, x, y, npts;
717 l_int32 i, runlen, preval;
722 PROCNAME(
"pixGetRunsOnLine");
725 return (
NUMA *)ERROR_PTR(
"pixs not defined", procName, NULL);
726 if (pixGetDepth(pixs) != 1)
727 return (
NUMA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
729 w = pixGetWidth(pixs);
730 h = pixGetHeight(pixs);
731 if (x1 < 0 || x1 >= w)
732 return (
NUMA *)ERROR_PTR(
"x1 not valid", procName, NULL);
733 if (x2 < 0 || x2 >= w)
734 return (
NUMA *)ERROR_PTR(
"x2 not valid", procName, NULL);
735 if (y1 < 0 || y1 >= h)
736 return (
NUMA *)ERROR_PTR(
"y1 not valid", procName, NULL);
737 if (y2 < 0 || y2 >= h)
738 return (
NUMA *)ERROR_PTR(
"y2 not valid", procName, NULL);
741 return (
NUMA *)ERROR_PTR(
"pta not made", procName, NULL);
744 return (
NUMA *)ERROR_PTR(
"pta has no pts", procName, NULL);
748 return (
NUMA *)ERROR_PTR(
"numa not made", procName, NULL);
751 for (i = 0; i < npts; i++) {
808 l_int32 x, y, xn, yn, xs, ys, xa, ya, count;
812 PROCNAME(
"pixSubsampleBoundaryPixels");
815 return (
PTA *)ERROR_PTR(
"pixs not defined", procName, NULL);
816 if (pixGetDepth(pixs) != 1)
817 return (
PTA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
819 return (
PTA *)ERROR_PTR(
"skip < 0", procName, NULL);
878 l_int32 w, h, i, xa, ya, found;
879 l_int32 xdel[] = {-1, 0, 1, 0, -1, 1, 1, -1};
880 l_int32 ydel[] = {0, 1, 0, -1, 1, 1, -1, -1};
883 PROCNAME(
"adjacentOnPixelInRaster");
886 return ERROR_INT(
"pixs not defined", procName, 0);
887 if (pixGetDepth(pixs) != 1)
888 return ERROR_INT(
"pixs not 1 bpp", procName, 0);
889 w = pixGetWidth(pixs);
890 h = pixGetHeight(pixs);
892 for (i = 0; i < 8; i++) {
895 if (xa < 0 || xa >= w || ya < 0 || ya >= h)
941 PROCNAME(
"pixDisplayHitMissSel");
944 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
945 if (pixGetDepth(pixs) != 1)
946 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
948 return (
PIX *)ERROR_PTR(
"sel not defined", procName, NULL);
950 if (scalefactor <= 0)
951 scalefactor = DefaultSelScalefactor;
952 if (scalefactor > MaxSelScalefactor) {
953 L_WARNING(
"scalefactor too large; using max value\n", procName);
954 scalefactor = MaxSelScalefactor;
963 (hitcolor >> 8) & 0xff);
965 (misscolor >> 8) & 0xff);
969 for (i = 0; i < sel->
sy; i++) {
970 for (j = 0; j < sel->
sx; j++) {
972 if (type == SEL_DONT_CARE)
982 fscale = (l_float32)scalefactor;
NUMA * pixGetRunsOnLine(PIX *pixs, l_int32 x1, l_int32 y1, l_int32 x2, l_int32 y2)
pixGetRunsOnLine()
PTA * pixSubsampleBoundaryPixels(PIX *pixs, l_int32 skip)
pixSubsampleBoundaryPixels()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_int32 nextOnPixelInRaster(PIX *pixs, l_int32 xstart, l_int32 ystart, l_int32 *px, l_int32 *py)
nextOnPixelInRaster()
l_ok pixRasterop(PIX *pixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, l_int32 op, PIX *pixs, l_int32 sx, l_int32 sy)
pixRasterop()
PTA * ptaCreate(l_int32 n)
ptaCreate()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
PIX * pixInvert(PIX *pixd, PIX *pixs)
pixInvert()
SEL * pixGenerateSelRandom(PIX *pixs, l_float32 hitfract, l_float32 missfract, l_int32 distance, l_int32 toppix, l_int32 botpix, l_int32 leftpix, l_int32 rightpix, PIX **ppixe)
pixGenerateSelRandom()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 ptaGetCount(PTA *pta)
ptaGetCount()
PIX * pixScaleBySampling(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleBySampling()
SEL * pixGenerateSelBoundary(PIX *pixs, l_int32 hitdist, l_int32 missdist, l_int32 hitskip, l_int32 missskip, l_int32 topflag, l_int32 botflag, l_int32 leftflag, l_int32 rightflag, PIX **ppixe)
pixGenerateSelBoundary()
l_ok pixSetColormap(PIX *pix, PIXCMAP *colormap)
pixSetColormap()
PIX * pixErode(PIX *pixd, PIX *pixs, SEL *sel)
pixErode()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
l_ok pixClipToForeground(PIX *pixs, PIX **ppixd, BOX **pbox)
pixClipToForeground()
l_ok selGetElement(SEL *sel, l_int32 row, l_int32 col, l_int32 *ptype)
selGetElement()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
PIX * pixXor(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixXor()
PTA * generatePtaLine(l_int32 x1, l_int32 y1, l_int32 x2, l_int32 y2)
generatePtaLine()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
void selDestroy(SEL **psel)
selDestroy()
l_ok pixSetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 val)
pixSetPixel()
NUMA * pixGetRunCentersOnLine(PIX *pixs, l_int32 x, l_int32 y, l_int32 minlength)
pixGetRunCentersOnLine()
SEL * selCreateBrick(l_int32 h, l_int32 w, l_int32 cy, l_int32 cx, l_int32 type)
selCreateBrick()
PIX * pixClone(PIX *pixs)
pixClone()
void pixDestroy(PIX **ppix)
pixDestroy()
PIX * pixDisplayHitMissSel(PIX *pixs, SEL *sel, l_int32 scalefactor, l_uint32 hitcolor, l_uint32 misscolor)
pixDisplayHitMissSel()
SEL * pixGenerateSelWithRuns(PIX *pixs, l_int32 nhlines, l_int32 nvlines, l_int32 distance, l_int32 minlength, l_int32 toppix, l_int32 botpix, l_int32 leftpix, l_int32 rightpix, PIX **ppixe)
pixGenerateSelWithRuns()
l_int32 adjacentOnPixelInRaster(PIX *pixs, l_int32 x, l_int32 y, l_int32 *pxa, l_int32 *pya)
adjacentOnPixelInRaster()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 *pval)
pixGetPixel()
void ptaDestroy(PTA **ppta)
ptaDestroy()
PIX * pixConvert1To8(PIX *pixd, PIX *pixs, l_uint8 val0, l_uint8 val1)
pixConvert1To8()
l_ok ptaGetIPt(PTA *pta, l_int32 index, l_int32 *px, l_int32 *py)
ptaGetIPt()
PIX * pixDilate(PIX *pixd, PIX *pixs, SEL *sel)
pixDilate()
PTA * ptaGetPixelsFromPix(PIX *pixs, BOX *box)
ptaGetPixelsFromPix()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
l_ok selSetElement(SEL *sel, l_int32 row, l_int32 col, l_int32 type)
selSetElement()