51 #include "allheaders.h" 54 static const l_int32 MIN_DIST_IN_PEAK = 35;
57 static const l_int32 PEAK_THRESHOLD_RATIO = 20;
58 static const l_int32 ZERO_THRESHOLD_RATIO = 100;
61 static const l_int32 DEFAULT_SLICES = 10;
62 static const l_int32 DEFAULT_SWEEP_REDUCTION = 2;
63 static const l_int32 DEFAULT_BS_REDUCTION = 1;
64 static const l_float32 DEFAULT_SWEEP_RANGE = 5.;
65 static const l_float32 DEFAULT_SWEEP_DELTA = 1.;
66 static const l_float32 DEFAULT_MINBS_DELTA = 0.01;
69 static const l_float32 OVERLAP_FRACTION = 0.5;
72 static const l_float32 MIN_ALLOWED_CONFIDENCE = 3.0;
117 l_int32 h, i, j, nbox, val1, val2, ndiff, bx, by, bw, bh;
118 l_int32 imaxloc, peakthresh, zerothresh, inpeak;
119 l_int32 mintosearch, max, maxloc, nloc, locval;
122 BOXA *boxa1, *boxa2, *boxa3;
124 NUMA *nasum, *nadiff, *naloc, *naval;
128 PROCNAME(
"pixFindBaselines");
130 if (ppta) *ppta = NULL;
131 if (!pixs || pixGetDepth(pixs) != 1)
132 return (
NUMA *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
144 return (
NUMA *)ERROR_PTR(
"nasum not made", procName, NULL);
146 h = pixGetHeight(pixs);
149 for (i = 0; i < h - 1; i++) {
158 gplotSimple1(nadiff, GPLOT_PNG,
"/tmp/lept/baseline/diff",
"Diff Sig");
159 pix2 =
pixRead(
"/tmp/lept/baseline/diff.png");
170 peakthresh = (l_int32)maxval / PEAK_THRESHOLD_RATIO;
172 zerothresh = (l_int32)maxval / ZERO_THRESHOLD_RATIO;
177 for (i = 0; i < ndiff; i++) {
178 if (inpeak == FALSE) {
179 if (array[i] > peakthresh) {
181 mintosearch = i + MIN_DIST_IN_PEAK;
187 if (array[i] > max) {
190 mintosearch = i + MIN_DIST_IN_PEAK;
191 }
else if (i > mintosearch && array[i] <= zerothresh) {
207 gplot =
gplotCreate(
"/tmp/lept/baseline/loc", GPLOT_PNG,
"Peak locs",
208 "rasterline",
"height");
209 gplotAddPlot(gplot, naloc, naval, GPLOT_POINTS,
"locs");
212 pix2 =
pixRead(
"/tmp/lept/baseline/loc.png");
228 L_INFO(
"no compnents after filtering\n", procName);
245 for (i = 0; i < nbox; i++) {
247 for (j = 0; j < nloc; j++) {
249 if (L_ABS(locval - (by + bh)) > 25)
260 l_int32 npts, x1, y1, x2, y2;
263 for (i = 0; i < npts; i += 2) {
268 pixWriteDebug(
"/tmp/lept/baseline/baselines.png", pix1, IFF_PNG);
324 l_float32 sweeprange,
325 l_float32 sweepdelta,
326 l_float32 minbsdelta)
332 PROCNAME(
"pixDeskewLocal");
334 if (!pixs || pixGetDepth(pixs) != 1)
335 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
340 sweeprange, sweepdelta, minbsdelta,
343 return (
PIX *)ERROR_PTR(
"transform pts not found", procName, NULL);
392 l_float32 sweeprange,
393 l_float32 sweepdelta,
394 l_float32 minbsdelta,
399 l_float32 deg2rad, angr, angd, dely;
403 PROCNAME(
"pixGetLocalSkewTransform");
405 if (!pptas || !pptad)
406 return ERROR_INT(
"&ptas and &ptad not defined", procName, 1);
407 *pptas = *pptad = NULL;
408 if (!pixs || pixGetDepth(pixs) != 1)
409 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
410 if (nslices < 2 || nslices > 20)
411 nslices = DEFAULT_SLICES;
412 if (redsweep < 1 || redsweep > 8)
413 redsweep = DEFAULT_SWEEP_REDUCTION;
414 if (redsearch < 1 || redsearch > redsweep)
415 redsearch = DEFAULT_BS_REDUCTION;
416 if (sweeprange == 0.0)
417 sweeprange = DEFAULT_SWEEP_RANGE;
418 if (sweepdelta == 0.0)
419 sweepdelta = DEFAULT_SWEEP_DELTA;
420 if (minbsdelta == 0.0)
421 minbsdelta = DEFAULT_MINBS_DELTA;
424 sweeprange, sweepdelta, minbsdelta,
427 return ERROR_INT(
"naskew not made", procName, 1);
429 deg2rad = 3.14159265 / 180.;
430 w = pixGetWidth(pixs);
431 h = pixGetHeight(pixs);
438 for (i = 0; i < h; i++) {
440 angr = angd * deg2rad;
441 dely = w * tan(angr);
442 if (i - dely > 0.05 * h)
451 for (i = h - 1; i > 0; i--) {
453 angr = angd * deg2rad;
454 dely = w * tan(angr);
455 if (i - dely < 0.95 * h)
510 l_float32 sweeprange,
511 l_float32 sweepdelta,
512 l_float32 minbsdelta,
517 l_int32 w, h, hs, i, ystart, yend, ovlap, npts;
518 l_float32 angle, conf, ycenter, a, b;
521 NUMA *naskew, *nax, *nay;
525 PROCNAME(
"pixGetLocalSkewAngles");
527 if (!pixs || pixGetDepth(pixs) != 1)
528 return (
NUMA *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
529 if (nslices < 2 || nslices > 20)
530 nslices = DEFAULT_SLICES;
531 if (redsweep < 1 || redsweep > 8)
532 redsweep = DEFAULT_SWEEP_REDUCTION;
533 if (redsearch < 1 || redsearch > redsweep)
534 redsearch = DEFAULT_BS_REDUCTION;
535 if (sweeprange == 0.0)
536 sweeprange = DEFAULT_SWEEP_RANGE;
537 if (sweepdelta == 0.0)
538 sweepdelta = DEFAULT_SWEEP_DELTA;
539 if (minbsdelta == 0.0)
540 minbsdelta = DEFAULT_MINBS_DELTA;
544 ovlap = (l_int32)(OVERLAP_FRACTION * hs);
546 for (i = 0; i < nslices; i++) {
547 ystart = L_MAX(0, hs * i - ovlap);
548 yend = L_MIN(h - 1, hs * (i + 1) + ovlap);
549 ycenter = (l_float32)(ystart + yend) / 2;
550 box =
boxCreate(0, ystart, w, yend - ystart + 1);
553 sweeprange, sweepdelta, minbsdelta);
554 if (conf > MIN_ALLOWED_CONFIDENCE)
563 return (
NUMA *)ERROR_PTR(
"can't fit skew", procName, NULL);
571 for (i = 0; i < h; i++) {
579 gplot =
gplotCreate(
"/tmp/lept/baseline/skew", GPLOT_PNG,
580 "skew as fctn of y",
"y (in raster lines from top)",
581 "angle (in degrees)");
582 gplotAddPlot(gplot, NULL, naskew, GPLOT_POINTS,
"linear lsf");
583 gplotAddPlot(gplot, nax, nay, GPLOT_POINTS,
"actual data pts");
void gplotDestroy(GPLOT **pgplot)
gplotDestroy()
NUMA * pixCountPixelsByRow(PIX *pix, l_int32 *tab8)
pixCountPixelsByRow()
l_ok numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
l_int32 lept_mkdir(const char *subdir)
lept_mkdir()
l_ok gplotAddPlot(GPLOT *gplot, NUMA *nax, NUMA *nay, l_int32 plotstyle, const char *plottitle)
gplotAddPlot()
BOXA * boxaSort(BOXA *boxas, l_int32 sorttype, l_int32 sortorder, NUMA **pnaindex)
boxaSort()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
l_ok pixGetLocalSkewTransform(PIX *pixs, l_int32 nslices, l_int32 redsweep, l_int32 redsearch, l_float32 sweeprange, l_float32 sweepdelta, l_float32 minbsdelta, PTA **pptas, PTA **pptad)
pixGetLocalSkewTransform()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_ok gplotMakeOutput(GPLOT *gplot)
gplotMakeOutput()
GPLOT * gplotCreate(const char *rootname, l_int32 outformat, const char *title, const char *xlabel, const char *ylabel)
gplotCreate()
PTA * ptaCreate(l_int32 n)
ptaCreate()
l_ok ptaGetArrays(PTA *pta, NUMA **pnax, NUMA **pnay)
ptaGetArrays()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 ptaGetCount(PTA *pta)
ptaGetCount()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
PIX * pixDeskewLocal(PIX *pixs, l_int32 nslices, l_int32 redsweep, l_int32 redsearch, l_float32 sweeprange, l_float32 sweepdelta, l_float32 minbsdelta)
pixDeskewLocal()
l_ok ptaGetLinearLSF(PTA *pta, l_float32 *pa, l_float32 *pb, NUMA **pnafit)
ptaGetLinearLSF()
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
l_ok pixRenderLineArb(PIX *pix, l_int32 x1, l_int32 y1, l_int32 x2, l_int32 y2, l_int32 width, l_uint8 rval, l_uint8 gval, l_uint8 bval)
pixRenderLineArb()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
BOXA * boxaTransform(BOXA *boxas, l_int32 shiftx, l_int32 shifty, l_float32 scalex, l_float32 scaley)
boxaTransform()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok boxaGetBoxGeometry(BOXA *boxa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxaGetBoxGeometry()
PIX * pixMorphSequence(PIX *pixs, const char *sequence, l_int32 dispsep)
pixMorphSequence()
NUMA * pixFindBaselines(PIX *pixs, PTA **ppta, PIXA *pixadb)
pixFindBaselines()
void pixDestroy(PIX **ppix)
pixDestroy()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixRead(const char *filename)
pixRead()
NUMA * pixGetLocalSkewAngles(PIX *pixs, l_int32 nslices, l_int32 redsweep, l_int32 redsearch, l_float32 sweeprange, l_float32 sweepdelta, l_float32 minbsdelta, l_float32 *pa, l_float32 *pb, l_int32 debug)
pixGetLocalSkewAngles()
void ptaDestroy(PTA **ppta)
ptaDestroy()
l_ok pixFindSkewSweepAndSearch(PIX *pixs, l_float32 *pangle, l_float32 *pconf, l_int32 redsweep, l_int32 redsearch, l_float32 sweeprange, l_float32 sweepdelta, l_float32 minbsdelta)
pixFindSkewSweepAndSearch()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
l_ok ptaGetIPt(PTA *pta, l_int32 index, l_int32 *px, l_int32 *py)
ptaGetIPt()
l_ok numaGetMax(NUMA *na, l_float32 *pmaxval, l_int32 *pimaxloc)
numaGetMax()
PIX * pixProjectiveSampledPta(PIX *pixs, PTA *ptad, PTA *ptas, l_int32 incolor)
pixProjectiveSampledPta()
PIX * pixScale(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScale()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
l_ok gplotSimple1(NUMA *na, l_int32 outformat, const char *outroot, const char *title)
gplotSimple1()