55#include <config_auto.h>
59#include "allheaders.h"
62 l_int32 x, l_int32 y,
L_DEWARP **pdew,
63 const char *debugfile);
123 const char *debugfile)
131 return ERROR_INT(
"&pixd not defined", __func__, 1);
132 *ppixd = pixClone(pixs);
134 L_WARNING(
"invalid grayin = %d; clipping at 255\n", __func__, grayin);
140 return ERROR_INT(
"no model available", __func__, 1);
145 return ERROR_INT(
"pixv not made", __func__, 1);
150 pixDisplayWithTitle(pixv, 300, 0,
"pixv", 1);
151 lept_rmdir(
"lept/dewapply");
152 lept_mkdir(
"lept/dewapply");
153 pixWriteDebug(
"/tmp/lept/dewapply/001.png", pixs, IFF_PNG);
154 pixWriteDebug(
"/tmp/lept/dewapply/002.png", pixv, IFF_PNG);
159 if (dew->
hvalid == FALSE) {
160 L_INFO(
"invalid horiz model for page %d\n", __func__, pageno);
166 pixDisplayWithTitle(pixh, 600, 0,
"pixh", 1);
167 pixWriteDebug(
"/tmp/lept/dewapply/003.png", pixh, IFF_PNG);
170 L_ERROR(
"horiz disparity failed on page %d\n",
177 dew1 = dewarpaGetDewarp(dewa, pageno);
178 dewarpDebug(dew1,
"lept/dewapply", 0);
179 convertFilesToPdf(
"/tmp/lept/dewapply", NULL, 250, 1.0, 0, 0,
180 "Dewarp Apply Disparity", debugfile);
181 lept_stderr(
"pdf file: %s\n", debugfile);
220 const char *debugfile)
227 return ERROR_INT(
"&dew not defined", __func__, 1);
231 return ERROR_INT(
"dewa not defined", __func__, 1);
232 if (pageno < 0 || pageno > dewa->
maxpage)
233 return ERROR_INT(
"invalid pageno", __func__, 1);
235 return ERROR_INT(
"pixs not defined", __func__, 1);
238 debug = (debugfile) ? 1 : 0;
243 dewarpaInsertRefModels(dewa, 0, debug);
247 if ((dew1 = dewarpaGetDewarp(dewa, pageno)) == NULL) {
248 L_INFO(
"no valid dew model for page %d\n", __func__, pageno);
255 dew2 = dewarpaGetDewarp(dewa, dew1->
refpage);
258 if (dew2->
vvalid == FALSE)
259 return ERROR_INT(
"no model; shouldn't happen", __func__, 1);
266 pix1 = pixConvertTo1(pixs, 140);
267 pixCountTextColumns(pix1, 0.3f, 0.5f, 0.1f, &ncols, NULL);
270 L_INFO(
"found %d columns; not correcting horiz disparity\n",
310l_int32 i, j, w, h, d, fw, fh, wpld, wplf, isrc, val8;
311l_uint32 *datad, *lined;
312l_float32 *dataf, *linef;
318 return (
PIX *)ERROR_PTR(
"dew not defined", __func__, NULL);
320 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
321 pixGetDimensions(pixs, &w, &h, &d);
322 if (d != 1 && d != 8 && d != 32)
323 return (
PIX *)ERROR_PTR(
"pix not 1, 8 or 32 bpp", __func__, NULL);
325 return (
PIX *)ERROR_PTR(
"fullvdispar not defined", __func__, NULL);
326 fpixGetDimensions(fpix, &fw, &fh);
327 if (fw < w || fh < h) {
328 lept_stderr(
"fw = %d, w = %d, fh = %d, h = %d\n", fw, w, fh, h);
329 return (
PIX *)ERROR_PTR(
"invalid fpix size", __func__, NULL);
334 pixd = pixCreateTemplate(pixs);
336 pixSetAllGray(pixd, grayin);
337 datad = pixGetData(pixd);
338 dataf = fpixGetData(fpix);
339 wpld = pixGetWpl(pixd);
340 wplf = fpixGetWpl(fpix);
342 lineptrs = pixGetLinePtrs(pixs, NULL);
343 for (i = 0; i < h; i++) {
344 lined = datad + i * wpld;
345 linef = dataf + i * wplf;
346 for (j = 0; j < w; j++) {
347 isrc = (l_int32)(i - linef[j] + 0.5);
349 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
350 if (isrc >= 0 && isrc < h) {
357 lineptrs = pixGetLinePtrs(pixs, NULL);
358 for (i = 0; i < h; i++) {
359 lined = datad + i * wpld;
360 linef = dataf + i * wplf;
361 for (j = 0; j < w; j++) {
362 isrc = (l_int32)(i - linef[j] + 0.5);
364 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
365 if (isrc >= 0 && isrc < h) {
372 lineptrs = pixGetLinePtrs(pixs, NULL);
373 for (i = 0; i < h; i++) {
374 lined = datad + i * wpld;
375 linef = dataf + i * wplf;
376 for (j = 0; j < w; j++) {
377 isrc = (l_int32)(i - linef[j] + 0.5);
379 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
380 if (isrc >= 0 && isrc < h)
418l_int32 i, j, w, h, d, fw, fh, wpls, wpld, wplf, jsrc, val8;
419l_uint32 *datas, *lines, *datad, *lined;
420l_float32 *dataf, *linef;
425 return (
PIX *)ERROR_PTR(
"dew not defined", __func__, pixs);
427 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
428 pixGetDimensions(pixs, &w, &h, &d);
429 if (d != 1 && d != 8 && d != 32)
430 return (
PIX *)ERROR_PTR(
"pix not 1, 8 or 32 bpp", __func__, NULL);
432 return (
PIX *)ERROR_PTR(
"fullhdispar not defined", __func__, NULL);
433 fpixGetDimensions(fpix, &fw, &fh);
434 if (fw < w || fh < h) {
435 lept_stderr(
"fw = %d, w = %d, fh = %d, h = %d\n", fw, w, fh, h);
436 return (
PIX *)ERROR_PTR(
"invalid fpix size", __func__, NULL);
441 pixd = pixCreateTemplate(pixs);
443 pixSetAllGray(pixd, grayin);
444 datas = pixGetData(pixs);
445 datad = pixGetData(pixd);
446 dataf = fpixGetData(fpix);
447 wpls = pixGetWpl(pixs);
448 wpld = pixGetWpl(pixd);
449 wplf = fpixGetWpl(fpix);
451 for (i = 0; i < h; i++) {
452 lines = datas + i * wpls;
453 lined = datad + i * wpld;
454 linef = dataf + i * wplf;
455 for (j = 0; j < w; j++) {
456 jsrc = (l_int32)(j - linef[j] + 0.5);
458 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
459 if (jsrc >= 0 && jsrc < w) {
466 for (i = 0; i < h; i++) {
467 lines = datas + i * wpls;
468 lined = datad + i * wpld;
469 linef = dataf + i * wplf;
470 for (j = 0; j < w; j++) {
471 jsrc = (l_int32)(j - linef[j] + 0.5);
473 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
474 if (jsrc >= 0 && jsrc < w) {
481 for (i = 0; i < h; i++) {
482 lines = datas + i * wpls;
483 lined = datad + i * wpld;
484 linef = dataf + i * wplf;
485 for (j = 0; j < w; j++) {
486 jsrc = (l_int32)(j - linef[j] + 0.5);
488 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
489 if (jsrc >= 0 && jsrc < w)
490 lined[j] = lines[jsrc];
539 const char *debugfile)
549 return ERROR_INT(
"&boxad not defined", __func__, 1);
550 *pboxad = boxaCopy(boxas,
L_CLONE);
554 return ERROR_INT(
"no model available", __func__, 1);
559 return ERROR_INT(
"boxa1 not made", __func__, 1);
565 if (debugfile && mapdir != 1)
566 L_INFO(
"Reverse map direction; no debug output\n", __func__);
567 debug_out = debugfile && (mapdir == 1);
570 lept_rmdir(
"lept/dewboxa");
571 lept_mkdir(
"lept/dewboxa");
572 pix1 = pixConvertTo32(pixs);
573 pixRenderBoxaArb(pix1, boxas, 2, 255, 0, 0);
574 pixWriteDebug(
"/tmp/lept/dewboxa/01.png", pix1, IFF_PNG);
577 pix1 = pixConvertTo32(pixv);
578 pixRenderBoxaArb(pix1, boxav, 2, 0, 255, 0);
579 pixWriteDebug(
"/tmp/lept/dewboxa/02.png", pix1, IFF_PNG);
585 if (dew->
hvalid == FALSE) {
586 L_INFO(
"invalid horiz model for page %d\n", __func__, pageno);
590 L_ERROR(
"horiz disparity fails on page %d\n", __func__, pageno);
597 pix1 = pixConvertTo32(pixh);
598 pixRenderBoxaArb(pix1, boxah, 2, 0, 0, 255);
599 pixWriteDebug(
"/tmp/lept/dewboxa/03.png", pix1, IFF_PNG);
609 dew1 = dewarpaGetDewarp(dewa, pageno);
610 dewarpDebug(dew1,
"lept/dewapply", 0);
611 convertFilesToPdf(
"/tmp/lept/dewboxa", NULL, 135, 1.0, 0, 0,
612 "Dewarp Apply Disparity Boxa", debugfile);
613 lept_stderr(
"Dewarp Apply Disparity Boxa pdf file: %s\n",
640l_int32 x, y, w, h, ib, ip, nbox, wpl;
642l_float32 *data, *line;
649 return (
BOXA *)ERROR_PTR(
"dew not defined", __func__, NULL);
651 return (
BOXA *)ERROR_PTR(
"boxa not defined", __func__, NULL);
652 if (direction == L_VERT)
654 else if (direction == L_HORIZ)
657 return (
BOXA *)ERROR_PTR(
"invalid direction", __func__, NULL);
659 return (
BOXA *)ERROR_PTR(
"full disparity not defined", __func__, NULL);
660 fpixGetDimensions(fpix, &w, &h);
664 data = fpixGetData(fpix);
665 wpl = fpixGetWpl(fpix);
666 nbox = boxaGetCount(boxa);
667 boxad = boxaCreate(nbox);
668 for (ib = 0; ib < nbox; ib++) {
669 boxs = boxaGetBox(boxa, ib,
L_COPY);
670 ptas = boxConvertToPta(boxs, 4);
672 for (ip = 0; ip < 4; ip++) {
673 ptaGetIPt(ptas, ip, &x, &y);
674 line = data + y * wpl;
675 if (direction == L_VERT) {
681 ptaAddPt(ptad, x, yn);
688 ptaAddPt(ptad, xn, y);
691 boxd = ptaConvertToBox(ptad);
724 return ERROR_INT(
"dew not defined", __func__, 1);
732 return ERROR_INT(
"dewt not found", __func__, 1);
734 pixDestroy(&dewt->
pixs);
778l_int32 width, height, fw, fh, deltaw, deltah, redfactor;
779FPIX *fpixt1, *fpixt2;
782 return ERROR_INT(
"dew not defined", __func__, 1);
784 return ERROR_INT(
"no sampled vert disparity", __func__, 1);
790 pixGetDimensions(pix, &width, &height, NULL);
799 if (width > fw || height > fw)
804 if (width > fw || height > fw)
809 deltaw = width - dew->
sampling * (dew->
nx - 1) + 2;
810 deltah = height - dew->
sampling * (dew->
ny - 1) + 2;
812 deltaw = redfactor * L_MAX(0, deltaw);
813 deltah = redfactor * L_MAX(0, deltah);
821 fpixAddMultConstant(fpixt1, 0.0, (l_float32)redfactor);
822 fpixt2 = fpixScaleByInteger(fpixt1, dew->
sampling * redfactor);
823 fpixDestroy(&fpixt1);
824 if (deltah == 0 && deltaw == 0) {
828 dew->
fullvdispar = fpixAddSlopeBorder(fpixt2, x, deltaw - x,
830 fpixDestroy(&fpixt2);
840 fpixAddMultConstant(fpixt1, 0.0, (l_float32)redfactor);
841 fpixt2 = fpixScaleByInteger(fpixt1, dew->
sampling * redfactor);
842 fpixDestroy(&fpixt1);
843 if (deltah == 0 && deltaw == 0) {
847 dew->
fullhdispar = fpixAddSlopeBorder(fpixt2, x, deltaw - x,
849 fpixDestroy(&fpixt2);
885fpixSampledDisparity(
FPIX *fpixs,
888l_int32 w, h, wd, hd, i, j, is, js;
893 return (
FPIX *)ERROR_PTR(
"fpixs not defined", __func__, NULL);
895 return (
FPIX *)ERROR_PTR(
"sampling < 1", __func__, NULL);
897 fpixGetDimensions(fpixs, &w, &h);
898 wd = 1 + (w + sampling - 2) / sampling;
899 hd = 1 + (h + sampling - 2) / sampling;
900 if (wd < 3 || hd < 3)
901 return (
FPIX *)ERROR_PTR(
"wd < 3 or hd < 3", __func__, NULL);
902 fpixd = fpixCreate(wd, hd);
903 for (i = 0; i < hd; i++) {
905 if (is >= h)
continue;
906 for (j = 0; j < wd; j++) {
908 if (js >= w)
continue;
909 fpixGetPixel(fpixs, js, is, &val);
910 fpixSetPixel(fpixd, j, i, val);
917static const l_float32 DefaultSlopeFactor = 0.1;
943fpixExtraHorizDisparity(
FPIX *fpixv,
947l_int32 w, h, i, j, fw, wpl, maxloc;
948l_float32 val1, val2, vdisp, vdisp0, maxval;
949l_float32 *data, *line, *fadiff;
954 return (
FPIX *)ERROR_PTR(
"fpixv not defined", __func__, NULL);
956 return (
FPIX *)ERROR_PTR(
"&xwid not defined", __func__, NULL);
958 factor = DefaultSlopeFactor;
965 fpixGetDimensions(fpixv, &w, &h);
966 nadiff = numaCreate(w);
967 for (j = 0; j < w; j++) {
968 fpixGetPixel(fpixv, j, 0, &val1);
969 fpixGetPixel(fpixv, j, h - 1, &val2);
970 vdisp = factor * (val2 - val1) / (l_float32)h;
971 if (j == 0) vdisp0 = vdisp;
972 vdisp = vdisp0 - vdisp;
973 numaAddNumber(nadiff, vdisp);
975 numaGetMax(nadiff, &maxval, &maxloc);
976 *pxwid = (l_int32)(maxval + 0.5);
979 fpixh = fpixCreate(fw, h);
980 data = fpixGetData(fpixh);
981 wpl = fpixGetWpl(fpixh);
982 fadiff = numaGetFArray(nadiff,
L_NOCOPY);
983 for (i = 0; i < h; i++) {
984 line = data + i * wpl;
985 for (j = 0; j < fw; j++) {
993 numaDestroy(&nadiff);
#define SET_DATA_BIT(pdata, n)
#define GET_DATA_BYTE(pdata, n)
#define GET_DATA_FOUR_BYTES(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_BIT(pdata, n)
static l_int32 dewarpaApplyInit(L_DEWARPA *dewa, l_int32 pageno, PIX *pixs, l_int32 x, l_int32 y, L_DEWARP **pdew, const char *debugfile)
dewarpaApplyInit()
static PIX * pixApplyHorizDisparity(L_DEWARP *dew, PIX *pixs, l_int32 grayin)
pixApplyHorizDisparity()
static PIX * pixApplyVertDisparity(L_DEWARP *dew, PIX *pixs, l_int32 grayin)
pixApplyVertDisparity()
l_ok dewarpaApplyDisparity(L_DEWARPA *dewa, l_int32 pageno, PIX *pixs, l_int32 grayin, l_int32 x, l_int32 y, PIX **ppixd, const char *debugfile)
dewarpaApplyDisparity()
static BOXA * boxaApplyDisparity(L_DEWARP *dew, BOXA *boxa, l_int32 direction, l_int32 mapdir)
boxaApplyDisparity()
l_ok dewarpMinimize(L_DEWARP *dew)
dewarpMinimize()
l_ok dewarpaApplyDisparityBoxa(L_DEWARPA *dewa, l_int32 pageno, PIX *pixs, BOXA *boxas, l_int32 mapdir, l_int32 x, l_int32 y, BOXA **pboxad, const char *debugfile)
dewarpaApplyDisparityBoxa()
l_ok dewarpPopulateFullRes(L_DEWARP *dew, PIX *pix, l_int32 x, l_int32 y)
dewarpPopulateFullRes()
struct FPix * fullvdispar
struct FPix * fullhdispar
struct FPix * sampvdispar
struct FPix * samphdispar