168 #include "allheaders.h" 178 l_uint32 *datam, l_int32 hm, l_int32 wplm,
179 l_int32 connectivity);
181 l_int32 wpls, l_uint32 *datam, l_int32 wplm,
182 l_int32 connectivity);
184 l_int32 wpls, l_uint32 *datam, l_int32 wplm,
185 l_int32 connectivity);
187 l_int32 wpls, l_uint32 *datam, l_int32 wplm,
188 l_int32 connectivity);
190 l_int32 wpls, l_uint32 *datam,
191 l_int32 wplm, l_int32 connectivity);
193 l_int32 d, l_int32 wpld, l_int32 connectivity);
194 static void seedspreadLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld,
195 l_uint32 *datat, l_int32 wplt, l_int32 connectivity);
200 #ifndef NO_CONSOLE_IO 201 #define DEBUG_PRINT_ITERS 0 205 static const l_int32 MAX_ITERS = 40;
246 l_int32 connectivity)
249 l_int32 hd, hm, wpld, wplm;
250 l_uint32 *datad, *datam;
253 PROCNAME(
"pixSeedfillBinary");
255 if (!pixs || pixGetDepth(pixs) != 1)
256 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, pixd);
257 if (!pixm || pixGetDepth(pixm) != 1)
258 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, pixd);
259 if (connectivity != 4 && connectivity != 8)
260 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", procName, pixd);
263 if ((pixd =
pixCopy(pixd, pixs)) == NULL)
264 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
268 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
270 hd = pixGetHeight(pixd);
271 hm = pixGetHeight(pixm);
274 wpld = pixGetWpl(pixd);
275 wplm = pixGetWpl(pixm);
279 for (i = 0; i < MAX_ITERS; i++) {
284 #if DEBUG_PRINT_ITERS 285 fprintf(stderr,
"Binary seed fill converged: %d iters\n", i + 1);
333 l_int32 connectivity,
340 PROCNAME(
"pixSeedfillBinaryRestricted");
342 if (!pixs || pixGetDepth(pixs) != 1)
343 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, pixd);
344 if (!pixm || pixGetDepth(pixm) != 1)
345 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, pixd);
346 if (connectivity != 4 && connectivity != 8)
347 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", procName, pixd);
348 if (xmax == 0 && ymax == 0)
350 if (xmax < 0 || ymax < 0) {
351 L_ERROR(
"xmax and ymax must be non-negative", procName);
357 return (
PIX *)ERROR_PTR(
"pix1 not made", procName, pixd);
404 l_int32 connectivity)
406 l_int32 i, j, h, wpl;
408 l_uint32 wordabove, wordleft, wordbelow, wordright;
410 l_uint32 *lines, *linem;
412 PROCNAME(
"seedfillBinaryLow");
415 wpl = L_MIN(wpls, wplm);
417 switch (connectivity)
421 for (i = 0; i < h; i++) {
422 lines = datas + i * wpls;
423 linem = datam + i * wplm;
424 for (j = 0; j < wpl; j++) {
430 wordabove = *(lines - wpls + j);
434 wordleft = *(lines + j - 1);
435 word |= wordleft << 31;
440 if (!word || !(~word)) {
447 word = (word | (word >> 1) | (word << 1)) & mask;
448 if ((word ^ wordprev) == 0) {
457 for (i = h - 1; i >= 0; i--) {
458 lines = datas + i * wpls;
459 linem = datam + i * wplm;
460 for (j = wpl - 1; j >= 0; j--) {
466 wordbelow = *(lines + wpls + j);
470 wordright = *(lines + j + 1);
471 word |= wordright >> 31;
476 if (!word || !(~word)) {
483 word = (word | (word >> 1) | (word << 1)) & mask;
484 if ((word ^ wordprev) == 0) {
495 for (i = 0; i < h; i++) {
496 lines = datas + i * wpls;
497 linem = datam + i * wplm;
498 for (j = 0; j < wpl; j++) {
504 wordabove = *(lines - wpls + j);
505 word |= (wordabove | (wordabove << 1) | (wordabove >> 1));
507 word |= (*(lines - wpls + j - 1)) << 31;
509 word |= (*(lines - wpls + j + 1)) >> 31;
512 wordleft = *(lines + j - 1);
513 word |= wordleft << 31;
518 if (!word || !(~word)) {
525 word = (word | (word >> 1) | (word << 1)) & mask;
526 if ((word ^ wordprev) == 0) {
535 for (i = h - 1; i >= 0; i--) {
536 lines = datas + i * wpls;
537 linem = datam + i * wplm;
538 for (j = wpl - 1; j >= 0; j--) {
544 wordbelow = *(lines + wpls + j);
545 word |= (wordbelow | (wordbelow << 1) | (wordbelow >> 1));
547 word |= (*(lines + wpls + j - 1)) << 31;
549 word |= (*(lines + wpls + j + 1)) >> 31;
552 wordright = *(lines + j + 1);
553 word |= wordright >> 31;
558 if (!word || !(~word)) {
565 word = (word | (word >> 1) | (word << 1)) & mask;
566 if ((word ^ wordprev) == 0) {
576 L_ERROR(
"connectivity must be 4 or 8\n", procName);
606 l_int32 connectivity)
610 PROCNAME(
"pixHolesByFilling");
612 if (!pixs || pixGetDepth(pixs) != 1)
613 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
614 if (connectivity != 4 && connectivity != 8)
615 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
618 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
619 if ((pixsi =
pixInvert(NULL, pixs)) == NULL) {
621 return (
PIX *)ERROR_PTR(
"pixsi not made", procName, NULL);
626 pixOr(pixd, pixd, pixs);
657 l_int32 connectivity)
661 PROCNAME(
"pixFillClosedBorders");
663 if (!pixs || pixGetDepth(pixs) != 1)
664 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
665 if (connectivity != 4 && connectivity != 8)
666 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
669 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
672 if ((pixsi =
pixInvert(NULL, pixs)) == NULL) {
674 return (
PIX *)ERROR_PTR(
"pixsi not made", procName, NULL);
695 l_int32 connectivity)
699 PROCNAME(
"pixExtractBorderConnComps");
701 if (!pixs || pixGetDepth(pixs) != 1)
702 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
703 if (connectivity != 4 && connectivity != 8)
704 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
708 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
734 l_int32 connectivity)
738 PROCNAME(
"pixRemoveBorderConnComps");
740 if (!pixs || pixGetDepth(pixs) != 1)
741 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
742 if (connectivity != 4 && connectivity != 8)
743 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
784 l_int32 connectivity)
788 PROCNAME(
"pixFillBgFromBorder");
790 if (!pixs || pixGetDepth(pixs) != 1)
791 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
792 if (connectivity != 4 && connectivity != 8)
793 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
802 pixOr(pixd, pixd, pixs);
845 l_float32 minfgfract)
847 l_int32 i, x, y, w, h, n, nfg, nh, ntot, area;
852 PIX *pixd, *pixfg, *pixh;
855 PROCNAME(
"pixFillHolesToBoundingRect");
857 if (!pixs || pixGetDepth(pixs) != 1)
858 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
864 for (i = 0; i < n; i++) {
873 hfract = (l_float32)nh / (l_float32)nfg;
875 if (hfract <= maxhfract)
877 fgfract = (l_float32)ntot / (l_float32)area;
878 if (fgfract >= minfgfract) {
881 }
else if (hfract <= maxhfract) {
925 l_int32 connectivity)
927 l_int32 h, w, wpls, wplm;
928 l_uint32 *datas, *datam;
930 PROCNAME(
"pixSeedfillGray");
932 if (!pixs || pixGetDepth(pixs) != 8)
933 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
934 if (!pixm || pixGetDepth(pixm) != 8)
935 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
936 if (connectivity != 4 && connectivity != 8)
937 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
941 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
945 wpls = pixGetWpl(pixs);
946 wplm = pixGetWpl(pixm);
984 l_int32 connectivity)
986 l_int32 h, w, wpls, wplm;
987 l_uint32 *datas, *datam;
989 PROCNAME(
"pixSeedfillGrayInv");
991 if (!pixs || pixGetDepth(pixs) != 8)
992 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
993 if (!pixm || pixGetDepth(pixm) != 8)
994 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
995 if (connectivity != 4 && connectivity != 8)
996 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
1000 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
1004 wpls = pixGetWpl(pixs);
1005 wplm = pixGetWpl(pixm);
1065 l_int32 connectivity)
1067 l_uint8 val1, val2, val3, val4, val5, val6, val7, val8;
1068 l_uint8 val, maxval, maskval, boolval;
1069 l_int32 i, j, imax, jmax, queue_size;
1070 l_uint32 *lines, *linem;
1074 PROCNAME(
"seedfillGrayLow");
1076 if (connectivity != 4 && connectivity != 8) {
1077 L_ERROR(
"connectivity must be 4 or 8\n", procName);
1090 switch (connectivity)
1099 for (i = 0; i < h; i++) {
1100 lines = datas + i * wpls;
1101 linem = datam + i * wplm;
1102 for (j = 0; j < w; j++) {
1109 maxval = L_MAX(maxval, val4);
1112 maxval = L_MAX(maxval, val);
1113 val = L_MIN(maxval, maskval);
1123 for (i = imax; i >= 0; i--) {
1124 lines = datas + i * wpls;
1125 linem = datam + i * wplm;
1126 for (j = jmax; j >= 0; j--) {
1134 maxval = L_MAX(maxval, val5);
1137 maxval = L_MAX(maxval, val);
1138 val = L_MIN(maxval, maskval);
1155 if (!boolval && (val5 < val) &&
1181 while (queue_size) {
1186 lines = datas + i * wpls;
1187 linem = datam + i * wplm;
1193 if (val > val2 && val2 != maskval) {
1205 if (val > val4 && val4 != maskval) {
1216 if (val > val7 && val7 != maskval) {
1227 if (val > val5 && val5 != maskval) {
1249 for (i = 0; i < h; i++) {
1250 lines = datas + i * wpls;
1251 linem = datam + i * wplm;
1252 for (j = 0; j < w; j++) {
1260 maxval = L_MAX(maxval, val3);
1263 maxval = L_MAX(maxval, val2);
1267 maxval = L_MAX(maxval, val4);
1270 maxval = L_MAX(maxval, val);
1271 val = L_MIN(maxval, maskval);
1281 for (i = imax; i >= 0; i--) {
1282 lines = datas + i * wpls;
1283 linem = datam + i * wplm;
1284 for (j = jmax; j >= 0; j--) {
1294 maxval = L_MAX(maxval, val8);
1297 maxval = L_MAX(maxval, val7);
1301 maxval = L_MAX(maxval, val5);
1304 maxval = L_MAX(maxval, val);
1305 val = L_MIN(maxval, maskval);
1322 if (!boolval && (val8 < val) &&
1328 if (!boolval && (val7 < val) &&
1335 if (!boolval && (val5 < val) &&
1361 while (queue_size) {
1366 lines = datas + i * wpls;
1367 linem = datam + i * wplm;
1374 if (val > val1 && val1 != maskval) {
1376 L_MIN(val, maskval));
1386 if (val > val3 && val3 != maskval) {
1388 L_MIN(val, maskval));
1397 if (val > val2 && val2 != maskval) {
1409 if (val > val4 && val4 != maskval) {
1421 if (val > val6 && val6 != maskval) {
1423 L_MIN(val, maskval));
1433 if (val > val8 && val8 != maskval) {
1435 L_MIN(val, maskval));
1444 if (val > val7 && val7 != maskval) {
1455 if (val > val5 && val5 != maskval) {
1470 L_ERROR(
"shouldn't get here!\n", procName);
1518 l_int32 connectivity)
1520 l_uint8 val1, val2, val3, val4, val5, val6, val7, val8;
1521 l_uint8 val, maxval, maskval, boolval;
1522 l_int32 i, j, imax, jmax, queue_size;
1523 l_uint32 *lines, *linem;
1527 PROCNAME(
"seedfillGrayInvLow");
1529 if (connectivity != 4 && connectivity != 8) {
1530 L_ERROR(
"connectivity must be 4 or 8\n", procName);
1543 switch (connectivity)
1554 for (i = 0; i < h; i++) {
1555 lines = datas + i * wpls;
1556 linem = datam + i * wplm;
1557 for (j = 0; j < w; j++) {
1562 maxval = L_MAX(maxval, val2);
1566 maxval = L_MAX(maxval, val4);
1568 if (maxval > maskval)
1582 for (i = imax; i >= 0; i--) {
1583 lines = datas + i * wpls;
1584 linem = datam + i * wplm;
1585 for (j = jmax; j >= 0; j--) {
1591 maxval = L_MAX(maxval, val7);
1595 maxval = L_MAX(maxval, val5);
1597 if (maxval > maskval)
1615 if (!boolval && (val5 < val) &&
1641 while (queue_size) {
1646 lines = datas + i * wpls;
1647 linem = datam + i * wplm;
1653 if (val > val2 && val > maskval) {
1665 if (val > val4 && val > maskval) {
1676 if (val > val7 && val > maskval) {
1687 if (val > val5 && val > maskval) {
1711 for (i = 0; i < h; i++) {
1712 lines = datas + i * wpls;
1713 linem = datam + i * wplm;
1714 for (j = 0; j < w; j++) {
1720 maxval = L_MAX(maxval, val1);
1724 maxval = L_MAX(maxval, val3);
1727 maxval = L_MAX(maxval, val2);
1731 maxval = L_MAX(maxval, val4);
1733 if (maxval > maskval)
1747 for (i = imax; i >= 0; i--) {
1748 lines = datas + i * wpls;
1749 linem = datam + i * wplm;
1750 for (j = jmax; j >= 0; j--) {
1757 maxval = L_MAX(maxval, val6);
1761 maxval = L_MAX(maxval, val8);
1764 maxval = L_MAX(maxval, val7);
1768 maxval = L_MAX(maxval, val5);
1770 if (maxval > maskval)
1789 if (!boolval && (val8 < val) &&
1795 if (!boolval && (val7 < val) &&
1802 if (!boolval && (val5 < val) &&
1828 while (queue_size) {
1833 lines = datas + i * wpls;
1834 linem = datam + i * wplm;
1841 if (val > val1 && val > maskval) {
1852 if (val > val3 && val > maskval) {
1862 if (val > val2 && val > maskval) {
1874 if (val > val4 && val > maskval) {
1886 if (val > val6 && val > maskval) {
1897 if (val > val8 && val > maskval) {
1907 if (val > val7 && val > maskval) {
1918 if (val > val5 && val > maskval) {
1933 L_ERROR(
"shouldn't get here!\n", procName);
1971 l_int32 connectivity)
1973 l_int32 i, h, w, wpls, wplm, boolval;
1974 l_uint32 *datas, *datam;
1977 PROCNAME(
"pixSeedfillGraySimple");
1979 if (!pixs || pixGetDepth(pixs) != 8)
1980 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
1981 if (!pixm || pixGetDepth(pixm) != 8)
1982 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
1983 if (connectivity != 4 && connectivity != 8)
1984 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
1988 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
1992 return ERROR_INT(
"pixt not made", procName, 1);
1996 wpls = pixGetWpl(pixs);
1997 wplm = pixGetWpl(pixm);
1999 for (i = 0; i < MAX_ITERS; i++) {
2004 #if DEBUG_PRINT_ITERS 2005 L_INFO(
"Gray seed fill converged: %d iters\n", procName, i + 1);
2042 l_int32 connectivity)
2044 l_int32 i, h, w, wpls, wplm, boolval;
2045 l_uint32 *datas, *datam;
2048 PROCNAME(
"pixSeedfillGrayInvSimple");
2050 if (!pixs || pixGetDepth(pixs) != 8)
2051 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
2052 if (!pixm || pixGetDepth(pixm) != 8)
2053 return ERROR_INT(
"pixm not defined or not 8 bpp", procName, 1);
2054 if (connectivity != 4 && connectivity != 8)
2055 return ERROR_INT(
"connectivity not in {4,8}", procName, 1);
2059 return ERROR_INT(
"pixs and pixm sizes differ", procName, 1);
2063 return ERROR_INT(
"pixt not made", procName, 1);
2067 wpls = pixGetWpl(pixs);
2068 wplm = pixGetWpl(pixm);
2070 for (i = 0; i < MAX_ITERS; i++) {
2075 #if DEBUG_PRINT_ITERS 2076 L_INFO(
"Gray seed fill converged: %d iters\n", procName, i + 1);
2127 l_int32 connectivity)
2129 l_uint8 val2, val3, val4, val5, val7, val8;
2130 l_uint8 val, maxval, maskval;
2131 l_int32 i, j, imax, jmax;
2132 l_uint32 *lines, *linem;
2134 PROCNAME(
"seedfillGrayLowSimple");
2139 switch (connectivity)
2143 for (i = 0; i < h; i++) {
2144 lines = datas + i * wpls;
2145 linem = datam + i * wplm;
2146 for (j = 0; j < w; j++) {
2153 maxval = L_MAX(maxval, val4);
2156 maxval = L_MAX(maxval, val);
2157 val = L_MIN(maxval, maskval);
2164 for (i = imax; i >= 0; i--) {
2165 lines = datas + i * wpls;
2166 linem = datam + i * wplm;
2167 for (j = jmax; j >= 0; j--) {
2174 maxval = L_MAX(maxval, val5);
2177 maxval = L_MAX(maxval, val);
2178 val = L_MIN(maxval, maskval);
2187 for (i = 0; i < h; i++) {
2188 lines = datas + i * wpls;
2189 linem = datam + i * wplm;
2190 for (j = 0; j < w; j++) {
2198 maxval = L_MAX(maxval, val2);
2201 maxval = L_MAX(maxval, val3);
2205 maxval = L_MAX(maxval, val4);
2208 maxval = L_MAX(maxval, val);
2209 val = L_MIN(maxval, maskval);
2216 for (i = imax; i >= 0; i--) {
2217 lines = datas + i * wpls;
2218 linem = datam + i * wplm;
2219 for (j = jmax; j >= 0; j--) {
2227 maxval = L_MAX(maxval, val8);
2230 maxval = L_MAX(maxval, val7);
2234 maxval = L_MAX(maxval, val5);
2237 maxval = L_MAX(maxval, val);
2238 val = L_MIN(maxval, maskval);
2246 L_ERROR(
"connectivity must be 4 or 8\n", procName);
2283 l_int32 connectivity)
2285 l_uint8 val1, val2, val3, val4, val5, val6, val7, val8;
2286 l_uint8 maxval, maskval;
2287 l_int32 i, j, imax, jmax;
2288 l_uint32 *lines, *linem;
2290 PROCNAME(
"seedfillGrayInvLowSimple");
2295 switch (connectivity)
2299 for (i = 0; i < h; i++) {
2300 lines = datas + i * wpls;
2301 linem = datam + i * wplm;
2302 for (j = 0; j < w; j++) {
2307 maxval = L_MAX(maxval, val2);
2311 maxval = L_MAX(maxval, val4);
2313 if (maxval > maskval)
2320 for (i = imax; i >= 0; i--) {
2321 lines = datas + i * wpls;
2322 linem = datam + i * wplm;
2323 for (j = jmax; j >= 0; j--) {
2328 maxval = L_MAX(maxval, val7);
2332 maxval = L_MAX(maxval, val5);
2334 if (maxval > maskval)
2343 for (i = 0; i < h; i++) {
2344 lines = datas + i * wpls;
2345 linem = datam + i * wplm;
2346 for (j = 0; j < w; j++) {
2352 maxval = L_MAX(maxval, val1);
2356 maxval = L_MAX(maxval, val2);
2359 maxval = L_MAX(maxval, val3);
2363 maxval = L_MAX(maxval, val4);
2365 if (maxval > maskval)
2372 for (i = imax; i >= 0; i--) {
2373 lines = datas + i * wpls;
2374 linem = datam + i * wplm;
2375 for (j = jmax; j >= 0; j--) {
2381 maxval = L_MAX(maxval, val6);
2385 maxval = L_MAX(maxval, val8);
2388 maxval = L_MAX(maxval, val7);
2392 maxval = L_MAX(maxval, val5);
2394 if (maxval > maskval)
2402 L_ERROR(
"connectivity must be 4 or 8\n", procName);
2445 l_int32 connectivity)
2447 PIX *pixbi, *pixmi, *pixsd;
2449 PROCNAME(
"pixSeedfillGrayBasin");
2451 if (!pixb || pixGetDepth(pixb) != 1)
2452 return (
PIX *)ERROR_PTR(
"pixb undefined or not 1 bpp", procName, NULL);
2453 if (!pixm || pixGetDepth(pixm) != 8)
2454 return (
PIX *)ERROR_PTR(
"pixm undefined or not 8 bpp", procName, NULL);
2455 if (connectivity != 4 && connectivity != 8)
2456 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", procName, NULL);
2459 L_WARNING(
"delta <= 0; returning a copy of pixm\n", procName);
2534 l_int32 connectivity,
2542 PROCNAME(
"pixDistanceFunction");
2544 if (!pixs || pixGetDepth(pixs) != 1)
2545 return (
PIX *)ERROR_PTR(
"!pixs or pixs not 1 bpp", procName, NULL);
2546 if (connectivity != 4 && connectivity != 8)
2547 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
2548 if (outdepth != 8 && outdepth != 16)
2549 return (
PIX *)ERROR_PTR(
"outdepth not 8 or 16 bpp", procName, NULL);
2550 if (boundcond != L_BOUNDARY_BG && boundcond != L_BOUNDARY_FG)
2551 return (
PIX *)ERROR_PTR(
"invalid boundcond", procName, NULL);
2554 if ((pixd =
pixCreate(w, h, outdepth)) == NULL)
2555 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2557 wpld = pixGetWpl(pixd);
2562 if (boundcond == L_BOUNDARY_BG) {
2589 l_int32 connectivity)
2591 l_int32 val1, val2, val3, val4, val5, val6, val7, val8, minval, val;
2592 l_int32 i, j, imax, jmax;
2595 PROCNAME(
"distanceFunctionLow");
2602 switch (connectivity)
2607 for (i = 1; i < imax; i++) {
2608 lined = datad + i * wpld;
2609 for (j = 1; j < jmax; j++) {
2613 minval = L_MIN(val2, val4);
2614 minval = L_MIN(minval, 254);
2621 for (i = imax - 1; i > 0; i--) {
2622 lined = datad + i * wpld;
2623 for (j = jmax - 1; j > 0; j--) {
2627 minval = L_MIN(val5, val7);
2628 minval = L_MIN(minval + 1, val);
2635 for (i = 1; i < imax; i++) {
2636 lined = datad + i * wpld;
2637 for (j = 1; j < jmax; j++) {
2641 minval = L_MIN(val2, val4);
2642 minval = L_MIN(minval, 0xfffe);
2649 for (i = imax - 1; i > 0; i--) {
2650 lined = datad + i * wpld;
2651 for (j = jmax - 1; j > 0; j--) {
2655 minval = L_MIN(val5, val7);
2656 minval = L_MIN(minval + 1, val);
2667 for (i = 1; i < imax; i++) {
2668 lined = datad + i * wpld;
2669 for (j = 1; j < jmax; j++) {
2675 minval = L_MIN(val1, val2);
2676 minval = L_MIN(minval, val3);
2677 minval = L_MIN(minval, val4);
2678 minval = L_MIN(minval, 254);
2685 for (i = imax - 1; i > 0; i--) {
2686 lined = datad + i * wpld;
2687 for (j = jmax - 1; j > 0; j--) {
2693 minval = L_MIN(val8, val7);
2694 minval = L_MIN(minval, val6);
2695 minval = L_MIN(minval, val5);
2696 minval = L_MIN(minval + 1, val);
2703 for (i = 1; i < imax; i++) {
2704 lined = datad + i * wpld;
2705 for (j = 1; j < jmax; j++) {
2711 minval = L_MIN(val1, val2);
2712 minval = L_MIN(minval, val3);
2713 minval = L_MIN(minval, val4);
2714 minval = L_MIN(minval, 0xfffe);
2721 for (i = imax - 1; i > 0; i--) {
2722 lined = datad + i * wpld;
2723 for (j = jmax - 1; j > 0; j--) {
2729 minval = L_MIN(val8, val7);
2730 minval = L_MIN(minval, val6);
2731 minval = L_MIN(minval, val5);
2732 minval = L_MIN(minval + 1, val);
2741 L_ERROR(
"connectivity must be 4 or 8\n", procName);
2792 l_int32 connectivity)
2794 l_int32 w, h, wplt, wplg;
2795 l_uint32 *datat, *datag;
2796 PIX *pixm, *pixt, *pixg, *pixd;
2798 PROCNAME(
"pixSeedspread");
2800 if (!pixs || pixGetDepth(pixs) != 8)
2801 return (
PIX *)ERROR_PTR(
"!pixs or pixs not 8 bpp", procName, NULL);
2802 if (connectivity != 4 && connectivity != 8)
2803 return (
PIX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
2824 wplt = pixGetWpl(pixt);
2828 wplg = pixGetWpl(pixg);
2829 seedspreadLow(datag, w, h, wplg, datat, wplt, connectivity);
2851 l_int32 connectivity)
2853 l_int32 val1t, val2t, val3t, val4t, val5t, val6t, val7t, val8t;
2854 l_int32 i, j, imax, jmax, minval, valt, vald;
2855 l_uint32 *linet, *lined;
2857 PROCNAME(
"seedspreadLow");
2866 switch (connectivity)
2870 for (i = 1; i < h; i++) {
2871 linet = datat + i * wplt;
2872 lined = datad + i * wpld;
2873 for (j = 1; j < jmax; j++) {
2877 minval = L_MIN(val2t, val4t);
2878 minval = L_MIN(minval, 0xfffe);
2890 for (i = imax - 1; i > 0; i--) {
2891 linet = datat + i * wplt;
2892 lined = datad + i * wpld;
2893 for (j = jmax - 1; j > 0; j--) {
2897 minval = L_MIN(val5t, val7t);
2898 minval = L_MIN(minval + 1, valt);
2899 if (valt > minval) {
2913 for (i = 1; i < h; i++) {
2914 linet = datat + i * wplt;
2915 lined = datad + i * wpld;
2916 for (j = 1; j < jmax; j++) {
2922 minval = L_MIN(val1t, val2t);
2923 minval = L_MIN(minval, val3t);
2924 minval = L_MIN(minval, val4t);
2925 minval = L_MIN(minval, 0xfffe);
2927 if (minval == val1t)
2929 else if (minval == val2t)
2931 else if (minval == val3t)
2941 for (i = imax - 1; i > 0; i--) {
2942 linet = datat + i * wplt;
2943 lined = datad + i * wpld;
2944 for (j = jmax - 1; j > 0; j--) {
2950 minval = L_MIN(val8t, val7t);
2951 minval = L_MIN(minval, val6t);
2952 minval = L_MIN(minval, val5t);
2953 minval = L_MIN(minval + 1, valt);
2954 if (valt > minval) {
2956 if (minval == val5t + 1)
2958 else if (minval == val6t + 1)
2960 else if (minval == val7t + 1)
2971 L_ERROR(
"connectivity must be 4 or 8\n", procName);
3024 PIX *pixmin, *pixmax, *pixt1, *pixt2;
3026 PROCNAME(
"pixLocalExtrema");
3028 if (!pixs || pixGetDepth(pixs) != 8)
3029 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
3030 if (!ppixmin && !ppixmax)
3031 return ERROR_INT(
"neither &pixmin, &pixmax are defined", procName, 1);
3032 if (maxmin <= 0) maxmin = 254;
3033 if (minmax <= 0) minmax = 1;
3086 l_int32 n, i, j, k, x, y, w, h, xc, yc, wc, hc, xon, yon;
3087 l_int32 vals, wpls, wplc, ismin;
3089 l_uint32 *datas, *datac, *lines, *linec;
3091 PIX *pix1, *pix2, *pix3;
3094 PROCNAME(
"pixQualifyLocalMinima");
3096 if (!pixs || pixGetDepth(pixs) != 8)
3097 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
3098 if (!pixm || pixGetDepth(pixm) != 1)
3099 return ERROR_INT(
"pixm not defined or not 1 bpp", procName, 1);
3100 if (maxval <= 0) maxval = 254;
3104 wpls = pixGetWpl(pixs);
3107 for (k = 0; k < n; k++) {
3112 pixXor(pix3, pix3, pix2);
3114 wplc = pixGetWpl(pix3);
3129 for (i = 0, y = yc - 1; i < hc + 2 && y >= 0 && y < h; i++, y++) {
3130 lines = datas + y * wpls;
3131 linec = datac + i * wplc;
3132 for (j = 0, x = xc - 1; j < wc + 2 && x >= 0 && x < w; j++, x++) {
3195 PIX *pixmin, *pixmax, *pixt, *pixtmin, *pixtmax;
3197 PROCNAME(
"pixSelectedLocalExtrema");
3199 if (!pixs || pixGetDepth(pixs) != 8)
3200 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
3201 if (!ppixmin || !ppixmax)
3202 return ERROR_INT(
"&pixmin and &pixmax not both defined", procName, 1);
3216 }
else if (mindist == 0) {
3217 pixt =
pixAnd(NULL, pixmin, pixmax);
3223 2 * mindist + 1, 2 * mindist + 1);
3225 2 * mindist + 1, 2 * mindist + 1);
3253 l_int32 w1, h1, w2, h2, w, h;
3254 l_int32 i, j, val1, val2, wpls1, wpls2, wpld;
3255 l_uint32 *datas1, *datas2, *datad, *lines1, *lines2, *lined;
3258 PROCNAME(
"pixFindEqualValues");
3260 if (!pixs1 || pixGetDepth(pixs1) != 8)
3261 return (
PIX *)ERROR_PTR(
"pixs1 undefined or not 8 bpp", procName, NULL);
3262 if (!pixs2 || pixGetDepth(pixs2) != 8)
3263 return (
PIX *)ERROR_PTR(
"pixs2 undefined or not 8 bpp", procName, NULL);
3272 wpls1 = pixGetWpl(pixs1);
3273 wpls2 = pixGetWpl(pixs2);
3274 wpld = pixGetWpl(pixd);
3276 for (i = 0; i < h; i++) {
3277 lines1 = datas1 + i * wpls1;
3278 lines2 = datas2 + i * wpls2;
3279 lined = datad + i * wpld;
3280 for (j = 0; j < w; j++) {
3322 l_int32 bx, by, bw, bh, i, j, c, n;
3323 l_int32 xs, ys, minx, miny, wpls, wplt, val, minval;
3324 l_uint32 *datas, *datat, *lines, *linet;
3327 PIX *pixt, *pixs2, *pixm2;
3331 PROCNAME(
"pixSelectMinInConnComp");
3334 return ERROR_INT(
"&pta not defined", procName, 1);
3336 if (pnav) *pnav = NULL;
3337 if (!pixs || pixGetDepth(pixs) != 8)
3338 return ERROR_INT(
"pixs undefined or not 8 bpp", procName, 1);
3339 if (!pixm || pixGetDepth(pixm) != 1)
3340 return ERROR_INT(
"pixm undefined or not 1 bpp", procName, 1);
3346 return ERROR_INT(
"cropping failure", procName, 1);
3356 wpls = pixGetWpl(pixs2);
3357 for (c = 0; c < n; c++) {
3360 if (bw == 1 && bh == 1) {
3367 wplt = pixGetWpl(pixt);
3368 minx = miny = 1000000;
3370 for (i = 0; i < bh; i++) {
3372 lines = datas + ys * wpls;
3373 linet = datat + i * wplt;
3374 for (j = 0; j < bw; j++) {
3433 l_int32 connectivity,
3438 PROCNAME(
"pixRemoveSeededComponents");
3440 if (!pixs || pixGetDepth(pixs) != 1)
3441 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, pixd);
3442 if (!pixm || pixGetDepth(pixm) != 1)
3443 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, pixd);
3444 if (pixd && pixd != pixm)
3445 return (
PIX *)ERROR_PTR(
"operation not inplace", procName, pixd);
3449 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 * 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 * 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)
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
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()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
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()