102 #include "allheaders.h" 105 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
106 l_uint32 *bufs1, l_uint32 *bufs2,
107 l_int32 lowerclip, l_int32 upperclip);
109 l_int32 wpld, l_uint32 *datas, l_int32 d,
110 l_int32 wpls, l_int32 thresh);
111 static void ditherTo2bppLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld,
112 l_uint32 *datas, l_int32 wpls, l_uint32 *bufs1,
113 l_uint32 *bufs2, l_int32 *tabval, l_int32 *tab38,
116 l_uint32 *bufs2, l_int32 *tabval,
117 l_int32 *tab38, l_int32 *tab14,
118 l_int32 lastlineflag);
120 l_int32 **ptab14, l_int32 cliptoblack,
121 l_int32 cliptowhite);
123 l_uint32 *datas, l_int32 wpls, l_int32 *tab);
125 l_uint32 *datas, l_int32 wpls, l_int32 *tab);
128 l_int32 outdepth,
PIXCMAP **pcmap);
130 l_float32 minfract, l_int32 maxsize,
133 #ifndef NO_CONSOLE_IO 134 #define DEBUG_UNROLLING 0 173 PROCNAME(
"pixDitherToBinary");
176 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
177 if (pixGetDepth(pixs) != 8)
178 return (
PIX *)ERROR_PTR(
"must be 8 bpp for dithering", procName, NULL);
207 l_int32 w, h, d, wplt, wpld;
208 l_uint32 *datat, *datad;
209 l_uint32 *bufs1, *bufs2;
212 PROCNAME(
"pixDitherToBinarySpec");
215 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
218 return (
PIX *)ERROR_PTR(
"must be 8 bpp for dithering", procName, NULL);
219 if (lowerclip < 0 || lowerclip > 255)
220 return (
PIX *)ERROR_PTR(
"invalid value for lowerclip", procName, NULL);
221 if (upperclip < 0 || upperclip > 255)
222 return (
PIX *)ERROR_PTR(
"invalid value for upperclip", procName, NULL);
225 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
226 pixCopyResolution(pixd, pixs);
227 pixCopyInputFormat(pixd, pixs);
229 wpld = pixGetWpl(pixd);
234 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
237 wplt = pixGetWpl(pixt);
240 bufs1 = (l_uint32 *)LEPT_CALLOC(wplt,
sizeof(l_uint32));
241 bufs2 = (l_uint32 *)LEPT_CALLOC(wplt,
sizeof(l_uint32));
242 if (!bufs1 || !bufs2) {
247 return (
PIX *)ERROR_PTR(
"bufs1, bufs2 not both made", procName, NULL);
251 lowerclip, upperclip);
281 memcpy(bufs2, datas, 4 * wpls);
282 for (i = 0; i < h - 1; i++) {
283 memcpy(bufs1, bufs2, 4 * wpls);
284 memcpy(bufs2, datas + (i + 1) * wpls, 4 * wpls);
285 lined = datad + i * wpld;
290 memcpy(bufs1, bufs2, 4 * wpls);
291 lined = datad + (h - 1) * wpld;
328 l_int32 lastlineflag)
332 l_uint8 fval1, fval2, rval, bval, dval;
334 if (lastlineflag == 0) {
335 for (j = 0; j < w - 1; j++) {
338 if ((eval = 255 - oval) > upperclip) {
340 fval1 = (3 * eval) / 8;
343 rval = L_MAX(0, rval - fval1);
346 bval = L_MAX(0, bval - fval1);
349 dval = L_MAX(0, dval - fval2);
354 if (oval > lowerclip) {
356 fval1 = (3 * oval) / 8;
359 rval = L_MIN(255, rval + fval1);
362 bval = L_MIN(255, bval + fval1);
365 dval = L_MIN(255, dval + fval2);
374 if ((eval = 255 - oval) > upperclip) {
376 fval1 = (3 * eval) / 8;
378 bval = L_MAX(0, bval - fval1);
383 if (oval > lowerclip) {
385 fval1 = (3 * oval) / 8;
387 bval = L_MIN(255, bval + fval1);
392 for (j = 0; j < w - 1; j++) {
395 if ((eval = 255 - oval) > upperclip) {
397 fval1 = (3 * eval) / 8;
399 rval = L_MAX(0, rval - fval1);
404 if (oval > lowerclip) {
406 fval1 = (3 * oval) / 8;
408 rval = L_MIN(255, rval + fval1);
446 l_int32 d, w, h, wplt, wpld;
447 l_uint32 *datat, *datad;
450 PROCNAME(
"pixThresholdToBinary");
453 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
455 if (d != 4 && d != 8)
456 return (
PIX *)ERROR_PTR(
"pixs must be 4 or 8 bpp", procName, NULL);
458 return (
PIX *)ERROR_PTR(
"thresh must be non-negative", procName, NULL);
459 if (d == 4 && thresh > 16)
460 return (
PIX *)ERROR_PTR(
"4 bpp thresh not in {0-16}", procName, NULL);
461 if (d == 8 && thresh > 256)
462 return (
PIX *)ERROR_PTR(
"8 bpp thresh not in {0-256}", procName, NULL);
465 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
466 pixCopyResolution(pixd, pixs);
467 pixCopyInputFormat(pixd, pixs);
469 wpld = pixGetWpl(pixd);
475 wplt = pixGetWpl(pixt);
476 if (pixGetColormap(pixs) && d == 4) {
504 l_uint32 *lines, *lined;
506 for (i = 0; i < h; i++) {
507 lines = datas + i * wpls;
508 lined = datad + i * wpld;
509 thresholdToBinaryLineLow(lined, w, lines, d, thresh);
519 thresholdToBinaryLineLow(l_uint32 *lined,
525 l_int32 j, k, gval, scount, dcount;
526 l_uint32 sword, dword;
528 PROCNAME(
"thresholdToBinaryLineLow");
534 for (j = 0, scount = 0, dcount = 0; j + 31 < w; j += 32) {
536 for (k = 0; k < 4; k++) {
537 sword = lines[scount++];
539 gval = (sword >> 28) & 0xf;
546 dword |= ((gval - thresh) >> 24) & 128;
547 gval = (sword >> 24) & 0xf;
548 dword |= ((gval - thresh) >> 25) & 64;
549 gval = (sword >> 20) & 0xf;
550 dword |= ((gval - thresh) >> 26) & 32;
551 gval = (sword >> 16) & 0xf;
552 dword |= ((gval - thresh) >> 27) & 16;
553 gval = (sword >> 12) & 0xf;
554 dword |= ((gval - thresh) >> 28) & 8;
555 gval = (sword >> 8) & 0xf;
556 dword |= ((gval - thresh) >> 29) & 4;
557 gval = (sword >> 4) & 0xf;
558 dword |= ((gval - thresh) >> 30) & 2;
560 dword |= ((gval - thresh) >> 31) & 1;
562 lined[dcount++] = dword;
569 sword = lines[scount++];
571 gval = (sword >> 28) & 0xf;
573 dword |= (((gval - thresh) >> 31) & 1) << (31 - (j & 31));
575 lined[dcount] = dword;
578 #define CHECK_BIT(a, b, c) if (GET_DATA_BIT(a, b) != c) { \ 579 fprintf(stderr, "Error: mismatch at %d/%d(%d), %d vs %d\n", \ 580 j, w, d, GET_DATA_BIT(a, b), c); } 581 for (j = 0; j < w; j++) {
583 CHECK_BIT(lined, j, gval < thresh ? 1 : 0);
589 for (j = 0, scount = 0, dcount = 0; j + 31 < w; j += 32) {
591 for (k = 0; k < 8; k++) {
592 sword = lines[scount++];
594 gval = (sword >> 24) & 0xff;
595 dword |= ((gval - thresh) >> 28) & 8;
596 gval = (sword >> 16) & 0xff;
597 dword |= ((gval - thresh) >> 29) & 4;
598 gval = (sword >> 8) & 0xff;
599 dword |= ((gval - thresh) >> 30) & 2;
601 dword |= ((gval - thresh) >> 31) & 1;
603 lined[dcount++] = dword;
610 sword = lines[scount++];
612 gval = (sword >> 24) & 0xff;
614 dword |= (l_uint64)(((gval - thresh) >> 31) & 1)
617 lined[dcount] = dword;
620 for (j = 0; j < w; j++) {
622 CHECK_BIT(lined, j, gval < thresh ? 1 : 0);
628 L_ERROR(
"src depth not 4 or 8 bpp\n", procName);
654 l_int32 i, j, vals, valg, w, h, d, wpls, wplg, wpld;
655 l_uint32 *datas, *datag, *datad, *lines, *lineg, *lined;
658 PROCNAME(
"pixVarThresholdToBinary");
661 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
663 return (
PIX *)ERROR_PTR(
"pixg not defined", procName, NULL);
665 return (
PIX *)ERROR_PTR(
"pix sizes not equal", procName, NULL);
668 return (
PIX *)ERROR_PTR(
"pixs must be 8 bpp", procName, NULL);
671 pixCopyResolution(pixd, pixs);
672 pixCopyInputFormat(pixd, pixs);
674 wpld = pixGetWpl(pixd);
676 wpls = pixGetWpl(pixs);
678 wplg = pixGetWpl(pixg);
679 for (i = 0; i < h; i++) {
680 lines = datas + i * wpls;
681 lineg = datag + i * wplg;
682 lined = datad + i * wpld;
683 for (j = 0; j < w; j++) {
730 PROCNAME(
"pixAdaptThresholdToBinary");
732 if (!pixs || pixGetDepth(pixs) != 8)
733 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", procName, NULL);
775 PROCNAME(
"pixAdaptThresholdToBinaryGen");
777 if (!pixs || pixGetDepth(pixs) != 8)
778 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", procName, NULL);
781 pixGammaTRC(pix1, pix1, gamma, blackval, whiteval);
815 l_int32 i, j, w, h, d, wplg, wpld;
816 l_uint32 *datag, *datad, *lineg, *lined;
819 PROCNAME(
"pixGenerateMaskByValue");
822 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
823 d = pixGetDepth(pixs);
824 if (d != 2 && d != 4 && d != 8)
825 return (
PIX *)ERROR_PTR(
"not 2, 4 or 8 bpp", procName, NULL);
827 if (!usecmap && pixGetColormap(pixs))
832 if (d == 8 && (val < 0 || val > 255)) {
834 return (
PIX *)ERROR_PTR(
"val out of 8 bpp range", procName, NULL);
836 if (d == 4 && (val < 0 || val > 15)) {
838 return (
PIX *)ERROR_PTR(
"val out of 4 bpp range", procName, NULL);
840 if (d == 2 && (val < 0 || val > 3)) {
842 return (
PIX *)ERROR_PTR(
"val out of 2 bpp range", procName, NULL);
846 pixCopyResolution(pixd, pixg);
847 pixCopyInputFormat(pixd, pixs);
849 wplg = pixGetWpl(pixg);
851 wpld = pixGetWpl(pixd);
852 for (i = 0; i < h; i++) {
853 lineg = datag + i * wplg;
854 lined = datad + i * wpld;
855 for (j = 0; j < w; j++) {
908 l_int32 i, j, w, h, d, wplg, wpld, val;
909 l_uint32 *datag, *datad, *lineg, *lined;
912 PROCNAME(
"pixGenerateMaskByBand");
915 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
916 d = pixGetDepth(pixs);
917 if (d != 2 && d != 4 && d != 8)
918 return (
PIX *)ERROR_PTR(
"not 2, 4 or 8 bpp", procName, NULL);
919 if (lower < 0 || lower > upper)
920 return (
PIX *)ERROR_PTR(
"lower < 0 or lower > upper!", procName, NULL);
922 if (!usecmap && pixGetColormap(pixs))
927 if (d == 8 && upper > 255) {
929 return (
PIX *)ERROR_PTR(
"d == 8 and upper > 255", procName, NULL);
931 if (d == 4 && upper > 15) {
933 return (
PIX *)ERROR_PTR(
"d == 4 and upper > 15", procName, NULL);
935 if (d == 2 && upper > 3) {
937 return (
PIX *)ERROR_PTR(
"d == 2 and upper > 3", procName, NULL);
941 pixCopyResolution(pixd, pixg);
942 pixCopyInputFormat(pixd, pixs);
944 wplg = pixGetWpl(pixg);
946 wpld = pixGetWpl(pixd);
947 for (i = 0; i < h; i++) {
948 lineg = datag + i * wplg;
949 lined = datad + i * wpld;
950 for (j = 0; j < w; j++) {
958 if (val >= lower && val <= upper)
961 if (val < lower || val > upper)
1018 PROCNAME(
"pixDitherTo2bpp");
1021 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1022 if (pixGetDepth(pixs) != 8)
1023 return (
PIX *)ERROR_PTR(
"must be 8 bpp for dithering", procName, NULL);
1054 l_int32 w, h, d, wplt, wpld;
1055 l_int32 *tabval, *tab38, *tab14;
1056 l_uint32 *datat, *datad;
1057 l_uint32 *bufs1, *bufs2;
1061 PROCNAME(
"pixDitherTo2bppSpec");
1064 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1067 return (
PIX *)ERROR_PTR(
"must be 8 bpp for dithering", procName, NULL);
1068 if (lowerclip < 0 || lowerclip > 255)
1069 return (
PIX *)ERROR_PTR(
"invalid value for lowerclip", procName, NULL);
1070 if (upperclip < 0 || upperclip > 255)
1071 return (
PIX *)ERROR_PTR(
"invalid value for upperclip", procName, NULL);
1073 if ((pixd =
pixCreate(w, h, 2)) == NULL)
1074 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1075 pixCopyResolution(pixd, pixs);
1076 pixCopyInputFormat(pixd, pixs);
1078 wpld = pixGetWpl(pixd);
1083 wplt = pixGetWpl(pixt);
1086 bufs1 = (l_uint32 *)LEPT_CALLOC(wplt,
sizeof(l_uint32));
1087 bufs2 = (l_uint32 *)LEPT_CALLOC(wplt,
sizeof(l_uint32));
1088 if (!bufs1 || !bufs2) {
1093 return (
PIX *)ERROR_PTR(
"bufs1, bufs2 not both made", procName, NULL);
1100 tabval, tab38, tab14);
1148 memcpy(bufs2, datas, 4 * wpls);
1149 for (i = 0; i < h - 1; i++) {
1150 memcpy(bufs1, bufs2, 4 * wpls);
1151 memcpy(bufs2, datas + (i + 1) * wpls, 4 * wpls);
1152 lined = datad + i * wpld;
1157 memcpy(bufs1, bufs2, 4 * wpls);
1158 lined = datad + (h - 1) * wpld;
1197 l_int32 lastlineflag)
1200 l_int32 oval, tab38val, tab14val;
1201 l_uint8 rval, bval, dval;
1203 if (lastlineflag == 0) {
1204 for (j = 0; j < w - 1; j++) {
1210 tab38val = tab38[oval];
1211 tab14val = tab14[oval];
1213 rval = L_MAX(0, rval + tab38val);
1214 bval = L_MAX(0, bval + tab38val);
1215 dval = L_MAX(0, dval + tab14val);
1217 rval = L_MIN(255, rval + tab38val);
1218 bval = L_MIN(255, bval + tab38val);
1219 dval = L_MIN(255, dval + tab14val);
1230 tab38val = tab38[oval];
1232 bval = L_MAX(0, bval + tab38val);
1234 bval = L_MIN(255, bval + tab38val);
1237 for (j = 0; j < w - 1; j++) {
1241 tab38val = tab38[oval];
1243 rval = L_MAX(0, rval + tab38val);
1245 rval = L_MIN(255, rval + tab38val);
1271 l_int32 cliptoblack,
1272 l_int32 cliptowhite)
1275 l_int32 *tabval, *tab38, *tab14;
1278 tabval = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1279 tab38 = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1280 tab14 = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1285 for (i = 0; i < 256; i++) {
1286 if (i <= cliptoblack) {
1290 }
else if (i < 43) {
1292 tab38[i] = (3 * i + 4) / 8;
1293 tab14[i] = (i + 2) / 4;
1294 }
else if (i < 85) {
1296 tab38[i] = (3 * (i - 85) - 4) / 8;
1297 tab14[i] = ((i - 85) - 2) / 4;
1298 }
else if (i < 128) {
1300 tab38[i] = (3 * (i - 85) + 4) / 8;
1301 tab14[i] = ((i - 85) + 2) / 4;
1302 }
else if (i < 170) {
1304 tab38[i] = (3 * (i - 170) - 4) / 8;
1305 tab14[i] = ((i - 170) - 2) / 4;
1306 }
else if (i < 213) {
1308 tab38[i] = (3 * (i - 170) + 4) / 8;
1309 tab14[i] = ((i - 170) + 2) / 4;
1310 }
else if (i < 255 - cliptowhite) {
1312 tab38[i] = (3 * (i - 255) - 4) / 8;
1313 tab14[i] = ((i - 255) - 2) / 4;
1378 l_int32 w, h, d, wplt, wpld;
1379 l_uint32 *datat, *datad;
1383 PROCNAME(
"pixThresholdTo2bpp");
1386 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1389 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1390 if (nlevels < 2 || nlevels > 4)
1391 return (
PIX *)ERROR_PTR(
"nlevels not in {2, 3, 4}", procName, NULL);
1393 if ((pixd =
pixCreate(w, h, 2)) == NULL)
1394 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1395 pixCopyResolution(pixd, pixs);
1396 pixCopyInputFormat(pixd, pixs);
1398 wpld = pixGetWpl(pixd);
1408 wplt = pixGetWpl(pixt);
1444 l_uint8 sval1, sval2, sval3, sval4, dval;
1446 l_uint32 *lines, *lined;
1448 for (i = 0; i < h; i++) {
1449 lines = datas + i * wpls;
1450 lined = datad + i * wpld;
1451 for (j = 0; j < wpls; j++) {
1457 dval = (tab[sval1] << 6) | (tab[sval2] << 4) |
1458 (tab[sval3] << 2) | tab[sval4];
1520 l_int32 w, h, d, wplt, wpld;
1521 l_uint32 *datat, *datad;
1525 PROCNAME(
"pixThresholdTo4bpp");
1528 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1531 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1532 if (nlevels < 2 || nlevels > 16)
1533 return (
PIX *)ERROR_PTR(
"nlevels not in [2,...,16]", procName, NULL);
1535 if ((pixd =
pixCreate(w, h, 4)) == NULL)
1536 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1537 pixCopyResolution(pixd, pixs);
1538 pixCopyInputFormat(pixd, pixs);
1540 wpld = pixGetWpl(pixd);
1550 wplt = pixGetWpl(pixt);
1586 l_uint8 sval1, sval2, sval3, sval4;
1589 l_uint32 *lines, *lined;
1591 for (i = 0; i < h; i++) {
1592 lines = datas + i * wpls;
1593 lined = datad + i * wpld;
1594 for (j = 0; j < wpls; j++) {
1600 dval = (tab[sval1] << 12) | (tab[sval2] << 8) |
1601 (tab[sval3] << 4) | tab[sval4];
1637 l_int32 i, j, w, h, wpld, val, newval;
1638 l_uint32 *datad, *lined;
1642 PROCNAME(
"pixThresholdOn8bpp");
1645 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1646 if (pixGetDepth(pixs) != 8)
1647 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1648 if (nlevels < 2 || nlevels > 256)
1649 return (
PIX *)ERROR_PTR(
"nlevels not in [2,...,256]", procName, NULL);
1652 if (pixGetColormap(pixs))
1668 pixCopyResolution(pixd, pixs);
1669 pixCopyInputFormat(pixd, pixs);
1671 wpld = pixGetWpl(pixd);
1672 for (i = 0; i < h; i++) {
1673 lined = datad + i * wpld;
1674 for (j = 0; j < w; j++) {
1734 const char *edgevals,
1736 l_int32 use_average,
1741 l_int32 w, h, d, i, j, n, wplt, wpld, val, newval;
1742 l_uint32 *datat, *datad, *linet, *lined;
1747 PROCNAME(
"pixThresholdGrayArb");
1750 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1753 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1755 return (
PIX *)ERROR_PTR(
"edgevals not defined", procName, NULL);
1756 if (outdepth != 0 && outdepth != 2 && outdepth != 4 && outdepth != 8)
1757 return (
PIX *)ERROR_PTR(
"invalid outdepth", procName, NULL);
1764 return (
PIX *)ERROR_PTR(
"more than 256 levels", procName, NULL);
1766 if (outdepth == 0) {
1773 }
else if (n + 1 > (1 << outdepth)) {
1774 L_WARNING(
"outdepth too small; setting to 8 bpp\n", procName);
1788 if ((pixd =
pixCreate(w, h, outdepth)) == NULL) {
1791 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1793 pixCopyResolution(pixd, pixs);
1794 pixCopyInputFormat(pixd, pixs);
1797 wpld = pixGetWpl(pixd);
1802 wplt = pixGetWpl(pixt);
1804 if (outdepth == 2) {
1806 }
else if (outdepth == 4) {
1809 for (i = 0; i < h; i++) {
1810 lined = datad + i * wpld;
1811 linet = datat + i * wplt;
1812 for (j = 0; j < w; j++) {
1846 l_int32 i, j, thresh;
1848 PROCNAME(
"makeGrayQuantIndexTable");
1850 if ((tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32))) == NULL)
1851 return (l_int32 *)ERROR_PTR(
"calloc fail for tab", procName, NULL);
1852 for (i = 0; i < 256; i++) {
1853 for (j = 0; j < nlevels; j++) {
1854 thresh = 255 * (2 * j + 1) / (2 * nlevels - 2);
1899 l_int32 i, j, thresh, maxval, quantval;
1901 PROCNAME(
"makeGrayQuantTargetTable");
1903 if ((tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32))) == NULL)
1904 return (l_int32 *)ERROR_PTR(
"calloc fail for tab", procName, NULL);
1906 maxval = (1 << depth) - 1;
1908 nlevels = 1 << depth;
1909 for (i = 0; i < 256; i++) {
1910 for (j = 0; j < nlevels; j++) {
1911 thresh = 255 * (2 * j + 1) / (2 * nlevels - 2);
1913 quantval = maxval * j / (nlevels - 1);
1957 l_int32 i, j, n, jstart, ave, val;
1961 PROCNAME(
"makeGrayQuantTableArb");
1964 return ERROR_INT(
"&tab not defined", procName, 1);
1967 return ERROR_INT(
"&cmap not defined", procName, 1);
1970 return ERROR_INT(
"na not defined", procName, 1);
1972 if (n + 1 > (1 << outdepth))
1973 return ERROR_INT(
"more bins than cmap levels", procName, 1);
1976 return ERROR_INT(
"cmap not made", procName, 1);
1977 tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1983 for (i = 0; i < n; i++) {
1985 ave = (jstart + val) / 2;
1987 for (j = jstart; j < val; j++)
1993 ave = (jstart + 255) / 2;
1995 for (j = jstart; j < 256; j++)
2029 l_int32 i, j, index, w, h, d, nbins, wpl, factor, val;
2030 l_int32 *bincount, *binave, *binstart;
2031 l_uint32 *line, *data;
2033 PROCNAME(
"makeGrayQuantColormapArb");
2036 return ERROR_INT(
"&cmap not defined", procName, 1);
2039 return ERROR_INT(
"pixs not defined", procName, 1);
2042 return ERROR_INT(
"pixs not 8 bpp", procName, 1);
2044 return ERROR_INT(
"tab not defined", procName, 1);
2045 nbins = tab[255] + 1;
2046 if (nbins > (1 << outdepth))
2047 return ERROR_INT(
"more bins than cmap levels", procName, 1);
2050 if ((bincount = (l_int32 *)LEPT_CALLOC(nbins,
sizeof(l_int32))) == NULL)
2051 return ERROR_INT(
"calloc fail for bincount", procName, 1);
2052 if ((binave = (l_int32 *)LEPT_CALLOC(nbins,
sizeof(l_int32))) == NULL) {
2053 LEPT_FREE(bincount);
2054 return ERROR_INT(
"calloc fail for binave", procName, 1);
2056 factor = (l_int32)(sqrt((l_float64)(w * h) / 30000.) + 0.5);
2057 factor = L_MAX(1, factor);
2059 wpl = pixGetWpl(pixs);
2060 for (i = 0; i < h; i += factor) {
2061 line = data + i * wpl;
2062 for (j = 0; j < w; j += factor) {
2064 bincount[tab[val]]++;
2065 binave[tab[val]] += val;
2070 binstart = (l_int32 *)LEPT_CALLOC(nbins,
sizeof(l_int32));
2071 for (i = 1, index = 1; i < 256; i++) {
2072 if (tab[i] < index)
continue;
2073 if (tab[i] == index)
2074 binstart[index++] = i;
2080 for (i = 0; i < nbins; i++) {
2082 val = binave[i] / bincount[i];
2085 val = (binstart[i] + binstart[i + 1]) / 2;
2087 val = (binstart[i] + 255) / 2;
2092 LEPT_FREE(bincount);
2094 LEPT_FREE(binstart);
2136 l_int32 i, j, w, h, d, wpls, wpld;
2137 l_int32 rref, gref, bref, rval, gval, bval;
2138 l_int32 rmin, gmin, bmin, rmax, gmax, bmax;
2140 l_uint32 *datas, *datad, *lines, *lined;
2143 PROCNAME(
"pixGenerateMaskByBand32");
2146 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2149 return (
PIX *)ERROR_PTR(
"not 32 bpp", procName, NULL);
2150 if (delm < 0 || delp < 0)
2151 return (
PIX *)ERROR_PTR(
"delm and delp must be >= 0", procName, NULL);
2152 if (fractm < 0.0 || fractm > 1.0 || fractp < 0.0 || fractp > 1.0)
2153 return (
PIX *)ERROR_PTR(
"fractm and/or fractp invalid", procName, NULL);
2156 if (fractm == 0.0 && fractp == 0.0) {
2163 }
else if (delm == 0 && delp == 0) {
2164 rmin = (l_int32)((1.0 - fractm) * rref);
2165 gmin = (l_int32)((1.0 - fractm) * gref);
2166 bmin = (l_int32)((1.0 - fractm) * bref);
2167 rmax = rref + (l_int32)(fractp * (255 - rref));
2168 gmax = gref + (l_int32)(fractp * (255 - gref));
2169 bmax = bref + (l_int32)(fractp * (255 - bref));
2171 L_ERROR(
"bad input: either (delm, delp) or (fractm, fractp) " 2172 "must be 0\n", procName);
2177 pixCopyResolution(pixd, pixs);
2178 pixCopyInputFormat(pixd, pixs);
2180 wpls = pixGetWpl(pixs);
2182 wpld = pixGetWpl(pixd);
2183 for (i = 0; i < h; i++) {
2184 lines = datas + i * wpls;
2185 lined = datad + i * wpld;
2186 for (j = 0; j < w; j++) {
2188 rval = (pixel >> L_RED_SHIFT) & 0xff;
2189 if (rval < rmin || rval > rmax)
2191 gval = (pixel >> L_GREEN_SHIFT) & 0xff;
2192 if (gval < gmin || gval > gmax)
2194 bval = (pixel >> L_BLUE_SHIFT) & 0xff;
2195 if (bval < bmin || bval > bmax)
2232 l_int32 i, j, w, h, d, wpls, wpld;
2233 l_int32 rref1, gref1, bref1, rref2, gref2, bref2, rval, gval, bval;
2234 l_uint32 pixel, dist1, dist2;
2235 l_uint32 *datas, *datad, *lines, *lined;
2238 PROCNAME(
"pixGenerateMaskByDiscr32");
2241 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2244 return (
PIX *)ERROR_PTR(
"not 32 bpp", procName, NULL);
2246 return (
PIX *)ERROR_PTR(
"invalid distflag", procName, NULL);
2251 pixCopyResolution(pixd, pixs);
2252 pixCopyInputFormat(pixd, pixs);
2254 wpls = pixGetWpl(pixs);
2256 wpld = pixGetWpl(pixd);
2257 for (i = 0; i < h; i++) {
2258 lines = datas + i * wpls;
2259 lined = datad + i * wpld;
2260 for (j = 0; j < w; j++) {
2264 dist1 = L_ABS(rref1 - rval);
2265 dist2 = L_ABS(rref2 - rval);
2266 dist1 += L_ABS(gref1 - gval);
2267 dist2 += L_ABS(gref2 - gval);
2268 dist1 += L_ABS(bref1 - bval);
2269 dist2 += L_ABS(bref2 - bval);
2271 dist1 = (rref1 - rval) * (rref1 - rval);
2272 dist2 = (rref2 - rval) * (rref2 - rval);
2273 dist1 += (gref1 - gval) * (gref1 - gval);
2274 dist2 += (gref2 - gval) * (gref2 - gval);
2275 dist1 += (bref1 - bval) * (bref1 - bval);
2276 dist2 += (bref2 - bval) * (bref2 - bval);
2347 l_int32 w, h, wd, hd, wm, hm, wpls, wplm, wpld;
2348 l_int32 nc, nestim, i, j, vals, vald;
2350 l_uint32 *datas, *datam, *datad, *lines, *linem, *lined;
2355 PROCNAME(
"pixGrayQuantFromHisto");
2357 if (!pixs || pixGetDepth(pixs) != 8)
2358 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", procName, NULL);
2359 if (minfract < 0.01) {
2360 L_WARNING(
"minfract < 0.01; setting to 0.05\n", procName);
2364 L_WARNING(
"maxsize < 2; setting to 10\n", procName);
2367 if ((pixd && !pixm) || (!pixd && pixm))
2368 return (
PIX *)ERROR_PTR(
"(pixd,pixm) not defined together",
2372 if (pixGetDepth(pixm) != 1)
2373 return (
PIX *)ERROR_PTR(
"pixm not 1 bpp", procName, NULL);
2374 if ((cmap = pixGetColormap(pixd)) == NULL)
2375 return (
PIX *)ERROR_PTR(
"pixd not cmapped", procName, NULL);
2377 if (w != wd || h != hd)
2378 return (
PIX *)ERROR_PTR(
"pixs, pixd sizes differ", procName, NULL);
2380 nestim = nc + (l_int32)(1.5 * 255 / maxsize);
2381 fprintf(stderr,
"nestim = %d\n", nestim);
2383 L_ERROR(
"Estimate %d colors!\n", procName, nestim);
2384 return (
PIX *)ERROR_PTR(
"probably too many colors", procName, NULL);
2387 if (w != wm || h != hm) {
2388 L_WARNING(
"mask and dest sizes not equal\n", procName);
2401 pixCopyResolution(pixd, pixs);
2402 pixCopyInputFormat(pixd, pixs);
2410 L_ERROR(
"ran out of colors in cmap!\n", procName);
2416 wpls = pixGetWpl(pixs);
2417 wpld = pixGetWpl(pixd);
2419 for (i = 0; i < h; i++) {
2420 lines = datas + i * wpls;
2421 lined = datad + i * wpld;
2422 for (j = 0; j < w; j++) {
2433 wplm = pixGetWpl(pixmr);
2434 for (i = 0; i < h; i++) {
2435 lines = datas + i * wpls;
2436 linem = datam + i * wplm;
2437 lined = datad + i * wpld;
2438 for (j = 0; j < w; j++) {
2479 l_int32 mincount, index, sum, wtsum, span, istart, i, val, ret;
2480 l_int32 *iahisto, *lut;
2483 PROCNAME(
"numaFillCmapFromHisto");
2486 return ERROR_INT(
"&lut not defined", procName, 1);
2489 return ERROR_INT(
"na not defined", procName, 1);
2491 return ERROR_INT(
"cmap not defined", procName, 1);
2494 mincount = (l_int32)(minfract * total);
2496 lut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
2513 for (i = 0; i < 256; i++) {
2516 wtsum += i * iahisto[i];
2517 span = i - istart + 1;
2518 if (sum < mincount && span < maxsize)
2527 val = (l_int32)((l_float32)wtsum / (l_float32)sum + 0.5);
2534 if (istart < 256 && sum > 0) {
2535 span = 256 - istart;
2536 val = (l_int32)((l_float32)wtsum / (l_float32)sum + 0.5);
2568 l_int32 i, j, index, w, h, d, depth, wpls, wpld;
2569 l_int32 hascolor, vals, vald;
2571 l_uint32 *datas, *datad, *lines, *lined;
2575 PROCNAME(
"pixGrayQuantFromCmap");
2578 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2579 if (pixGetColormap(pixs) != NULL) {
2580 L_WARNING(
"pixs already has a colormap; returning a copy\n", procName);
2585 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
2587 return (
PIX *)ERROR_PTR(
"cmap not defined", procName, NULL);
2588 if (mindepth != 2 && mindepth != 4 && mindepth != 8)
2589 return (
PIX *)ERROR_PTR(
"invalid mindepth", procName, NULL);
2594 L_WARNING(
"Converting colormap colors to gray\n", procName);
2601 tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
2602 for (i = 0; i < 256; i++) {
2608 depth = L_MAX(depth, mindepth);
2611 pixCopyResolution(pixd, pixs);
2612 pixCopyInputFormat(pixd, pixs);
2615 wpls = pixGetWpl(pixs);
2616 wpld = pixGetWpl(pixd);
2617 for (i = 0; i < h; i++) {
2618 lines = datas + i * wpls;
2619 lined = datad + i * wpld;
2620 for (j = 0; j < w; j++) {
2625 else if (depth == 4)
2657 pixDitherToBinaryLUT(
PIX *pixs,
2661 l_int32 w, h, d, wplt, wpld;
2662 l_int32 *tabval, *tab38, *tab14;
2663 l_uint32 *datat, *datad;
2664 l_uint32 *bufs1, *bufs2;
2667 PROCNAME(
"pixDitherToBinaryLUT");
2670 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2673 return (
PIX *)ERROR_PTR(
"must be 8 bpp for dithering", procName, NULL);
2679 if ((pixd =
pixCreate(w, h, 1)) == NULL)
2680 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2681 pixCopyResolution(pixd, pixs);
2682 pixCopyInputFormat(pixd, pixs);
2684 wpld = pixGetWpl(pixd);
2689 wplt = pixGetWpl(pixt);
2692 bufs1 = (l_uint32 *)LEPT_CALLOC(wplt,
sizeof(l_uint32));
2693 bufs2 = (l_uint32 *)LEPT_CALLOC(wplt,
sizeof(l_uint32));
2694 if (!bufs1 || !bufs2) {
2699 return (
PIX *)ERROR_PTR(
"bufs1, bufs2 not both made", procName, NULL);
2703 make8To1DitherTables(&tabval, &tab38, &tab14, lowerclip, upperclip);
2705 ditherToBinaryLUTLow(datad, w, h, wpld, datat, wplt, bufs1, bufs2,
2706 tabval, tab38, tab14);
2731 ditherToBinaryLUTLow(l_uint32 *datad,
2747 memcpy(bufs2, datas, 4 * wpls);
2748 for (i = 0; i < h - 1; i++) {
2749 memcpy(bufs1, bufs2, 4 * wpls);
2750 memcpy(bufs2, datas + (i + 1) * wpls, 4 * wpls);
2751 lined = datad + i * wpld;
2752 ditherToBinaryLineLUTLow(lined, w, bufs1, bufs2,
2753 tabval, tab38, tab14, 0);
2757 memcpy(bufs1, bufs2, 4 * wpls);
2758 lined = datad + (h - 1) * wpld;
2759 ditherToBinaryLineLUTLow(lined, w, bufs1, bufs2, tabval, tab38, tab14, 1);
2777 ditherToBinaryLineLUTLow(l_uint32 *lined,
2784 l_int32 lastlineflag)
2787 l_int32 oval, tab38val, tab14val;
2788 l_uint8 rval, bval, dval;
2790 if (lastlineflag == 0) {
2791 for (j = 0; j < w - 1; j++) {
2798 tab38val = tab38[oval];
2801 tab14val = tab14[oval];
2803 rval = L_MAX(0, rval + tab38val);
2804 bval = L_MAX(0, bval + tab38val);
2805 dval = L_MAX(0, dval + tab14val);
2807 rval = L_MIN(255, rval + tab38val);
2808 bval = L_MIN(255, bval + tab38val);
2809 dval = L_MIN(255, dval + tab14val);
2821 tab38val = tab38[oval];
2823 bval = L_MAX(0, bval + tab38val);
2825 }
else if (tab38val > 0 ) {
2826 bval = L_MIN(255, bval + tab38val);
2830 for (j = 0; j < w - 1; j++) {
2835 tab38val = tab38[oval];
2839 rval = L_MAX(0, rval + tab38val);
2841 rval = L_MIN(255, rval + tab38val);
2866 make8To1DitherTables(l_int32 **ptabval,
2873 l_int32 *tabval, *tab38, *tab14;
2875 PROCNAME(
"make8To1DitherTables");
2877 if (ptabval) *ptabval = NULL;
2878 if (ptab38) *ptab38 = NULL;
2879 if (ptab14) *ptab14 = NULL;
2880 if (!ptabval || !ptab38 || !ptab14)
2881 return ERROR_INT(
"table ptrs not all defined", procName, 1);
2884 tabval = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
2885 tab38 = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
2886 tab14 = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
2887 if (!tabval || !tab38 || !tab14)
2888 return ERROR_INT(
"calloc failure to make small table", procName, 1);
2893 for (i = 0; i < 256; i++) {
2894 if (i <= lowerclip) {
2898 }
else if (i < 128) {
2900 tab38[i] = (3 * i + 4) / 8;
2901 tab14[i] = (i + 2) / 4;
2902 }
else if (i < 255 - upperclip) {
2904 tab38[i] = (3 * (i - 255) + 4) / 8;
2905 tab14[i] = ((i - 255) + 2) / 4;
l_ok numaGetSum(NUMA *na, l_float32 *psum)
numaGetSum()
static l_int32 makeGrayQuantColormapArb(PIX *pixs, l_int32 *tab, l_int32 outdepth, PIXCMAP **pcmap)
makeGrayQuantColormapArb()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
NUMA * pixGetGrayHistogramMasked(PIX *pixs, PIX *pixm, l_int32 x, l_int32 y, l_int32 factor)
pixGetGrayHistogramMasked()
static void ditherTo2bppLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_uint32 *bufs1, l_uint32 *bufs2, l_int32 *tabval, l_int32 *tab38, l_int32 *tab14)
ditherTo2bppLow()
NUMA * parseStringForNumbers(const char *str, const char *seps)
parseStringForNumbers()
static l_int32 make8To2DitherTables(l_int32 **ptabval, l_int32 **ptab38, l_int32 **ptab14, l_int32 cliptoblack, l_int32 cliptowhite)
make8To2DitherTables()
l_ok pixcmapGetMinDepth(PIXCMAP *cmap, l_int32 *pmindepth)
pixcmapGetMinDepth()
PIX * pixDitherToBinary(PIX *pixs)
pixDitherToBinary()
PIX * pixThresholdOn8bpp(PIX *pixs, l_int32 nlevels, l_int32 cmapflag)
pixThresholdOn8bpp()
PIX * pixGrayQuantFromHisto(PIX *pixd, PIX *pixs, PIX *pixm, l_float32 minfract, l_int32 maxsize)
pixGrayQuantFromHisto()
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()
NUMA * numaSort(NUMA *naout, NUMA *nain, l_int32 sortorder)
numaSort()
static l_int32 numaFillCmapFromHisto(NUMA *na, PIXCMAP *cmap, l_float32 minfract, l_int32 maxsize, l_int32 **plut)
numaFillCmapFromHisto()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
#define SET_DATA_QBIT(pdata, n, val)
PIX * pixThresholdGrayArb(PIX *pixs, const char *edgevals, l_int32 outdepth, l_int32 use_average, l_int32 setblack, l_int32 setwhite)
pixThresholdGrayArb()
void pixcmapDestroy(PIXCMAP **pcmap)
pixcmapDestroy()
l_int32 * makeGrayQuantIndexTable(l_int32 nlevels)
makeGrayQuantIndexTable()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixGenerateMaskByValue(PIX *pixs, l_int32 val, l_int32 usecmap)
pixGenerateMaskByValue()
PIX * pixGenerateMaskByBand(PIX *pixs, l_int32 lower, l_int32 upper, l_int32 inband, l_int32 usecmap)
pixGenerateMaskByBand()
PIX * pixThresholdToBinary(PIX *pixs, l_int32 thresh)
pixThresholdToBinary()
#define GET_DATA_BIT(pdata, n)
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
l_ok makeGrayQuantTableArb(NUMA *na, l_int32 outdepth, l_int32 **ptab, PIXCMAP **pcmap)
makeGrayQuantTableArb()
PIXCMAP * pixcmapCreateLinear(l_int32 d, l_int32 nlevels)
pixcmapCreateLinear()
l_ok pixSetColormap(PIX *pix, PIXCMAP *colormap)
pixSetColormap()
#define SET_DATA_DIBIT(pdata, n, val)
PIX * pixGenerateMaskByBand32(PIX *pixs, l_uint32 refval, l_int32 delm, l_int32 delp, l_float32 fractm, l_float32 fractp)
pixGenerateMaskByBand32()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
l_ok pixcmapGetNearestGrayIndex(PIXCMAP *cmap, l_int32 val, l_int32 *pindex)
pixcmapGetNearestGrayIndex()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
PIX * pixDitherTo2bppSpec(PIX *pixs, l_int32 lowerclip, l_int32 upperclip, l_int32 cmapflag)
pixDitherTo2bppSpec()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
PIXCMAP * pixcmapColorToGray(PIXCMAP *cmaps, l_float32 rwt, l_float32 gwt, l_float32 bwt)
pixcmapColorToGray()
static l_int32 * makeGrayQuantTargetTable(l_int32 nlevels, l_int32 depth)
makeGrayQuantTargetTable()
PIX * pixDitherTo2bpp(PIX *pixs, l_int32 cmapflag)
pixDitherTo2bpp()
static void thresholdTo2bppLow(l_uint32 *datad, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_int32 *tab)
thresholdTo2bppLow()
PIX * pixGenerateMaskByDiscr32(PIX *pixs, l_uint32 refval1, l_uint32 refval2, l_int32 distflag)
pixGenerateMaskByDiscr32()
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_QBIT(pdata, n)
static void thresholdToBinaryLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 d, l_int32 wpls, l_int32 thresh)
thresholdToBinaryLow()
l_ok pixcmapSetBlackAndWhite(PIXCMAP *cmap, l_int32 setblack, l_int32 setwhite)
pixcmapSetBlackAndWhite()
#define GET_DATA_BYTE(pdata, n)
void ditherToBinaryLineLow(l_uint32 *lined, l_int32 w, l_uint32 *bufs1, l_uint32 *bufs2, l_int32 lowerclip, l_int32 upperclip, l_int32 lastlineflag)
ditherToBinaryLineLow()
PIX * pixCreateNoInit(l_int32 width, l_int32 height, l_int32 depth)
pixCreateNoInit()
PIX * pixClone(PIX *pixs)
pixClone()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixcmapHasColor(PIXCMAP *cmap, l_int32 *pcolor)
pixcmapHasColor()
static void ditherTo2bppLineLow(l_uint32 *lined, l_int32 w, l_uint32 *bufs1, l_uint32 *bufs2, l_int32 *tabval, l_int32 *tab38, l_int32 *tab14, l_int32 lastlineflag)
ditherTo2bppLineLow()
PIX * pixGrayQuantFromCmap(PIX *pixs, PIXCMAP *cmap, l_int32 mindepth)
pixGrayQuantFromCmap()
void numaDestroy(NUMA **pna)
numaDestroy()
PIX * pixAdaptThresholdToBinaryGen(PIX *pixs, PIX *pixm, l_float32 gamma, l_int32 blackval, l_int32 whiteval, l_int32 thresh)
pixAdaptThresholdToBinaryGen()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixAdaptThresholdToBinary(PIX *pixs, PIX *pixm, l_float32 gamma)
pixAdaptThresholdToBinary()
PIX * pixDitherToBinarySpec(PIX *pixs, l_int32 lowerclip, l_int32 upperclip)
pixDitherToBinarySpec()
#define GET_DATA_DIBIT(pdata, n)
PIX * pixThresholdTo4bpp(PIX *pixs, l_int32 nlevels, l_int32 cmapflag)
pixThresholdTo4bpp()
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
PIX * pixBackgroundNormSimple(PIX *pixs, PIX *pixim, PIX *pixg)
pixBackgroundNormSimple()
static void ditherToBinaryLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_uint32 *bufs1, l_uint32 *bufs2, l_int32 lowerclip, l_int32 upperclip)
ditherToBinaryLow()
PIX * pixThresholdTo2bpp(PIX *pixs, l_int32 nlevels, l_int32 cmapflag)
pixThresholdTo2bpp()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixGammaTRC(PIX *pixd, PIX *pixs, l_float32 gamma, l_int32 minval, l_int32 maxval)
pixGammaTRC()
static void thresholdTo4bppLow(l_uint32 *datad, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_int32 *tab)
thresholdTo4bppLow()
PIXCMAP * pixcmapCopy(PIXCMAP *cmaps)
pixcmapCopy()
l_int32 pixSizesEqual(const PIX *pix1, const PIX *pix2)
pixSizesEqual()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
PIX * pixVarThresholdToBinary(PIX *pixs, PIX *pixg)
pixVarThresholdToBinary()
#define SET_DATA_TWO_BYTES(pdata, n, val)
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
#define SET_DATA_BIT(pdata, n)