83 #include <config_auto.h> 86 #include "allheaders.h" 90 static const l_int32 MinWidth = 100;
91 static const l_int32 MinHeight = 100;
119 l_int32 w, h, htfound, tlfound;
120 PIX *pixr, *pix1, *pix2;
131 PROCNAME(
"pixGetRegionsBinary");
133 if (ppixhm) *ppixhm = NULL;
134 if (ppixtm) *ppixtm = NULL;
135 if (ppixtb) *ppixtb = NULL;
136 if (!pixs || pixGetDepth(pixs) != 1)
137 return ERROR_INT(
"pixs undefined or not 1 bpp", procName, 1);
139 if (w < MinWidth || h < MinHeight) {
140 L_ERROR(
"pix too small: w = %d, h = %d\n", procName, w, h);
174 pixOr(pixhm, pixhm, pix1);
225 cmap = pixGetColormap(pix1);
233 BOXA *bahm, *batm, *batb;
246 "/tmp/lept/pageseg/debug.pdf");
247 L_INFO(
"Writing debug pdf to /tmp/lept/pageseg/debug.pdf\n", procName);
312 PIX *pix1, *pix2, *pixhs, *pixhm, *pixd;
314 PROCNAME(
"pixGenerateHalftoneMask");
316 if (ppixtext) *ppixtext = NULL;
317 if (phtfound) *phtfound = 0;
318 if (!pixs || pixGetDepth(pixs) != 1)
319 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
321 if (w < MinWidth || h < MinHeight) {
322 L_ERROR(
"pix too small: w = %d, h = %d\n", procName, w, h);
348 if (phtfound && !empty)
354 *ppixtext =
pixCopy(NULL, pixs);
395 PIX *pix1, *pix2, *pixvws, *pixd;
397 PROCNAME(
"pixGenTextlineMask");
399 if (ptlfound) *ptlfound = 0;
401 return (
PIX *)ERROR_PTR(
"&pixvws not defined", procName, NULL);
403 if (!pixs || pixGetDepth(pixs) != 1)
404 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
406 if (w < MinWidth || h < MinHeight) {
407 L_ERROR(
"pix too small: w = %d, h = %d\n", procName, w, h);
486 PIX *pix1, *pix2, *pix3, *pixd;
488 PROCNAME(
"pixGenTextblockMask");
490 if (!pixs || pixGetDepth(pixs) != 1)
491 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
493 if (w < MinWidth || h < MinHeight) {
494 L_ERROR(
"pix too small: w = %d, h = %d\n", procName, w, h);
498 return (
PIX *)ERROR_PTR(
"pixvws not defined", procName, NULL);
505 L_INFO(
"no fg pixels in textblock mask\n", procName);
578 l_int32 flag, nbox, intersects;
579 l_int32 w, h, bx, by, bw, bh, left, right, top, bottom;
580 PIX *pixb, *pixb2, *pixseed, *pixsf, *pixm, *pix1, *pixg2;
581 BOX *box, *boxfg, *boxin, *boxd;
584 PROCNAME(
"pixFindPageForeground");
587 return (
BOX *)ERROR_PTR(
"pixs not defined", procName, NULL);
589 if (w < MinWidth || h < MinHeight) {
590 L_ERROR(
"pix too small: w = %d, h = %d\n", procName, w, h);
599 flag = (showmorph) ? 100 : 0;
604 pixOr(pixseed, pixseed, pix1);
607 pixOr(pixseed, pixseed, pix1);
627 left = (bx > mindist) ? erasedist : 0;
628 right = (w - bx - bw > mindist) ? erasedist : 0;
629 top = (by > mindist) ? erasedist : 0;
630 bottom = (h - by - bh > mindist) ? erasedist : 0;
645 boxin =
boxCreate(0.1 * w, 0, 0.8 * w, h);
708 l_int32 ncomp, i, xoff, yoff;
709 BOXA *boxa1, *boxa2, *boxat1, *boxat2, *boxad;
711 PIX *pix, *pix1, *pix2, *pixdb;
712 PIXA *pixa1, *pixadb;
714 PROCNAME(
"pixSplitIntoCharacters");
716 if (pboxa) *pboxa = NULL;
717 if (ppixa) *ppixa = NULL;
718 if (ppixdebug) *ppixdebug = NULL;
719 if (!pixs || pixGetDepth(pixs) != 1)
720 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
738 pixadb = (ppixdebug) ?
pixaCreate(ncomp) : NULL;
739 for (i = 0; i < ncomp; i++) {
807 l_int32 w, h, n2, i, firstmin, xmin, xshift;
808 l_int32 nmin, nleft, nright, nsplit, isplit, ncomp;
809 l_int32 *array1, *array2;
812 NUMA *na1, *na2, *nasplit;
815 PROCNAME(
"pixSplitComponentsWithProfile");
817 if (ppixdebug) *ppixdebug = NULL;
818 if (!pixs || pixGetDepth(pixs) != 1)
819 return (
BOXA *)ERROR_PTR(
"pixa undefined or not 1 bpp", procName, NULL);
845 firstmin = (array1[array2[0]] > array1[array2[1]]) ? 1 : 2;
847 for (i = firstmin; i < n2 - 1; i+= 2) {
850 if (xmin + 2 >= w)
break;
851 nleft = array1[xmin - 2];
852 nright = array1[xmin + 2];
855 "Splitting: xmin = %d, w = %d; nl = %d, nmin = %d, nr = %d\n",
856 xmin, w, nleft, nmin, nright);
858 if (nleft - nmin >= mindel && nright - nmin >= mindel)
864 if (ppixdebug && nsplit > 0) {
866 gplotSimple1(na1, GPLOT_PNG,
"/tmp/lept/split/split", NULL);
883 for (i = 0, xshift = 0; i < nsplit; i++) {
885 box =
boxCreate(xshift, 0, isplit - xshift, h);
889 box =
boxCreate(xshift, 0, w - xshift, h);
896 for (i = 0; i < ncomp; i++) {
968 l_int32 res, csize, empty;
969 BOXA *boxa1, *boxa2, *boxa3;
970 PIX *pix1, *pix2, *pix3;
971 PIXA *pixa1, *pixa2, *pixa3;
973 PROCNAME(
"pixExtractTextlines");
976 return (
PIXA *)ERROR_PTR(
"pixs not defined", procName, NULL);
979 if (pixGetDepth(pixs) > 1) {
991 L_INFO(
"no fg pixels in input image\n", procName);
1005 if ((res = pixGetXRes(pixs)) == 0) {
1006 L_INFO(
"Resolution is not set: setting to 300 ppi\n", procName);
1009 csize = L_MIN(120., 60.0 * res / 300.0);
1010 snprintf(buf,
sizeof(buf),
"c%d.1 + o%d.1", csize, csize / 3);
1023 minw = (minw != 0) ? minw : (l_int32)(0.12 * res);
1024 minh = (minh != 0) ? minh : (l_int32)(0.07 * res);
1106 l_int32 res, csize, empty;
1107 BOXA *boxa1, *boxa2, *boxa3;
1109 PIX *pix1, *pix2, *pix3;
1110 PIXA *pixa1, *pixa2;
1112 PROCNAME(
"pixExtractRawTextlines");
1115 return (
PIXA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1118 if ((res = pixGetXRes(pixs)) == 0) {
1119 L_INFO(
"Resolution is not set: setting to 300 ppi\n", procName);
1122 maxw = (maxw != 0) ? maxw : (l_int32)(0.5 * res);
1123 maxh = (maxh != 0) ? maxh : (l_int32)(0.5 * res);
1126 if (pixGetDepth(pixs) > 1) {
1138 L_INFO(
"no fg pixels in input image\n", procName);
1151 csize = L_MIN(120., 60.0 * res / 300.0);
1152 snprintf(buf,
sizeof(buf),
"c%d.1", csize);
1227 l_float32 deltafract,
1228 l_float32 peakfract,
1229 l_float32 clipfract,
1233 l_int32 w, h, res, i, n, npeak;
1234 l_float32 scalefact, redfact, minval, maxval, val4, val5, fract;
1236 NUMA *na1, *na2, *na3, *na4, *na5;
1237 PIX *pix1, *pix2, *pix3, *pix4, *pix5;
1239 PROCNAME(
"pixCountTextColumns");
1242 return ERROR_INT(
"&ncols not defined", procName, 1);
1244 if (!pixs || pixGetDepth(pixs) != 1)
1245 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
1246 if (deltafract < 0.15 || deltafract > 0.75)
1247 L_WARNING(
"deltafract not in [0.15 ... 0.75]\n", procName);
1248 if (peakfract < 0.25 || peakfract > 0.9)
1249 L_WARNING(
"peakfract not in [0.25 ... 0.9]\n", procName);
1250 if (clipfract < 0.0 || clipfract >= 0.5)
1251 return ERROR_INT(
"clipfract not in [0.0 ... 0.5)\n", procName, 1);
1255 if ((res = pixGetXRes(pixs)) == 0) {
1256 L_WARNING(
"resolution undefined; set to 300\n", procName);
1261 L_WARNING(
"resolution %d very low\n", procName, res);
1262 scalefact = 37.5 / res;
1263 pix1 =
pixScale(pixs, scalefact, scalefact);
1265 redfact = (l_float32)res / 37.5;
1268 else if (redfact < 4.0)
1270 else if (redfact < 8.0)
1272 else if (redfact < 16.0)
1281 box =
boxCreate(clipfract * w, clipfract * h,
1282 (1.0 - 2 * clipfract) * w, (1.0 - 2 * clipfract) * h);
1300 pix5 =
pixRead(
"/tmp/lept/plot.png");
1311 fract = (l_float32)(maxval - minval) / h;
1313 L_INFO(
"very little content on page; 0 text columns\n", procName);
1320 for (i = 0, npeak = 0; i < n; i++) {
1323 if (val4 > 0.3 && val4 < 0.7 && val5 >= peakfract) {
1325 L_INFO(
"Peak(loc,val) = (%5.3f,%5.3f)\n", procName, val4, val5);
1328 *pncols = npeak + 1;
1379 l_int32 i, empty, maxw, w, h, n1, n2, n3, minlines, big_comp;
1380 l_float32 ratio1, ratio2;
1382 BOXA *boxa1, *boxa2, *boxa3, *boxa4, *boxa5;
1383 PIX *pix1, *pix2, *pix3, *pix4, *pix5, *pix6, *pix7;
1387 PROCNAME(
"pixDecideIfText");
1390 return ERROR_INT(
"&istext not defined", procName, 1);
1393 return ERROR_INT(
"pixs not defined", procName, 1);
1397 return ERROR_INT(
"pix1 not made", procName, 1);
1402 L_INFO(
"pix is empty\n", procName);
1405 w = pixGetWidth(pix1);
1415 for (i = 0; i < 81; i++)
1424 pix3 =
pixHMT(NULL, pix1, sel1);
1426 pix5 =
pixXor(NULL, pix1, pix4);
1495 ratio1 = (l_float32)maxw / (l_float32)w;
1496 ratio2 = (l_float32)n3 / (l_float32)n2;
1497 minlines = L_MAX(2, h / 125);
1498 if (big_comp || ratio1 < 0.6 || ratio2 < 0.8 || n3 < minlines)
1503 if (*pistext == 1) {
1504 L_INFO(
"This is text: \n n1 = %d, n2 = %d, n3 = %d, " 1505 "minlines = %d\n maxw = %d, ratio1 = %4.2f, h = %d, " 1506 "big_comp = %d\n", procName, n1, n2, n3, minlines,
1507 maxw, ratio1, h, big_comp);
1509 L_INFO(
"This is not text: \n n1 = %d, n2 = %d, n3 = %d, " 1510 "minlines = %d\n maxw = %d, ratio1 = %4.2f, h = %d, " 1511 "big_comp = %d\n", procName, n1, n2, n3, minlines,
1512 maxw, ratio1, h, big_comp);
1549 PROCNAME(
"pixFindThreshFgExtent");
1551 if (ptop) *ptop = 0;
1552 if (pbot) *pbot = 0;
1554 return ERROR_INT(
"nothing to determine", procName, 1);
1555 if (!pixs || pixGetDepth(pixs) != 1)
1556 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
1562 for (i = 0; i < n; i++) {
1563 if (array[i] >= thresh) {
1570 for (i = n - 1; i >= 0; i--) {
1571 if (array[i] >= thresh) {
1636 l_int32 empty, nhb, nvb, nvw, score, htfound;
1637 PIX *pix1, *pix2, *pix3, *pix4, *pix5, *pix6, *pix7, *pix8, *pix9;
1639 PROCNAME(
"pixDecideIfTable");
1642 return ERROR_INT(
"&score not defined", procName, 1);
1645 return ERROR_INT(
"pixs not defined", procName, 1);
1656 L_INFO(
"pix has an image region\n", procName);
1662 return ERROR_INT(
"pix1 not made", procName, 1);
1668 L_INFO(
"pix is empty\n", procName);
1703 pix6 =
pixOr(NULL, pix3, pix5);
1742 if (nhb > 1) score++;
1743 if (nvb > 2) score++;
1744 if (nvw > 3) score++;
1745 if (nvw > 6) score++;
1782 l_float32 cropfract,
1788 PIX *pix1, *pix2, *pix3, *pix4, *pix5;
1790 PROCNAME(
"pixPrepare1bpp");
1793 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1802 box1 =
boxCreate((l_int32)(cropfract * w), (l_int32)(cropfract * h),
1803 (l_int32)((1.0 - 2 * cropfract) * w),
1804 (l_int32)((1.0 - 2 * cropfract) * h));
1810 if (pixGetDepth(pixs) > 1) {
1816 L_INFO(
"pix cleaning failed\n", procName);
1830 if ((res = pixGetXRes(pixs)) == 0) {
1831 L_WARNING(
"Resolution is not set: using 300 ppi\n", procName);
1834 if (res != outres) {
1835 factor = (l_float32)outres / (l_float32)res;
1836 pix5 =
pixScale(pix4, factor, factor);
1870 l_int32 w, h, sampling;
1873 PIX *pix1, *pix2, *pixm;
1875 PROCNAME(
"pixEstimateBackground");
1878 return ERROR_INT(
"&bg not defined", procName, 1);
1880 if (!pixs || pixGetDepth(pixs) != 8)
1881 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
1882 if (darkthresh > 128)
1883 L_WARNING(
"darkthresh unusually large\n", procName);
1884 if (edgecrop < 0.0 || edgecrop >= 1.0)
1885 return ERROR_INT(
"edgecrop not in [0.0 ... 1.0)", procName, 1);
1891 if (edgecrop > 0.0) {
1892 box =
boxCreate(0.5 * edgecrop * w, 0.5 * edgecrop * h,
1893 (1.0 - edgecrop) * w, (1.0 - edgecrop) * h);
1901 sampling = L_MAX(1, (l_int32)sqrt((l_float64)(w * h) / 50000. + 0.5));
1905 if (darkthresh > 0) {
1911 *pbg = (l_int32)(fbg + 0.5);
1955 l_int32 i, op, bx, by, bw, bh;
1960 PROCNAME(
"pixFindLargeRectangles");
1962 if (ppixdb) *ppixdb = NULL;
1964 return ERROR_INT(
"&boxa not defined", procName, 1);
1966 if (!pixs || pixGetDepth(pixs) != 1)
1967 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
1968 if (polarity != 0 && polarity != 1)
1969 return ERROR_INT(
"invalid polarity", procName, 1);
1971 L_WARNING(
"large num rectangles = %d requested; using 1000\n",
1981 for (i = 0; i < nrect; i++) {
1984 L_ERROR(
"failure in pixFindLargestRectangle\n", procName);
2057 l_int32 i, j, w, h, d, wpls, val;
2058 l_int32 wp, hp, w1, w2, h1, h2, wmin, hmin, area1, area2;
2060 l_int32 maxarea, wmax, hmax, vertdist, horizdist, prevfg;
2062 l_uint32 *datas, *lines;
2063 l_uint32 **linew, **lineh;
2068 PROCNAME(
"pixFindLargestRectangle");
2070 if (ppixdb) *ppixdb = NULL;
2072 return ERROR_INT(
"&box not defined", procName, 1);
2075 return ERROR_INT(
"pixs not defined", procName, 1);
2078 return ERROR_INT(
"pixs not 1 bpp", procName, 1);
2079 if (polarity != 0 && polarity != 1)
2080 return ERROR_INT(
"invalid polarity", procName, 1);
2083 lowestfg = (l_int32 *)LEPT_CALLOC(w,
sizeof(l_int32));
2084 for (i = 0; i < w; i++)
2095 wpls = pixGetWpl(pixs);
2096 maxarea = xmax = ymax = wmax = hmax = 0;
2097 for (i = 0; i < h; i++) {
2098 lines = datas + i * wpls;
2100 for (j = 0; j < w; j++) {
2102 if ((val ^ polarity) == 0) {
2103 if (i == 0 && j == 0) {
2105 }
else if (i == 0) {
2106 wp = linew[i][j - 1] + 1;
2108 }
else if (j == 0) {
2110 hp = lineh[i - 1][j] + 1;
2113 w1 = linew[i - 1][j];
2114 h1 = lineh[i - 1][j];
2115 horizdist = j - prevfg;
2116 wmin = L_MIN(w1, horizdist);
2117 area1 = wmin * (h1 + 1);
2120 w2 = linew[i][j - 1];
2121 h2 = lineh[i][j - 1];
2122 vertdist = i - lowestfg[j];
2123 hmin = L_MIN(h2, vertdist);
2124 area2 = hmin * (w2 + 1);
2126 if (area1 > area2) {
2141 if (wp * hp > maxarea) {
2152 box =
boxCreate(xmax - wmax + 1, ymax - hmax + 1, wmax, hmax);
2162 LEPT_FREE(lowestfg);
2204 pixFindRectangleInCC(
PIX *pixs,
2211 l_int32 x, y, i, w, h, w1, h1, w2, h2, found, res;
2212 l_int32 xfirst, xlast, xstart, yfirst, ylast, length;
2213 BOX *box1, *box2, *box3, *box4, *box5;
2214 PIX *pix1, *pix2, *pixdb1, *pixdb2;
2217 PROCNAME(
"pixFindRectangleInCC");
2219 if (!pixs || pixGetDepth(pixs) != 1)
2220 return (
BOX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
2221 if (fract <= 0.0 || fract > 1.0)
2222 return (
BOX *)ERROR_PTR(
"invalid fraction", procName, NULL);
2224 return (
BOX *)ERROR_PTR(
"invalid scan direction", procName, NULL);
2227 return (
BOX *)ERROR_PTR(
"invalid select", procName, NULL);
2257 for (i = 0; i < h; i++) {
2259 if (length >= (l_int32)(fract * w + 0.5)) {
2262 xlast = xfirst + length - 1;
2268 L_WARNING(
"no run of sufficient size was found\n", procName);
2276 w1 = xlast - xfirst + 1;
2279 for (i = yfirst + 1; i < h; i++) {
2281 if (xstart > xfirst || (xstart + length - 1 < xlast) ||
2284 h1 = ylast - yfirst + 1;
2288 box1 =
boxCreate(xfirst, yfirst, w1, h1);
2292 for (i = h - 1; i >= 0; i--) {
2294 if (length >= (l_int32)(fract * w + 0.5)) {
2297 xlast = xfirst + length - 1;
2303 w2 = xlast - xfirst + 1;
2305 for (i = ylast - 1; i >= 0; i--) {
2307 if (xstart > xfirst || (xstart + length - 1 < xlast) ||
2310 h2 = ylast - yfirst + 1;
2314 box2 =
boxCreate(xfirst, yfirst, w2, h2);
2345 box5 = (box4) ?
boxTransform(box4, x, y, 1.0, 1.0) : NULL;
2356 res = pixGetXRes(pixs);
2357 L_INFO(
"Writing debug files to /tmp/lept/rect/\n", procName);
2359 "/tmp/lept/rect/fitrect.pdf");
2361 pixWrite(
"/tmp/lept/rect/fitrect.png", pix1, IFF_PNG);
2398 l_int32 i, n, empty, x, y, w, h;
2402 PIX *pix1, *pix2, *pix3, *pix4, *pix5;
2404 PROCNAME(
"pixAutoPhotoinvert");
2406 if (ppixm) *ppixm = NULL;
2408 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2409 if (thresh == 0) thresh = 128;
2412 return (
PIX *)ERROR_PTR(
"pix1 not made", procName, NULL);
2441 for (i = 0; i < n; i++) {
2445 if (pixadb)
lept_stderr(
"fg fraction: %5.3f\n", fgfract);
NUMA * pixCountPixelsByRow(PIX *pix, l_int32 *tab8)
pixCountPixelsByRow()
void bmfDestroy(L_BMF **pbmf)
bmfDestroy()
PIX * pixConvertTo1(PIX *pixs, l_int32 threshold)
pixConvertTo1()
l_ok numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
NUMA * pixCountPixelsByColumn(PIX *pix)
pixCountPixelsByColumn()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
BOX * boxRotateOrth(BOX *box, l_int32 w, l_int32 h, l_int32 rotation)
boxRotateOrth()
PIX * pixDeskew(PIX *pixs, l_int32 redsearch)
pixDeskew()
l_int32 lept_mkdir(const char *subdir)
lept_mkdir()
NUMA * numaFindExtrema(NUMA *nas, l_float32 delta, NUMA **pnav)
numaFindExtrema()
l_ok boxaJoin(BOXA *boxad, BOXA *boxas, l_int32 istart, l_int32 iend)
boxaJoin()
l_ok pixacompAddPix(PIXAC *pixac, PIX *pix, l_int32 comptype)
pixacompAddPix()
PIXA * pixExtractRawTextlines(PIX *pixs, l_int32 maxw, l_int32 maxh, l_int32 adjw, l_int32 adjh, PIXA *pixadb)
pixExtractRawTextlines()
BOXA * boxaSort(BOXA *boxas, l_int32 sorttype, l_int32 sortorder, NUMA **pnaindex)
boxaSort()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_ok boxaaGetExtent(BOXAA *baa, l_int32 *pw, l_int32 *ph, BOX **pbox, BOXA **pboxa)
boxaaGetExtent()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
PIX * pixDeskewBoth(PIX *pixs, l_int32 redsearch)
pixDeskewBoth()
PIX * pixGenTextblockMask(PIX *pixs, PIX *pixvws, PIXA *pixadb)
pixGenTextblockMask()
BOXA * boxaSelectBySize(BOXA *boxas, l_int32 width, l_int32 height, l_int32 type, l_int32 relation, l_int32 *pchanged)
boxaSelectBySize()
l_ok pixDecideIfText(PIX *pixs, BOX *box, l_int32 *pistext, PIXA *pixadb)
pixDecideIfText()
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()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
void ** pixGetLinePtrs(PIX *pix, l_int32 *psize)
pixGetLinePtrs()
void lept_stderr(const char *fmt,...)
lept_stderr()
PIX * pixDilateBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateBrick()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
PIX * pixSelectBySize(PIX *pixs, l_int32 width, l_int32 height, l_int32 connectivity, l_int32 type, l_int32 relation, l_int32 *pchanged)
pixSelectBySize()
l_ok pixRenderBoxBlend(PIX *pix, BOX *box, l_int32 width, l_uint8 rval, l_uint8 gval, l_uint8 bval, l_float32 fract)
pixRenderBoxBlend()
PIX * pixInvert(PIX *pixd, PIX *pixs)
pixInvert()
NUMA * numaCreate(l_int32 n)
numaCreate()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
BOX * boxTransform(BOX *box, l_int32 shiftx, l_int32 shifty, l_float32 scalex, l_float32 scaley)
boxTransform()
PIX * pixThresholdToBinary(PIX *pixs, l_int32 thresh)
pixThresholdToBinary()
#define GET_DATA_BIT(pdata, n)
PIX * pixDrawBoxaRandom(PIX *pixs, BOXA *boxa, l_int32 width)
pixDrawBoxaRandom()
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
BOX * boxBoundingRegion(BOX *box1, BOX *box2)
boxBoundingRegion()
l_ok pixSetOrClearBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_int32 op)
pixSetOrClearBorder()
PIX * pixGenTextlineMask(PIX *pixs, PIX **ppixvws, l_int32 *ptlfound, PIXA *pixadb)
pixGenTextlineMask()
l_ok pixCombineMasked(PIX *pixd, PIX *pixs, PIX *pixm)
pixCombineMasked()
l_ok pixClipToForeground(PIX *pixs, PIX **ppixd, BOX **pbox)
pixClipToForeground()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
PIXA * pixExtractTextlines(PIX *pixs, l_int32 maxw, l_int32 maxh, l_int32 minw, l_int32 minh, l_int32 adjw, l_int32 adjh, PIXA *pixadb)
pixExtractTextlines()
PIX * pixaDisplayRandomCmap(PIXA *pixa, l_int32 w, l_int32 h)
pixaDisplayRandomCmap()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
void boxaaDestroy(BOXAA **pbaa)
boxaaDestroy()
PIX * pixCloseSafeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeBrick()
PIX * pixXor(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixXor()
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 pixForegroundFraction(PIX *pix, l_float32 *pfract)
pixForegroundFraction()
void selDestroy(SEL **psel)
selDestroy()
BOXA * pixConnCompBB(PIX *pixs, l_int32 connectivity)
pixConnCompBB()
l_ok pixSplitIntoCharacters(PIX *pixs, l_int32 minw, l_int32 minh, BOXA **pboxa, PIXA **ppixa, PIX **ppixdebug)
pixSplitIntoCharacters()
PIX * pixCleanBackgroundToWhite(PIX *pixs, PIX *pixim, PIX *pixg, l_float32 gamma, l_int32 blackval, l_int32 whiteval)
pixCleanBackgroundToWhite()
l_ok boxaGetBoxGeometry(BOXA *boxa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxaGetBoxGeometry()
l_ok pixaAddPixWithText(PIXA *pixa, PIX *pixs, l_int32 reduction, L_BMF *bmf, const char *textstr, l_uint32 val, l_int32 location)
pixaAddPixWithText()
PIX * pixGenerateHalftoneMask(PIX *pixs, PIX **ppixtext, l_int32 *phtfound, PIXA *pixadb)
pixGenerateHalftoneMask()
l_ok pixSetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 val)
pixSetPixel()
PIX * pixaDisplayTiledInRows(PIXA *pixa, l_int32 outdepth, l_int32 maxwidth, l_float32 scalefactor, l_int32 background, l_int32 spacing, l_int32 border)
pixaDisplayTiledInRows()
PIX * pixMorphSequence(PIX *pixs, const char *sequence, l_int32 dispsep)
pixMorphSequence()
void ptaaDestroy(PTAA **pptaa)
ptaaDestroy()
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
PIXA * pixaSelectBySize(PIXA *pixas, l_int32 width, l_int32 height, l_int32 type, l_int32 relation, l_int32 *pchanged)
pixaSelectBySize()
l_ok boxaWriteDebug(const char *filename, BOXA *boxa)
boxaWriteDebug()
PIXA * pixClipRectangles(PIX *pixs, BOXA *boxa)
pixClipRectangles()
BOX * boxAdjustSides(BOX *boxd, BOX *boxs, l_int32 delleft, l_int32 delright, l_int32 deltop, l_int32 delbot)
boxAdjustSides()
l_ok pixaGetBoxGeometry(PIXA *pixa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
pixaGetBoxGeometry()
PIX * pixRemoveBorderConnComps(PIX *pixs, l_int32 connectivity)
pixRemoveBorderConnComps()
PIX * pixAutoPhotoinvert(PIX *pixs, l_int32 thresh, PIX **ppixm, PIXA *pixadb)
pixFindRectangleInCC()
l_ok pixFindLargeRectangles(PIX *pixs, l_int32 polarity, l_int32 nrect, BOXA **pboxa, PIX **ppixdb)
pixFindLargeRectangles()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixSubtract(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixSubtract()
PIX * pixaDisplayTiledAndScaled(PIXA *pixa, l_int32 outdepth, l_int32 tilewidth, l_int32 ncols, l_int32 background, l_int32 spacing, l_int32 border)
pixaDisplayTiledAndScaled()
l_ok pixGetRankValueMasked(PIX *pixs, PIX *pixm, l_int32 x, l_int32 y, l_int32 factor, l_float32 rank, l_float32 *pval, NUMA **pna)
pixGetRankValueMasked()
BOX * boxOverlapRegion(BOX *box1, BOX *box2)
boxOverlapRegion()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixFindThreshFgExtent(PIX *pixs, l_int32 thresh, l_int32 *ptop, l_int32 *pbot)
pixFindThreshFgExtent()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
PIX * pixRenderRandomCmapPtaa(PIX *pix, PTAA *ptaa, l_int32 polyflag, l_int32 width, l_int32 closeflag)
pixRenderRandomCmapPtaa()
BOX * pixFindPageForeground(PIX *pixs, l_int32 threshold, l_int32 mindist, l_int32 erasedist, l_int32 showmorph, PIXAC *pixac)
pixFindPageForeground()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
PIX * pixSeedfillBinaryRestricted(PIX *pixd, PIX *pixs, PIX *pixm, l_int32 connectivity, l_int32 xmax, l_int32 ymax)
pixSeedfillBinaryRestricted()
void numaDestroy(NUMA **pna)
numaDestroy()
PIX * pixOpenBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenBrick()
PIX * pixSeedfillBinary(PIX *pixd, PIX *pixs, PIX *pixm, l_int32 connectivity)
pixSeedfillBinary()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
l_ok numaGetMin(NUMA *na, l_float32 *pminval, l_int32 *piminloc)
numaGetMin()
NUMA * numaTransform(NUMA *nas, l_float32 shift, l_float32 scale)
numaTransform()
PIX * pixPrepare1bpp(PIX *pixs, BOX *box, l_float32 cropfract, l_int32 outres)
pixPrepare1bpp()
l_ok pixFindLargestRectangle(PIX *pixs, l_int32 polarity, BOX **pbox, PIX **ppixdb)
pixFindLargestRectangle()
PIX * pixOr(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixOr()
NUMA * pixCountByColumn(PIX *pix, BOX *box)
pixCountByColumn()
BOXA * boxaAdjustSides(BOXA *boxas, l_int32 delleft, l_int32 delright, l_int32 deltop, l_int32 delbot)
boxaAdjustSides()
PIX * pixRead(const char *filename)
pixRead()
l_ok pixRenderHashBoxArb(PIX *pix, BOX *box, l_int32 spacing, l_int32 width, l_int32 orient, l_int32 outline, l_int32 rval, l_int32 gval, l_int32 bval)
pixRenderHashBoxArb()
PIX * pixExpandReplicate(PIX *pixs, l_int32 factor)
pixExpandReplicate()
l_ok pixaConvertToPdf(PIXA *pixa, l_int32 res, l_float32 scalefactor, l_int32 type, l_int32 quality, const char *title, const char *fileout)
pixaConvertToPdf()
PIX * pixMorphSequenceByComponent(PIX *pixs, const char *sequence, l_int32 connectivity, l_int32 minw, l_int32 minh, BOXA **pboxa)
pixMorphSequenceByComponent()
l_ok pixRenderBoxaArb(PIX *pix, BOXA *boxa, l_int32 width, l_uint8 rval, l_uint8 gval, l_uint8 bval)
pixRenderBoxaArb()
PIX * pixHMT(PIX *pixd, PIX *pixs, SEL *sel)
pixHMT()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
l_ok pixRenderBoxArb(PIX *pix, BOX *box, l_int32 width, l_uint8 rval, l_uint8 gval, l_uint8 bval)
pixRenderBoxArb()
l_ok pixCountTextColumns(PIX *pixs, l_float32 deltafract, l_float32 peakfract, l_float32 clipfract, l_int32 *pncols, PIXA *pixadb)
pixCountTextColumns()
BOX * boxCopy(BOX *box)
boxCopy()
PIX * pixConvert1To4Cmap(PIX *pixs)
pixConvert1To4Cmap()
l_ok pixZero(PIX *pix, l_int32 *pempty)
pixZero()
BOXA * boxaCreate(l_int32 n)
boxaCreate()
l_ok pixFindMaxHorizontalRunOnLine(PIX *pix, l_int32 y, l_int32 *pxstart, l_int32 *psize)
pixFindMaxHorizontalRunOnLine()
void boxDestroy(BOX **pbox)
boxDestroy()
BOXAA * boxaSort2d(BOXA *boxas, NUMAA **pnaad, l_int32 delta1, l_int32 delta2, l_int32 minh1)
boxaSort2d()
BOXA * pixSplitComponentWithProfile(PIX *pixs, l_int32 delta, l_int32 mindel, PIX **ppixdebug)
pixSplitComponentWithProfile()
l_ok boxIntersects(BOX *box1, BOX *box2, l_int32 *presult)
boxIntersects()
l_ok pixDecideIfTable(PIX *pixs, BOX *box, l_int32 orient, l_int32 *pscore, PIXA *pixadb)
pixDecideIfTable()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
l_ok pixSetResolution(PIX *pix, l_int32 xres, l_int32 yres)
pixSetResolution()
PIX * pixRotate90(PIX *pixs, l_int32 direction)
pixRotate90()
PIX * pixFillHolesToBoundingRect(PIX *pixs, l_int32 minsize, l_float32 maxhfract, l_float32 minfgfract)
pixFillHolesToBoundingRect()
BOXA * boxaaFlattenToBoxa(BOXAA *baa, NUMA **pnaindex, l_int32 copyflag)
boxaaFlattenToBoxa()
l_ok numaGetMax(NUMA *na, l_float32 *pmaxval, l_int32 *pimaxloc)
numaGetMax()
SEL * selCreateFromPix(PIX *pix, l_int32 cy, l_int32 cx, const char *name)
selCreateFromPix()
l_ok boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
PIX * pixScale(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScale()
PIX * pixReduceRankBinaryCascade(PIX *pixs, l_int32 level1, l_int32 level2, l_int32 level3, l_int32 level4)
pixReduceRankBinaryCascade()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
l_ok pixCountConnComp(PIX *pixs, l_int32 connectivity, l_int32 *pcount)
pixCountConnComp()
l_ok pixGetRegionsBinary(PIX *pixs, PIX **ppixhm, PIX **ppixtm, PIX **ppixtb, PIXA *pixadb)
pixGetRegionsBinary()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
PTAA * pixGetOuterBordersPtaa(PIX *pixs)
pixGetOuterBordersPtaa()
l_ok numaWriteStderr(NUMA *na)
numaWriteStderr()
l_ok gplotSimple1(NUMA *na, l_int32 outformat, const char *outroot, const char *title)
gplotSimple1()
l_ok selSetElement(SEL *sel, l_int32 row, l_int32 col, l_int32 type)
selSetElement()
l_ok pixAddConstantGray(PIX *pixs, l_int32 val)
pixAddConstantGray()
l_ok ptaaWriteDebug(const char *filename, PTAA *ptaa, l_int32 type)
ptaaWriteDebug()
PIX * pixGenHalftoneMask(PIX *pixs, PIX **ppixtext, l_int32 *phtfound, l_int32 debug)
pixGenHalftoneMask()
PIX * pixMorphCompSequence(PIX *pixs, const char *sequence, l_int32 dispsep)
pixMorphCompSequence()
l_ok pixEstimateBackground(PIX *pixs, l_int32 darkthresh, l_float32 edgecrop, l_int32 *pbg)
pixEstimateBackground()
L_BMF * bmfCreate(const char *dir, l_int32 fontsize)
bmfCreate()
BOXA * pixaGetBoxa(PIXA *pixa, l_int32 accesstype)
pixaGetBoxa()