70 #include "allheaders.h" 75 static const l_int32 DEFAULT_DISTANCE_TO_BOUNDARY = 1;
76 static const l_int32 MAX_DISTANCE_TO_BOUNDARY = 4;
80 static const l_int32 DEFAULT_MIN_RUNLENGTH = 3;
85 static const l_int32 DEFAULT_SEL_SCALEFACTOR = 7;
86 static const l_int32 MAX_SEL_SCALEFACTOR = 31;
89 #define DEBUG_DISPLAY_HM_SEL 0 157 l_int32 ws, hs, w, h, x, y, xval, yval, i, j, nh, nm;
158 l_float32 delh, delw;
160 PIX *pixt1, *pixt2, *pixfg, *pixbg;
164 PROCNAME(
"pixGenerateSelWithRuns");
166 if (ppixe) *ppixe = NULL;
168 return (
SEL *)ERROR_PTR(
"pixs not defined", procName, NULL);
169 if (pixGetDepth(pixs) != 1)
170 return (
SEL *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
171 if (nhlines < 1 && nvlines < 1)
172 return (
SEL *)ERROR_PTR(
"nvlines and nhlines both < 1", procName, NULL);
175 distance = DEFAULT_DISTANCE_TO_BOUNDARY;
177 minlength = DEFAULT_MIN_RUNLENGTH;
178 if (distance > MAX_DISTANCE_TO_BOUNDARY) {
179 L_WARNING(
"distance too large; setting to max value\n", procName);
180 distance = MAX_DISTANCE_TO_BOUNDARY;
186 return (
SEL *)ERROR_PTR(
"pixt1 not made", procName, NULL);
187 ws = pixGetWidth(pixt1);
188 hs = pixGetHeight(pixt1);
194 if (toppix || botpix || leftpix || rightpix) {
199 if (toppix < distance + minlength)
200 L_WARNING(
"no miss elements in added top pixels\n", procName);
204 if (botpix < distance + minlength)
205 L_WARNING(
"no miss elements in added bot pixels\n", procName);
210 if (leftpix < distance + minlength)
211 L_WARNING(
"no miss elements in added left pixels\n", procName);
215 if (rightpix < distance + minlength)
216 L_WARNING(
"no miss elements in added right pixels\n", procName);
230 distance, distance, SEL_HIT);
231 pixfg =
pixErode(NULL, pixt2, seld);
241 delh = (l_float32)h / (l_float32)(nhlines + 1);
242 for (i = 0, y = 0; i < nhlines; i++) {
243 y += (l_int32)(delh + 0.5);
248 for (j = 0; j < nh; j++) {
252 for (j = 0; j < nm; j++) {
261 delw = (l_float32)w / (l_float32)(nvlines + 1);
262 for (i = 0, x = 0; i < nvlines; i++) {
263 x += (l_int32)(delw + 0.5);
268 for (j = 0; j < nh; j++) {
272 for (j = 0; j < nm; j++) {
284 for (i = 0; i < nh; i++) {
289 for (i = 0; i < nm; i++) {
346 l_int32 ws, hs, w, h, x, y, i, j, thresh;
348 PIX *pixt1, *pixt2, *pixfg, *pixbg;
351 PROCNAME(
"pixGenerateSelRandom");
353 if (ppixe) *ppixe = NULL;
355 return (
SEL *)ERROR_PTR(
"pixs not defined", procName, NULL);
356 if (pixGetDepth(pixs) != 1)
357 return (
SEL *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
358 if (hitfract <= 0.0 && missfract <= 0.0)
359 return (
SEL *)ERROR_PTR(
"no hits or misses", procName, NULL);
360 if (hitfract > 1.0 || missfract > 1.0)
361 return (
SEL *)ERROR_PTR(
"fraction can't be > 1.0", procName, NULL);
364 distance = DEFAULT_DISTANCE_TO_BOUNDARY;
365 if (distance > MAX_DISTANCE_TO_BOUNDARY) {
366 L_WARNING(
"distance too large; setting to max value\n", procName);
367 distance = MAX_DISTANCE_TO_BOUNDARY;
373 return (
SEL *)ERROR_PTR(
"pixt1 not made", procName, NULL);
374 ws = pixGetWidth(pixt1);
375 hs = pixGetHeight(pixt1);
381 if (toppix || botpix || leftpix || rightpix) {
407 distance, distance, SEL_HIT);
408 pixfg =
pixErode(NULL, pixt2, seld);
416 if (hitfract > 0.0) {
417 thresh = (l_int32)(hitfract * (l_float64)RAND_MAX);
418 for (i = 0; i < h; i++) {
419 for (j = 0; j < w; j++) {
428 if (missfract > 0.0) {
429 thresh = (l_int32)(missfract * (l_float64)RAND_MAX);
430 for (i = 0; i < h; i++) {
431 for (j = 0; j < w; j++) {
500 l_int32 ws, hs, w, h, x, y, ix, iy, i, npt;
501 PIX *pixt1, *pixt2, *pixt3, *pixfg, *pixbg;
502 SEL *selh, *selm, *sel_3, *sel;
505 PROCNAME(
"pixGenerateSelBoundary");
507 if (ppixe) *ppixe = NULL;
509 return (
SEL *)ERROR_PTR(
"pixs not defined", procName, NULL);
510 if (pixGetDepth(pixs) != 1)
511 return (
SEL *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
512 if (hitdist < 0 || hitdist > 4 || missdist < 0 || missdist > 4)
513 return (
SEL *)ERROR_PTR(
"dist not in {0 .. 4}", procName, NULL);
514 if (hitskip < 0 && missskip < 0)
515 return (
SEL *)ERROR_PTR(
"no hits or misses", procName, NULL);
520 return (
SEL *)ERROR_PTR(
"pixt1 not made", procName, NULL);
521 ws = pixGetWidth(pixt1);
522 hs = pixGetHeight(pixt1);
528 if (topflag || botflag || leftflag || rightflag) {
557 hitdist, hitdist, SEL_HIT);
558 pixt3 =
pixErode(NULL, pixt2, selh);
559 pixfg =
pixErode(NULL, pixt3, sel_3);
560 pixXor(pixfg, pixfg, pixt3);
568 missdist, missdist, SEL_HIT);
571 pixXor(pixbg, pixbg, pixt3);
584 for (i = 0; i < npt; i++) {
591 for (i = 0; i < npt; i++) {
641 l_int32 w, h, i, r, nruns, len;
644 PROCNAME(
"pixGetRunCentersOnLine");
647 return (
NUMA *)ERROR_PTR(
"pixs not defined", procName, NULL);
648 if (pixGetDepth(pixs) != 1)
649 return (
NUMA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
650 if (x != -1 && y != -1)
651 return (
NUMA *)ERROR_PTR(
"x or y must be -1", procName, NULL);
652 if (x == -1 && y == -1)
653 return (
NUMA *)ERROR_PTR(
"x or y cannot both be -1", procName, NULL);
656 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
657 w = pixGetWidth(pixs);
658 h = pixGetHeight(pixs);
672 for (i = 0; i < nruns; i++) {
679 if (len >= minlength)
714 l_int32 w, h, x, y, npts;
715 l_int32 i, runlen, preval;
720 PROCNAME(
"pixGetRunsOnLine");
723 return (
NUMA *)ERROR_PTR(
"pixs not defined", procName, NULL);
724 if (pixGetDepth(pixs) != 1)
725 return (
NUMA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
727 w = pixGetWidth(pixs);
728 h = pixGetHeight(pixs);
729 if (x1 < 0 || x1 >= w)
730 return (
NUMA *)ERROR_PTR(
"x1 not valid", procName, NULL);
731 if (x2 < 0 || x2 >= w)
732 return (
NUMA *)ERROR_PTR(
"x2 not valid", procName, NULL);
733 if (y1 < 0 || y1 >= h)
734 return (
NUMA *)ERROR_PTR(
"y1 not valid", procName, NULL);
735 if (y2 < 0 || y2 >= h)
736 return (
NUMA *)ERROR_PTR(
"y2 not valid", procName, NULL);
739 return (
NUMA *)ERROR_PTR(
"pta not made", procName, NULL);
742 return (
NUMA *)ERROR_PTR(
"pta has no pts", procName, NULL);
746 return (
NUMA *)ERROR_PTR(
"numa not made", procName, NULL);
749 for (i = 0; i < npts; i++) {
806 l_int32 x, y, xn, yn, xs, ys, xa, ya, count;
810 PROCNAME(
"pixSubsampleBoundaryPixels");
813 return (
PTA *)ERROR_PTR(
"pixs not defined", procName, NULL);
814 if (pixGetDepth(pixs) != 1)
815 return (
PTA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
817 return (
PTA *)ERROR_PTR(
"skip < 0", procName, NULL);
876 l_int32 w, h, i, xa, ya, found;
877 l_int32 xdel[] = {-1, 0, 1, 0, -1, 1, 1, -1};
878 l_int32 ydel[] = {0, 1, 0, -1, 1, 1, -1, -1};
881 PROCNAME(
"adjacentOnPixelInRaster");
884 return ERROR_INT(
"pixs not defined", procName, 0);
885 if (pixGetDepth(pixs) != 1)
886 return ERROR_INT(
"pixs not 1 bpp", procName, 0);
887 w = pixGetWidth(pixs);
888 h = pixGetHeight(pixs);
890 for (i = 0; i < 8; i++) {
893 if (xa < 0 || xa >= w || ya < 0 || ya >= h)
939 PROCNAME(
"pixDisplayHitMissSel");
942 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
943 if (pixGetDepth(pixs) != 1)
944 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
946 return (
PIX *)ERROR_PTR(
"sel not defined", procName, NULL);
948 if (scalefactor <= 0)
949 scalefactor = DEFAULT_SEL_SCALEFACTOR;
950 if (scalefactor > MAX_SEL_SCALEFACTOR) {
951 L_WARNING(
"scalefactor too large; using max value\n", procName);
952 scalefactor = MAX_SEL_SCALEFACTOR;
961 (hitcolor >> 8) & 0xff);
963 (misscolor >> 8) & 0xff);
967 for (i = 0; i < sel->
sy; i++) {
968 for (j = 0; j < sel->
sx; j++) {
970 if (type == SEL_DONT_CARE)
980 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 * 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 * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
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()