168 #include <config_auto.h> 172 #include "allheaders.h" 182 l_uint32 *datam, l_int32 hm, l_int32 wplm,
183 l_int32 connectivity);
185 l_int32 wpls, l_uint32 *datam, l_int32 wplm,
186 l_int32 connectivity);
188 l_int32 wpls, l_uint32 *datam, l_int32 wplm,
189 l_int32 connectivity);
191 l_int32 wpls, l_uint32 *datam, l_int32 wplm,
192 l_int32 connectivity);
194 l_int32 wpls, l_uint32 *datam,
195 l_int32 wplm, l_int32 connectivity);
197 l_int32 d, l_int32 wpld, l_int32 connectivity);
198 static void seedspreadLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld,
199 l_uint32 *datat, l_int32 wplt, l_int32 connectivity);
204 #ifndef NO_CONSOLE_IO 205 #define DEBUG_PRINT_ITERS 0 209 static const l_int32 MaxIters = 40;
250 l_int32 connectivity)
253 l_int32 hd, hm, wpld, wplm;
254 l_uint32 *datad, *datam;
257 PROCNAME(
"pixSeedfillBinary");
259 if (!pixs || pixGetDepth(pixs) != 1)
260 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, pixd);
261 if (!pixm || pixGetDepth(pixm) != 1)
262 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, pixd);
263 if (connectivity != 4 && connectivity != 8)
264 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", procName, pixd);
267 if ((pixd =
pixCopy(pixd, pixs)) == NULL)
268 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
274 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
276 hd = pixGetHeight(pixd);
277 hm = pixGetHeight(pixm);
280 wpld = pixGetWpl(pixd);
281 wplm = pixGetWpl(pixm);
284 for (i = 0; i < MaxIters; i++) {
289 #if DEBUG_PRINT_ITERS 290 lept_stderr(
"Binary seed fill converged: %d iters\n", i + 1);
338 l_int32 connectivity,
345 PROCNAME(
"pixSeedfillBinaryRestricted");
347 if (!pixs || pixGetDepth(pixs) != 1)
348 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, pixd);
349 if (!pixm || pixGetDepth(pixm) != 1)
350 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, pixd);
351 if (connectivity != 4 && connectivity != 8)
352 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", procName, pixd);
353 if (xmax == 0 && ymax == 0)
355 if (xmax < 0 || ymax < 0) {
356 L_ERROR(
"xmax and ymax must be non-negative", procName);
362 return (
PIX *)ERROR_PTR(
"pix1 not made", procName, pixd);
409 l_int32 connectivity)
411 l_int32 i, j, h, wpl;
413 l_uint32 wordabove, wordleft, wordbelow, wordright;
415 l_uint32 *lines, *linem;
417 PROCNAME(
"seedfillBinaryLow");
420 wpl = L_MIN(wpls, wplm);
422 switch (connectivity)
426 for (i = 0; i < h; i++) {
427 lines = datas + i * wpls;
428 linem = datam + i * wplm;
429 for (j = 0; j < wpl; j++) {
435 wordabove = *(lines - wpls + j);
439 wordleft = *(lines + j - 1);
440 word |= wordleft << 31;
445 if (!word || !(~word)) {
452 word = (word | (word >> 1) | (word << 1)) & mask;
453 if ((word ^ wordprev) == 0) {
462 for (i = h - 1; i >= 0; i--) {
463 lines = datas + i * wpls;
464 linem = datam + i * wplm;
465 for (j = wpl - 1; j >= 0; j--) {
471 wordbelow = *(lines + wpls + j);
475 wordright = *(lines + j + 1);
476 word |= wordright >> 31;
481 if (!word || !(~word)) {
488 word = (word | (word >> 1) | (word << 1)) & mask;
489 if ((word ^ wordprev) == 0) {
500 for (i = 0; i < h; i++) {
501 lines = datas + i * wpls;
502 linem = datam + i * wplm;
503 for (j = 0; j < wpl; j++) {
509 wordabove = *(lines - wpls + j);
510 word |= (wordabove | (wordabove << 1) | (wordabove >> 1));
512 word |= (*(lines - wpls + j - 1)) << 31;
514 word |= (*(lines - wpls + j + 1)) >> 31;
517 wordleft = *(lines + j - 1);
518 word |= wordleft << 31;
523 if (!word || !(~word)) {
530 word = (word | (word >> 1) | (word << 1)) & mask;
531 if ((word ^ wordprev) == 0) {
540 for (i = h - 1; i >= 0; i--) {
541 lines = datas + i * wpls;
542 linem = datam + i * wplm;
543 for (j = wpl - 1; j >= 0; j--) {
549 wordbelow = *(lines + wpls + j);
550 word |= (wordbelow | (wordbelow << 1) | (wordbelow >> 1));
552 word |= (*(lines + wpls + j - 1)) << 31;
554 word |= (*(lines + wpls + j + 1)) >> 31;
557 wordright = *(lines + j + 1);
558 word |= wordright >> 31;
563 if (!word || !(~word)) {
570 word = (word | (word >> 1) | (word << 1)) & mask;
571 if ((word ^ wordprev) == 0) {
581 L_ERROR(
"connectivity must be 4 or 8\n", procName);
610 l_int32 connectivity)
614 PROCNAME(
"pixHolesByFilling");
616 if (!pixs || pixGetDepth(pixs) != 1)
617 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
618 if (connectivity != 4 && connectivity != 8)
619 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
622 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
623 if ((pixsi =
pixInvert(NULL, pixs)) == NULL) {
625 return (
PIX *)ERROR_PTR(
"pixsi not made", procName, NULL);
630 pixOr(pixd, pixd, pixs);
661 l_int32 connectivity)
665 PROCNAME(
"pixFillClosedBorders");
667 if (!pixs || pixGetDepth(pixs) != 1)
668 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
669 if (connectivity != 4 && connectivity != 8)
670 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
673 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
676 if ((pixsi =
pixInvert(NULL, pixs)) == NULL) {
678 return (
PIX *)ERROR_PTR(
"pixsi not made", procName, NULL);
699 l_int32 connectivity)
703 PROCNAME(
"pixExtractBorderConnComps");
705 if (!pixs || pixGetDepth(pixs) != 1)
706 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
707 if (connectivity != 4 && connectivity != 8)
708 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
712 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
738 l_int32 connectivity)
742 PROCNAME(
"pixRemoveBorderConnComps");
744 if (!pixs || pixGetDepth(pixs) != 1)
745 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
746 if (connectivity != 4 && connectivity != 8)
747 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
788 l_int32 connectivity)
792 PROCNAME(
"pixFillBgFromBorder");
794 if (!pixs || pixGetDepth(pixs) != 1)
795 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
796 if (connectivity != 4 && connectivity != 8)
797 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
806 pixOr(pixd, pixd, pixs);
850 l_float32 minfgfract)
852 l_int32 i, x, y, w, h, n, nfg, nh, ntot, area;
857 PIX *pixd, *pixfg, *pixh;
860 PROCNAME(
"pixFillHolesToBoundingRect");
862 if (!pixs || pixGetDepth(pixs) != 1)
863 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
864 maxhfract = L_MIN(L_MAX(maxhfract, 0.0), 1.0);
865 minfgfract = L_MIN(L_MAX(minfgfract, 0.0), 1.0);
871 for (i = 0; i < n; i++) {
880 hfract = (l_float32)nh / (l_float32)nfg;
882 if (hfract <= maxhfract)
884 fgfract = (l_float32)ntot / (l_float32)area;
885 if (fgfract >= minfgfract) {
888 }
else if (hfract <= maxhfract) {
931 l_int32 connectivity)
933 l_int32 h, w, wpls, wplm;
934 l_uint32 *datas, *datam;
936 PROCNAME(
"pixSeedfillGray");
938 if (!pixs || pixGetDepth(pixs) != 8)
939 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
940 if (!pixm || pixGetDepth(pixm) != 8)
941 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
942 if (connectivity != 4 && connectivity != 8)
943 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
947 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
951 wpls = pixGetWpl(pixs);
952 wplm = pixGetWpl(pixm);
990 l_int32 connectivity)
992 l_int32 h, w, wpls, wplm;
993 l_uint32 *datas, *datam;
995 PROCNAME(
"pixSeedfillGrayInv");
997 if (!pixs || pixGetDepth(pixs) != 8)
998 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
999 if (!pixm || pixGetDepth(pixm) != 8)
1000 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
1001 if (connectivity != 4 && connectivity != 8)
1002 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
1006 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
1010 wpls = pixGetWpl(pixs);
1011 wplm = pixGetWpl(pixm);
1071 l_int32 connectivity)
1073 l_uint8 val1, val2, val3, val4, val5, val6, val7, val8;
1074 l_uint8 val, maxval, maskval, boolval;
1075 l_int32 i, j, imax, jmax, queue_size;
1076 l_uint32 *lines, *linem;
1080 PROCNAME(
"seedfillGrayLow");
1082 if (connectivity != 4 && connectivity != 8) {
1083 L_ERROR(
"connectivity must be 4 or 8\n", procName);
1096 switch (connectivity)
1105 for (i = 0; i < h; i++) {
1106 lines = datas + i * wpls;
1107 linem = datam + i * wplm;
1108 for (j = 0; j < w; j++) {
1115 maxval = L_MAX(maxval, val4);
1118 maxval = L_MAX(maxval, val);
1119 val = L_MIN(maxval, maskval);
1129 for (i = imax; i >= 0; i--) {
1130 lines = datas + i * wpls;
1131 linem = datam + i * wplm;
1132 for (j = jmax; j >= 0; j--) {
1140 maxval = L_MAX(maxval, val5);
1143 maxval = L_MAX(maxval, val);
1144 val = L_MIN(maxval, maskval);
1161 if (!boolval && (val5 < val) &&
1187 while (queue_size) {
1192 lines = datas + i * wpls;
1193 linem = datam + i * wplm;
1199 if (val > val2 && val2 != maskval) {
1211 if (val > val4 && val4 != maskval) {
1222 if (val > val7 && val7 != maskval) {
1233 if (val > val5 && val5 != maskval) {
1254 for (i = 0; i < h; i++) {
1255 lines = datas + i * wpls;
1256 linem = datam + i * wplm;
1257 for (j = 0; j < w; j++) {
1265 maxval = L_MAX(maxval, val3);
1268 maxval = L_MAX(maxval, val2);
1272 maxval = L_MAX(maxval, val4);
1275 maxval = L_MAX(maxval, val);
1276 val = L_MIN(maxval, maskval);
1286 for (i = imax; i >= 0; i--) {
1287 lines = datas + i * wpls;
1288 linem = datam + i * wplm;
1289 for (j = jmax; j >= 0; j--) {
1299 maxval = L_MAX(maxval, val8);
1302 maxval = L_MAX(maxval, val7);
1306 maxval = L_MAX(maxval, val5);
1309 maxval = L_MAX(maxval, val);
1310 val = L_MIN(maxval, maskval);
1327 if (!boolval && (val8 < val) &&
1333 if (!boolval && (val7 < val) &&
1340 if (!boolval && (val5 < val) &&
1366 while (queue_size) {
1371 lines = datas + i * wpls;
1372 linem = datam + i * wplm;
1379 if (val > val1 && val1 != maskval) {
1381 L_MIN(val, maskval));
1391 if (val > val3 && val3 != maskval) {
1393 L_MIN(val, maskval));
1402 if (val > val2 && val2 != maskval) {
1414 if (val > val4 && val4 != maskval) {
1426 if (val > val6 && val6 != maskval) {
1428 L_MIN(val, maskval));
1438 if (val > val8 && val8 != maskval) {
1440 L_MIN(val, maskval));
1449 if (val > val7 && val7 != maskval) {
1460 if (val > val5 && val5 != maskval) {
1475 L_ERROR(
"shouldn't get here!\n", procName);
1522 l_int32 connectivity)
1524 l_uint8 val1, val2, val3, val4, val5, val6, val7, val8;
1525 l_uint8 val, maxval, maskval, boolval;
1526 l_int32 i, j, imax, jmax, queue_size;
1527 l_uint32 *lines, *linem;
1531 PROCNAME(
"seedfillGrayInvLow");
1533 if (connectivity != 4 && connectivity != 8) {
1534 L_ERROR(
"connectivity must be 4 or 8\n", procName);
1547 switch (connectivity)
1558 for (i = 0; i < h; i++) {
1559 lines = datas + i * wpls;
1560 linem = datam + i * wplm;
1561 for (j = 0; j < w; j++) {
1566 maxval = L_MAX(maxval, val2);
1570 maxval = L_MAX(maxval, val4);
1572 if (maxval > maskval)
1586 for (i = imax; i >= 0; i--) {
1587 lines = datas + i * wpls;
1588 linem = datam + i * wplm;
1589 for (j = jmax; j >= 0; j--) {
1595 maxval = L_MAX(maxval, val7);
1599 maxval = L_MAX(maxval, val5);
1601 if (maxval > maskval)
1619 if (!boolval && (val5 < val) &&
1645 while (queue_size) {
1650 lines = datas + i * wpls;
1651 linem = datam + i * wplm;
1657 if (val > val2 && val > maskval) {
1669 if (val > val4 && val > maskval) {
1680 if (val > val7 && val > maskval) {
1691 if (val > val5 && val > maskval) {
1714 for (i = 0; i < h; i++) {
1715 lines = datas + i * wpls;
1716 linem = datam + i * wplm;
1717 for (j = 0; j < w; j++) {
1723 maxval = L_MAX(maxval, val1);
1727 maxval = L_MAX(maxval, val3);
1730 maxval = L_MAX(maxval, val2);
1734 maxval = L_MAX(maxval, val4);
1736 if (maxval > maskval)
1750 for (i = imax; i >= 0; i--) {
1751 lines = datas + i * wpls;
1752 linem = datam + i * wplm;
1753 for (j = jmax; j >= 0; j--) {
1760 maxval = L_MAX(maxval, val6);
1764 maxval = L_MAX(maxval, val8);
1767 maxval = L_MAX(maxval, val7);
1771 maxval = L_MAX(maxval, val5);
1773 if (maxval > maskval)
1792 if (!boolval && (val8 < val) &&
1798 if (!boolval && (val7 < val) &&
1805 if (!boolval && (val5 < val) &&
1831 while (queue_size) {
1836 lines = datas + i * wpls;
1837 linem = datam + i * wplm;
1844 if (val > val1 && val > maskval) {
1855 if (val > val3 && val > maskval) {
1865 if (val > val2 && val > maskval) {
1877 if (val > val4 && val > maskval) {
1889 if (val > val6 && val > maskval) {
1900 if (val > val8 && val > maskval) {
1910 if (val > val7 && val > maskval) {
1921 if (val > val5 && val > maskval) {
1936 L_ERROR(
"shouldn't get here!\n", procName);
1973 l_int32 connectivity)
1975 l_int32 i, h, w, wpls, wplm, boolval;
1976 l_uint32 *datas, *datam;
1979 PROCNAME(
"pixSeedfillGraySimple");
1981 if (!pixs || pixGetDepth(pixs) != 8)
1982 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
1983 if (!pixm || pixGetDepth(pixm) != 8)
1984 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
1985 if (connectivity != 4 && connectivity != 8)
1986 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
1990 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
1994 return ERROR_INT(
"pixt not made", procName, 1);
1998 wpls = pixGetWpl(pixs);
1999 wplm = pixGetWpl(pixm);
2001 for (i = 0; i < MaxIters; i++) {
2006 #if DEBUG_PRINT_ITERS 2007 L_INFO(
"Gray seed fill converged: %d iters\n", procName, i + 1);
2044 l_int32 connectivity)
2046 l_int32 i, h, w, wpls, wplm, boolval;
2047 l_uint32 *datas, *datam;
2050 PROCNAME(
"pixSeedfillGrayInvSimple");
2052 if (!pixs || pixGetDepth(pixs) != 8)
2053 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
2054 if (!pixm || pixGetDepth(pixm) != 8)
2055 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
2056 if (connectivity != 4 && connectivity != 8)
2057 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
2061 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
2065 return ERROR_INT(
"pixt not made", procName, 1);
2069 wpls = pixGetWpl(pixs);
2070 wplm = pixGetWpl(pixm);
2072 for (i = 0; i < MaxIters; i++) {
2077 #if DEBUG_PRINT_ITERS 2078 L_INFO(
"Gray seed fill converged: %d iters\n", procName, i + 1);
2129 l_int32 connectivity)
2131 l_uint8 val2, val3, val4, val5, val7, val8;
2132 l_uint8 val, maxval, maskval;
2133 l_int32 i, j, imax, jmax;
2134 l_uint32 *lines, *linem;
2136 PROCNAME(
"seedfillGrayLowSimple");
2141 switch (connectivity)
2145 for (i = 0; i < h; i++) {
2146 lines = datas + i * wpls;
2147 linem = datam + i * wplm;
2148 for (j = 0; j < w; j++) {
2155 maxval = L_MAX(maxval, val4);
2158 maxval = L_MAX(maxval, val);
2159 val = L_MIN(maxval, maskval);
2166 for (i = imax; i >= 0; i--) {
2167 lines = datas + i * wpls;
2168 linem = datam + i * wplm;
2169 for (j = jmax; j >= 0; j--) {
2176 maxval = L_MAX(maxval, val5);
2179 maxval = L_MAX(maxval, val);
2180 val = L_MIN(maxval, maskval);
2189 for (i = 0; i < h; i++) {
2190 lines = datas + i * wpls;
2191 linem = datam + i * wplm;
2192 for (j = 0; j < w; j++) {
2200 maxval = L_MAX(maxval, val2);
2203 maxval = L_MAX(maxval, val3);
2207 maxval = L_MAX(maxval, val4);
2210 maxval = L_MAX(maxval, val);
2211 val = L_MIN(maxval, maskval);
2218 for (i = imax; i >= 0; i--) {
2219 lines = datas + i * wpls;
2220 linem = datam + i * wplm;
2221 for (j = jmax; j >= 0; j--) {
2229 maxval = L_MAX(maxval, val8);
2232 maxval = L_MAX(maxval, val7);
2236 maxval = L_MAX(maxval, val5);
2239 maxval = L_MAX(maxval, val);
2240 val = L_MIN(maxval, maskval);
2248 L_ERROR(
"connectivity must be 4 or 8\n", procName);
2285 l_int32 connectivity)
2287 l_uint8 val1, val2, val3, val4, val5, val6, val7, val8;
2288 l_uint8 maxval, maskval;
2289 l_int32 i, j, imax, jmax;
2290 l_uint32 *lines, *linem;
2292 PROCNAME(
"seedfillGrayInvLowSimple");
2297 switch (connectivity)
2301 for (i = 0; i < h; i++) {
2302 lines = datas + i * wpls;
2303 linem = datam + i * wplm;
2304 for (j = 0; j < w; j++) {
2309 maxval = L_MAX(maxval, val2);
2313 maxval = L_MAX(maxval, val4);
2315 if (maxval > maskval)
2322 for (i = imax; i >= 0; i--) {
2323 lines = datas + i * wpls;
2324 linem = datam + i * wplm;
2325 for (j = jmax; j >= 0; j--) {
2330 maxval = L_MAX(maxval, val7);
2334 maxval = L_MAX(maxval, val5);
2336 if (maxval > maskval)
2345 for (i = 0; i < h; i++) {
2346 lines = datas + i * wpls;
2347 linem = datam + i * wplm;
2348 for (j = 0; j < w; j++) {
2354 maxval = L_MAX(maxval, val1);
2358 maxval = L_MAX(maxval, val2);
2361 maxval = L_MAX(maxval, val3);
2365 maxval = L_MAX(maxval, val4);
2367 if (maxval > maskval)
2374 for (i = imax; i >= 0; i--) {
2375 lines = datas + i * wpls;
2376 linem = datam + i * wplm;
2377 for (j = jmax; j >= 0; j--) {
2383 maxval = L_MAX(maxval, val6);
2387 maxval = L_MAX(maxval, val8);
2390 maxval = L_MAX(maxval, val7);
2394 maxval = L_MAX(maxval, val5);
2396 if (maxval > maskval)
2404 L_ERROR(
"connectivity must be 4 or 8\n", procName);
2447 l_int32 connectivity)
2449 PIX *pixbi, *pixmi, *pixsd;
2451 PROCNAME(
"pixSeedfillGrayBasin");
2453 if (!pixb || pixGetDepth(pixb) != 1)
2454 return (
PIX *)ERROR_PTR(
"pixb undefined or not 1 bpp", procName, NULL);
2455 if (!pixm || pixGetDepth(pixm) != 8)
2456 return (
PIX *)ERROR_PTR(
"pixm undefined or not 8 bpp", procName, NULL);
2457 if (connectivity != 4 && connectivity != 8)
2458 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", procName, NULL);
2461 L_WARNING(
"delta <= 0; returning a copy of pixm\n", procName);
2536 l_int32 connectivity,
2544 PROCNAME(
"pixDistanceFunction");
2546 if (!pixs || pixGetDepth(pixs) != 1)
2547 return (
PIX *)ERROR_PTR(
"!pixs or pixs not 1 bpp", procName, NULL);
2548 if (connectivity != 4 && connectivity != 8)
2549 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
2550 if (outdepth != 8 && outdepth != 16)
2551 return (
PIX *)ERROR_PTR(
"outdepth not 8 or 16 bpp", procName, NULL);
2552 if (boundcond != L_BOUNDARY_BG && boundcond != L_BOUNDARY_FG)
2553 return (
PIX *)ERROR_PTR(
"invalid boundcond", procName, NULL);
2556 if ((pixd =
pixCreate(w, h, outdepth)) == NULL)
2557 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2559 wpld = pixGetWpl(pixd);
2564 if (boundcond == L_BOUNDARY_BG) {
2591 l_int32 connectivity)
2593 l_int32 val1, val2, val3, val4, val5, val6, val7, val8, minval, val;
2594 l_int32 i, j, imax, jmax;
2597 PROCNAME(
"distanceFunctionLow");
2604 switch (connectivity)
2609 for (i = 1; i < imax; i++) {
2610 lined = datad + i * wpld;
2611 for (j = 1; j < jmax; j++) {
2615 minval = L_MIN(val2, val4);
2616 minval = L_MIN(minval, 254);
2623 for (i = imax - 1; i > 0; i--) {
2624 lined = datad + i * wpld;
2625 for (j = jmax - 1; j > 0; j--) {
2629 minval = L_MIN(val5, val7);
2630 minval = L_MIN(minval + 1, val);
2637 for (i = 1; i < imax; i++) {
2638 lined = datad + i * wpld;
2639 for (j = 1; j < jmax; j++) {
2643 minval = L_MIN(val2, val4);
2644 minval = L_MIN(minval, 0xfffe);
2651 for (i = imax - 1; i > 0; i--) {
2652 lined = datad + i * wpld;
2653 for (j = jmax - 1; j > 0; j--) {
2657 minval = L_MIN(val5, val7);
2658 minval = L_MIN(minval + 1, val);
2669 for (i = 1; i < imax; i++) {
2670 lined = datad + i * wpld;
2671 for (j = 1; j < jmax; j++) {
2677 minval = L_MIN(val1, val2);
2678 minval = L_MIN(minval, val3);
2679 minval = L_MIN(minval, val4);
2680 minval = L_MIN(minval, 254);
2687 for (i = imax - 1; i > 0; i--) {
2688 lined = datad + i * wpld;
2689 for (j = jmax - 1; j > 0; j--) {
2695 minval = L_MIN(val8, val7);
2696 minval = L_MIN(minval, val6);
2697 minval = L_MIN(minval, val5);
2698 minval = L_MIN(minval + 1, val);
2705 for (i = 1; i < imax; i++) {
2706 lined = datad + i * wpld;
2707 for (j = 1; j < jmax; j++) {
2713 minval = L_MIN(val1, val2);
2714 minval = L_MIN(minval, val3);
2715 minval = L_MIN(minval, val4);
2716 minval = L_MIN(minval, 0xfffe);
2723 for (i = imax - 1; i > 0; i--) {
2724 lined = datad + i * wpld;
2725 for (j = jmax - 1; j > 0; j--) {
2731 minval = L_MIN(val8, val7);
2732 minval = L_MIN(minval, val6);
2733 minval = L_MIN(minval, val5);
2734 minval = L_MIN(minval + 1, val);
2743 L_ERROR(
"connectivity must be 4 or 8\n", procName);
2793 l_int32 connectivity)
2795 l_int32 w, h, wplt, wplg;
2796 l_uint32 *datat, *datag;
2797 PIX *pixm, *pixt, *pixg, *pixd;
2799 PROCNAME(
"pixSeedspread");
2801 if (!pixs || pixGetDepth(pixs) != 8)
2802 return (
PIX *)ERROR_PTR(
"!pixs or pixs not 8 bpp", procName, NULL);
2803 if (connectivity != 4 && connectivity != 8)
2804 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
2825 wplt = pixGetWpl(pixt);
2829 wplg = pixGetWpl(pixg);
2830 seedspreadLow(datag, w, h, wplg, datat, wplt, connectivity);
2852 l_int32 connectivity)
2854 l_int32 val1t, val2t, val3t, val4t, val5t, val6t, val7t, val8t;
2855 l_int32 i, j, imax, jmax, minval, valt, vald;
2856 l_uint32 *linet, *lined;
2858 PROCNAME(
"seedspreadLow");
2867 switch (connectivity)
2871 for (i = 1; i < h; i++) {
2872 linet = datat + i * wplt;
2873 lined = datad + i * wpld;
2874 for (j = 1; j < jmax; j++) {
2878 minval = L_MIN(val2t, val4t);
2879 minval = L_MIN(minval, 0xfffe);
2891 for (i = imax - 1; i > 0; i--) {
2892 linet = datat + i * wplt;
2893 lined = datad + i * wpld;
2894 for (j = jmax - 1; j > 0; j--) {
2898 minval = L_MIN(val5t, val7t);
2899 minval = L_MIN(minval + 1, valt);
2900 if (valt > minval) {
2914 for (i = 1; i < h; i++) {
2915 linet = datat + i * wplt;
2916 lined = datad + i * wpld;
2917 for (j = 1; j < jmax; j++) {
2923 minval = L_MIN(val1t, val2t);
2924 minval = L_MIN(minval, val3t);
2925 minval = L_MIN(minval, val4t);
2926 minval = L_MIN(minval, 0xfffe);
2928 if (minval == val1t)
2930 else if (minval == val2t)
2932 else if (minval == val3t)
2942 for (i = imax - 1; i > 0; i--) {
2943 linet = datat + i * wplt;
2944 lined = datad + i * wpld;
2945 for (j = jmax - 1; j > 0; j--) {
2951 minval = L_MIN(val8t, val7t);
2952 minval = L_MIN(minval, val6t);
2953 minval = L_MIN(minval, val5t);
2954 minval = L_MIN(minval + 1, valt);
2955 if (valt > minval) {
2957 if (minval == val5t + 1)
2959 else if (minval == val6t + 1)
2961 else if (minval == val7t + 1)
2972 L_ERROR(
"connectivity must be 4 or 8\n", procName);
3025 PIX *pixmin, *pixmax, *pixt1, *pixt2;
3027 PROCNAME(
"pixLocalExtrema");
3029 if (!pixs || pixGetDepth(pixs) != 8)
3030 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
3031 if (!ppixmin && !ppixmax)
3032 return ERROR_INT(
"neither &pixmin, &pixmax are defined", procName, 1);
3033 if (maxmin <= 0) maxmin = 254;
3034 if (minmax <= 0) minmax = 1;
3087 l_int32 n, i, j, k, x, y, w, h, xc, yc, wc, hc, xon, yon;
3088 l_int32 vals, wpls, wplc, ismin;
3090 l_uint32 *datas, *datac, *lines, *linec;
3092 PIX *pix1, *pix2, *pix3;
3095 PROCNAME(
"pixQualifyLocalMinima");
3097 if (!pixs || pixGetDepth(pixs) != 8)
3098 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
3099 if (!pixm || pixGetDepth(pixm) != 1)
3100 return ERROR_INT(
"pixm not defined or not 1 bpp", procName, 1);
3101 if (maxval <= 0) maxval = 254;
3105 wpls = pixGetWpl(pixs);
3108 for (k = 0; k < n; k++) {
3113 pixXor(pix3, pix3, pix2);
3115 wplc = pixGetWpl(pix3);
3130 for (i = 0, y = yc - 1; i < hc + 2 && y >= 0 && y < h; i++, y++) {
3131 lines = datas + y * wpls;
3132 linec = datac + i * wplc;
3133 for (j = 0, x = xc - 1; j < wc + 2 && x >= 0 && x < w; j++, x++) {
3196 PIX *pixmin, *pixmax, *pixt, *pixtmin, *pixtmax;
3198 PROCNAME(
"pixSelectedLocalExtrema");
3200 if (!pixs || pixGetDepth(pixs) != 8)
3201 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
3202 if (!ppixmin || !ppixmax)
3203 return ERROR_INT(
"&pixmin and &pixmax not both defined", procName, 1);
3217 }
else if (mindist == 0) {
3218 pixt =
pixAnd(NULL, pixmin, pixmax);
3224 2 * mindist + 1, 2 * mindist + 1);
3226 2 * mindist + 1, 2 * mindist + 1);
3254 l_int32 w1, h1, w2, h2, w, h;
3255 l_int32 i, j, val1, val2, wpls1, wpls2, wpld;
3256 l_uint32 *datas1, *datas2, *datad, *lines1, *lines2, *lined;
3259 PROCNAME(
"pixFindEqualValues");
3261 if (!pixs1 || pixGetDepth(pixs1) != 8)
3262 return (
PIX *)ERROR_PTR(
"pixs1 undefined or not 8 bpp", procName, NULL);
3263 if (!pixs2 || pixGetDepth(pixs2) != 8)
3264 return (
PIX *)ERROR_PTR(
"pixs2 undefined or not 8 bpp", procName, NULL);
3273 wpls1 = pixGetWpl(pixs1);
3274 wpls2 = pixGetWpl(pixs2);
3275 wpld = pixGetWpl(pixd);
3277 for (i = 0; i < h; i++) {
3278 lines1 = datas1 + i * wpls1;
3279 lines2 = datas2 + i * wpls2;
3280 lined = datad + i * wpld;
3281 for (j = 0; j < w; j++) {
3323 l_int32 bx, by, bw, bh, i, j, c, n;
3324 l_int32 xs, ys, minx, miny, wpls, wplt, val, minval;
3325 l_uint32 *datas, *datat, *lines, *linet;
3328 PIX *pixt, *pixs2, *pixm2;
3332 PROCNAME(
"pixSelectMinInConnComp");
3335 return ERROR_INT(
"&pta not defined", procName, 1);
3337 if (pnav) *pnav = NULL;
3338 if (!pixs || pixGetDepth(pixs) != 8)
3339 return ERROR_INT(
"pixs undefined or not 8 bpp", procName, 1);
3340 if (!pixm || pixGetDepth(pixm) != 1)
3341 return ERROR_INT(
"pixm undefined or not 1 bpp", procName, 1);
3347 return ERROR_INT(
"cropping failure", procName, 1);
3357 wpls = pixGetWpl(pixs2);
3358 for (c = 0; c < n; c++) {
3361 if (bw == 1 && bh == 1) {
3368 wplt = pixGetWpl(pixt);
3369 minx = miny = 1000000;
3371 for (i = 0; i < bh; i++) {
3373 lines = datas + ys * wpls;
3374 linet = datat + i * wplt;
3375 for (j = 0; j < bw; j++) {
3434 l_int32 connectivity,
3439 PROCNAME(
"pixRemoveSeededComponents");
3441 if (!pixs || pixGetDepth(pixs) != 1)
3442 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, pixd);
3443 if (!pixm || pixGetDepth(pixm) != 1)
3444 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, pixd);
3445 if (pixd && pixd != pixm)
3446 return (
PIX *)ERROR_PTR(
"operation not inplace", procName, pixd);
3450 pixd =
pixXor(pixd, pixm, pixt);
static void seedspreadLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datat, l_int32 wplt, l_int32 connectivity)
seedspreadLow()
PIX * pixHolesByFilling(PIX *pixs, l_int32 connectivity)
pixHolesByFilling()
PIX * pixDilateGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray()
l_ok pixSetMasked(PIX *pixd, PIX *pixm, l_uint32 val)
pixSetMasked()
PIX * pixSeedspread(PIX *pixs, l_int32 connectivity)
pixSeedspread()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
PIX * pixRemoveSeededComponents(PIX *pixd, PIX *pixs, PIX *pixm, l_int32 connectivity, l_int32 bordersize)
pixRemoveSeededComponents()
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_QUEUE * lqueueCreate(l_int32 nalloc)
lqueueCreate()
PIX * pixExtractBorderConnComps(PIX *pixs, l_int32 connectivity)
pixExtractBorderConnComps()
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 * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
void lept_stderr(const char *fmt,...)
lept_stderr()
PIX * pixDilateBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateBrick()
l_ok pixLocalExtrema(PIX *pixs, l_int32 maxmin, l_int32 minmax, PIX **ppixmin, PIX **ppixmax)
pixLocalExtrema()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_ok pixSetAll(PIX *pix)
pixSetAll()
PIX * pixInvert(PIX *pixd, PIX *pixs)
pixInvert()
NUMA * numaCreate(l_int32 n)
numaCreate()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixThresholdToBinary(PIX *pixs, l_int32 thresh)
pixThresholdToBinary()
#define GET_DATA_BIT(pdata, n)
static void seedfillGrayLowSimple(l_uint32 *datas, l_int32 w, l_int32 h, l_int32 wpls, l_uint32 *datam, l_int32 wplm, l_int32 connectivity)
seedfillGrayLowSimple()
l_ok pixSetOrClearBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_int32 op)
pixSetOrClearBorder()
PIX * pixAddBorder(PIX *pixs, l_int32 npix, l_uint32 val)
pixAddBorder()
void * lqueueRemove(L_QUEUE *lq)
lqueueRemove()
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
l_ok pixSelectedLocalExtrema(PIX *pixs, l_int32 mindist, PIX **ppixmin, PIX **ppixmax)
pixSelectedLocalExtrema()
PIX * pixRemoveBorder(PIX *pixs, l_int32 npix)
pixRemoveBorder()
PIX * pixXor(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixXor()
static void seedfillGrayInvLow(l_uint32 *datas, l_int32 w, l_int32 h, l_int32 wpls, l_uint32 *datam, l_int32 wplm, l_int32 connectivity)
seedfillGrayInvLow()
PIX * pixAnd(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixAnd()
l_ok boxaGetBoxGeometry(BOXA *boxa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxaGetBoxGeometry()
l_ok lqueueAdd(L_QUEUE *lq, void *item)
lqueueAdd()
static void distanceFunctionLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 d, l_int32 wpld, l_int32 connectivity)
distanceFunctionLow()
l_ok pixCountPixels(PIX *pixs, l_int32 *pcount, l_int32 *tab8)
pixCountPixels()
l_int32 * makePixelSumTab8(void)
makePixelSumTab8()
#define SET_DATA_BYTE(pdata, n, val)
l_ok pixSetPadBits(PIX *pix, l_int32 val)
pixSetPadBits()
l_ok pixSeedfillGrayInv(PIX *pixs, PIX *pixm, l_int32 connectivity)
pixSeedfillGrayInv()
#define GET_DATA_BYTE(pdata, n)
static l_int32 pixQualifyLocalMinima(PIX *pixs, PIX *pixm, l_int32 maxval)
pixQualifyLocalMinima()
PIX * pixRemoveBorderConnComps(PIX *pixs, l_int32 connectivity)
pixRemoveBorderConnComps()
PIX * pixDilateCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateCompBrick()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixSubtract(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixSubtract()
void pixDestroy(PIX **ppix)
pixDestroy()
l_int32 lqueueGetCount(L_QUEUE *lq)
lqueueGetCount()
PIX * pixFillClosedBorders(PIX *pixs, l_int32 connectivity)
pixFillClosedBorders()
static void seedfillGrayLow(l_uint32 *datas, l_int32 w, l_int32 h, l_int32 wpls, l_uint32 *datam, l_int32 wplm, l_int32 connectivity)
seedfillGrayLow()
PIX * pixSeedfillBinaryRestricted(PIX *pixd, PIX *pixs, PIX *pixm, l_int32 connectivity, l_int32 xmax, l_int32 ymax)
pixSeedfillBinaryRestricted()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 *pval)
pixGetPixel()
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()
PIX * pixOr(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixOr()
l_ok pixSetMirroredBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixSetMirroredBorder()
l_ok pixSeedfillGray(PIX *pixs, PIX *pixm, l_int32 connectivity)
pixSeedfillGray()
#define GET_DATA_TWO_BYTES(pdata, n)
PIX * pixDistanceFunction(PIX *pixs, l_int32 connectivity, l_int32 outdepth, l_int32 boundcond)
pixDistanceFunction()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
l_ok pixSeedfillGraySimple(PIX *pixs, PIX *pixm, l_int32 connectivity)
pixSeedfillGraySimple()
PIX * pixFillBgFromBorder(PIX *pixs, l_int32 connectivity)
pixFillBgFromBorder()
void lqueueDestroy(L_QUEUE **plq, l_int32 freeflag)
lqueueDestroy()
l_ok pixSeedfillGrayInvSimple(PIX *pixs, PIX *pixm, l_int32 connectivity)
pixSeedfillGrayInvSimple()
l_ok pixCropToMatch(PIX *pixs1, PIX *pixs2, PIX **ppixd1, PIX **ppixd2)
pixCropToMatch()
l_ok pixSelectMinInConnComp(PIX *pixs, PIX *pixm, PTA **ppta, NUMA **pnav)
pixSelectMinInConnComp()
static void seedfillGrayInvLowSimple(l_uint32 *datas, l_int32 w, l_int32 h, l_int32 wpls, l_uint32 *datam, l_int32 wplm, l_int32 connectivity)
seedfillGrayInvLowSimple()
l_ok pixEqual(PIX *pix1, PIX *pix2, l_int32 *psame)
pixEqual()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
PIX * pixFillHolesToBoundingRect(PIX *pixs, l_int32 minsize, l_float32 maxhfract, l_float32 minfgfract)
pixFillHolesToBoundingRect()
static void seedfillBinaryLow(l_uint32 *datas, l_int32 hs, l_int32 wpls, l_uint32 *datam, l_int32 hm, l_int32 wplm, l_int32 connectivity)
seedfillBinaryLow()
l_int32 pixSizesEqual(const PIX *pix1, const PIX *pix2)
pixSizesEqual()
PIX * pixFindEqualValues(PIX *pixs1, PIX *pixs2)
pixFindEqualValues()
#define SET_DATA_TWO_BYTES(pdata, n, val)
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
PIX * pixSeedfillGrayBasin(PIX *pixb, PIX *pixm, l_int32 delta, l_int32 connectivity)
pixSeedfillGrayBasin()
#define SET_DATA_BIT(pdata, n)
PIX * pixErodeGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray()
l_ok pixAddConstantGray(PIX *pixs, l_int32 val)
pixAddConstantGray()