166 #include "allheaders.h" 172 LEPT_DLL l_int32 MORPH_BC = ASYMMETRIC_MORPH_BC;
175 static const l_int32 ACCEPTABLE_COST = 5;
213 l_int32 i, j, w, h, sx, sy, cx, cy, seldata;
216 PROCNAME(
"pixDilate");
219 return (
PIX *)ERROR_PTR(
"processMorphArgs1 failed", procName, pixd);
224 for (i = 0; i < sy; i++) {
225 for (j = 0; j < sx; j++) {
226 seldata = sel->
data[i][j];
267 l_int32 i, j, w, h, sx, sy, cx, cy, seldata;
268 l_int32 xp, yp, xn, yn;
271 PROCNAME(
"pixErode");
274 return (
PIX *)ERROR_PTR(
"processMorphArgs1 failed", procName, pixd);
279 for (i = 0; i < sy; i++) {
280 for (j = 0; j < sx; j++) {
281 seldata = sel->
data[i][j];
295 if (MORPH_BC == ASYMMETRIC_MORPH_BC) {
342 l_int32 i, j, w, h, sx, sy, cx, cy, firstrasterop, seldata;
343 l_int32 xp, yp, xn, yn;
349 return (
PIX *)ERROR_PTR(
"processMorphArgs1 failed", procName, pixd);
353 firstrasterop = TRUE;
354 for (i = 0; i < sy; i++) {
355 for (j = 0; j < sx; j++) {
356 seldata = sel->
data[i][j];
358 if (firstrasterop == TRUE) {
362 firstrasterop = FALSE;
367 }
else if (seldata == 2) {
368 if (firstrasterop == TRUE) {
372 firstrasterop = FALSE;
431 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
433 if ((pixt =
pixErode(NULL, pixs, sel)) == NULL)
434 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
475 PROCNAME(
"pixClose");
478 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
480 if ((pixt =
pixDilate(NULL, pixs, sel)) == NULL)
481 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
524 l_int32 xp, yp, xn, yn, xmax, xbord;
527 PROCNAME(
"pixCloseSafe");
530 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
532 return (
PIX *)ERROR_PTR(
"sel not defined", procName, pixd);
533 if (pixGetDepth(pixs) != 1)
534 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
537 if (MORPH_BC == SYMMETRIC_MORPH_BC)
541 xmax = L_MAX(xp, xn);
542 xbord = 32 * ((xmax + 31) / 32);
545 return (
PIX *)ERROR_PTR(
"pixt1 not made", procName, pixd);
548 return (
PIX *)ERROR_PTR(
"pixt2 not made", procName, pixd);
593 PROCNAME(
"pixOpenGeneralized");
596 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
598 if ((pixt =
pixHMT(NULL, pixs, sel)) == NULL)
599 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
640 PROCNAME(
"pixCloseGeneralized");
643 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
645 if ((pixt =
pixDilate(NULL, pixs, sel)) == NULL)
646 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
690 SEL *sel, *selh, *selv;
692 PROCNAME(
"pixDilateBrick");
695 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
696 if (pixGetDepth(pixs) != 1)
697 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
698 if (hsize < 1 || vsize < 1)
699 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
701 if (hsize == 1 && vsize == 1)
703 if (hsize == 1 || vsize == 1) {
704 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
754 SEL *sel, *selh, *selv;
756 PROCNAME(
"pixErodeBrick");
759 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
760 if (pixGetDepth(pixs) != 1)
761 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
762 if (hsize < 1 || vsize < 1)
763 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
765 if (hsize == 1 && vsize == 1)
767 if (hsize == 1 || vsize == 1) {
768 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
818 SEL *sel, *selh, *selv;
820 PROCNAME(
"pixOpenBrick");
823 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
824 if (pixGetDepth(pixs) != 1)
825 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
826 if (hsize < 1 || vsize < 1)
827 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
829 if (hsize == 1 && vsize == 1)
831 if (hsize == 1 || vsize == 1) {
832 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
833 pixd =
pixOpen(pixd, pixs, sel);
884 SEL *sel, *selh, *selv;
886 PROCNAME(
"pixCloseBrick");
889 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
890 if (pixGetDepth(pixs) != 1)
891 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
892 if (hsize < 1 || vsize < 1)
893 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
895 if (hsize == 1 && vsize == 1)
897 if (hsize == 1 || vsize == 1) {
898 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
954 l_int32 maxtrans, bordsize;
955 PIX *pixsb, *pixt, *pixdb;
956 SEL *sel, *selh, *selv;
958 PROCNAME(
"pixCloseSafeBrick");
961 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
962 if (pixGetDepth(pixs) != 1)
963 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
964 if (hsize < 1 || vsize < 1)
965 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
967 if (hsize == 1 && vsize == 1)
971 if (MORPH_BC == SYMMETRIC_MORPH_BC)
974 maxtrans = L_MAX(hsize / 2, vsize / 2);
975 bordsize = 32 * ((maxtrans + 31) / 32);
978 if (hsize == 1 || vsize == 1) {
979 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
1037 selectComposableSels(l_int32 size,
1042 l_int32 factor1, factor2;
1044 PROCNAME(
"selectComposableSels");
1046 if (!psel1 && !psel2)
1047 return ERROR_INT(
"neither &sel1 nor &sel2 are defined", procName, 1);
1048 if (psel1) *psel1 = NULL;
1049 if (psel2) *psel2 = NULL;
1050 if (size < 1 || size > 250 * 250)
1051 return ERROR_INT(
"size < 1", procName, 1);
1052 if (direction != L_HORIZ && direction != L_VERT)
1053 return ERROR_INT(
"invalid direction", procName, 1);
1056 return ERROR_INT(
"factors not found", procName, 1);
1059 if (direction == L_HORIZ)
1096 l_int32 i, midval, val1, val2m, val2p;
1097 l_int32 index, prodm, prodp;
1098 l_int32 mincost, totcost, rastcostm, rastcostp, diffm, diffp;
1099 l_int32 lowval[256];
1101 l_int32 rastcost[256];
1104 PROCNAME(
"selectComposableSizes");
1106 if (size < 1 || size > 250 * 250)
1107 return ERROR_INT(
"size < 1", procName, 1);
1108 if (!pfactor1 || !pfactor2)
1109 return ERROR_INT(
"&factor1 or &factor2 not defined", procName, 1);
1111 midval = (l_int32)(sqrt((l_float64)size) + 0.001);
1112 if (midval * midval == size) {
1113 *pfactor1 = *pfactor2 = midval;
1119 for (val1 = midval + 1, i = 0; val1 > 0; val1--, i++) {
1120 val2m = size / val1;
1122 prodm = val1 * val2m;
1123 prodp = val1 * val2p;
1124 rastcostm = val1 + val2m - 2 * midval;
1125 rastcostp = val1 + val2p - 2 * midval;
1126 diffm = L_ABS(size - prodm);
1127 diffp = L_ABS(size - prodp);
1128 if (diffm <= diffp) {
1129 lowval[i] = L_MIN(val1, val2m);
1130 hival[i] = L_MAX(val1, val2m);
1131 rastcost[i] = rastcostm;
1134 lowval[i] = L_MIN(val1, val2p);
1135 hival[i] = L_MAX(val1, val2p);
1136 rastcost[i] = rastcostp;
1144 for (i = 0; i < midval + 1; i++) {
1145 if (diff[i] == 0 && rastcost[i] < ACCEPTABLE_COST) {
1146 *pfactor1 = hival[i];
1147 *pfactor2 = lowval[i];
1150 totcost = 4 * diff[i] + rastcost[i];
1151 if (totcost < mincost) {
1156 *pfactor1 = hival[index];
1157 *pfactor2 = lowval[index];
1209 PIX *pix1, *pix2, *pix3;
1210 SEL *selh1, *selh2, *selv1, *selv2;
1212 PROCNAME(
"pixDilateCompBrick");
1215 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1216 if (pixGetDepth(pixs) != 1)
1217 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1218 if (hsize < 1 || vsize < 1)
1219 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1221 if (hsize == 1 && vsize == 1)
1224 selectComposableSels(hsize, L_HORIZ, &selh1, &selh2);
1226 selectComposableSels(vsize, L_VERT, &selv1, &selv2);
1232 }
else if (hsize == 1) {
1310 SEL *selh1, *selh2, *selv1, *selv2;
1312 PROCNAME(
"pixErodeCompBrick");
1315 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1316 if (pixGetDepth(pixs) != 1)
1317 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1318 if (hsize < 1 || vsize < 1)
1319 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1321 if (hsize == 1 && vsize == 1)
1324 selectComposableSels(hsize, L_HORIZ, &selh1, &selh2);
1326 selectComposableSels(vsize, L_VERT, &selv1, &selv2);
1328 pixt =
pixErode(NULL, pixs, selh1);
1329 pixd =
pixErode(pixd, pixt, selh2);
1330 }
else if (hsize == 1) {
1331 pixt =
pixErode(NULL, pixs, selv1);
1332 pixd =
pixErode(pixd, pixt, selv2);
1334 pixt =
pixErode(NULL, pixs, selh1);
1335 pixd =
pixErode(pixd, pixt, selh2);
1401 SEL *selh1, *selh2, *selv1, *selv2;
1403 PROCNAME(
"pixOpenCompBrick");
1406 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1407 if (pixGetDepth(pixs) != 1)
1408 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1409 if (hsize < 1 || vsize < 1)
1410 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1412 if (hsize == 1 && vsize == 1)
1415 selectComposableSels(hsize, L_HORIZ, &selh1, &selh2);
1417 selectComposableSels(vsize, L_VERT, &selv1, &selv2);
1419 pixt =
pixErode(NULL, pixs, selh1);
1420 pixd =
pixErode(pixd, pixt, selh2);
1423 }
else if (hsize == 1) {
1424 pixt =
pixErode(NULL, pixs, selv1);
1425 pixd =
pixErode(pixd, pixt, selv2);
1429 pixt =
pixErode(NULL, pixs, selh1);
1430 pixd =
pixErode(pixd, pixt, selh2);
1500 SEL *selh1, *selh2, *selv1, *selv2;
1502 PROCNAME(
"pixCloseCompBrick");
1505 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1506 if (pixGetDepth(pixs) != 1)
1507 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1508 if (hsize < 1 || vsize < 1)
1509 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1511 if (hsize == 1 && vsize == 1)
1514 selectComposableSels(hsize, L_HORIZ, &selh1, &selh2);
1516 selectComposableSels(vsize, L_VERT, &selv1, &selv2);
1522 }
else if (hsize == 1) {
1603 l_int32 maxtrans, bordsize;
1604 PIX *pixsb, *pixt, *pixdb;
1605 SEL *selh1, *selh2, *selv1, *selv2;
1607 PROCNAME(
"pixCloseSafeCompBrick");
1610 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1611 if (pixGetDepth(pixs) != 1)
1612 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1613 if (hsize < 1 || vsize < 1)
1614 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1616 if (hsize == 1 && vsize == 1)
1620 if (MORPH_BC == SYMMETRIC_MORPH_BC)
1623 maxtrans = L_MAX(hsize / 2, vsize / 2);
1624 bordsize = 32 * ((maxtrans + 31) / 32);
1628 selectComposableSels(hsize, L_HORIZ, &selh1, &selh2);
1630 selectComposableSels(vsize, L_VERT, &selv1, &selv2);
1636 }
else if (hsize == 1) {
1689 PROCNAME(
"resetMorphBoundaryCondition");
1691 if (bc != SYMMETRIC_MORPH_BC && bc != ASYMMETRIC_MORPH_BC) {
1692 L_WARNING(
"invalid bc; using asymmetric\n", procName);
1693 bc = ASYMMETRIC_MORPH_BC;
1711 PROCNAME(
"getMorphBorderPixelColor");
1713 if (type != L_MORPH_DILATE && type != L_MORPH_ERODE)
1714 return ERROR_INT(
"invalid type", procName, 0);
1715 if (depth != 1 && depth != 2 && depth != 4 && depth != 8 &&
1716 depth != 16 && depth != 32)
1717 return ERROR_INT(
"invalid depth", procName, 0);
1719 if (MORPH_BC == ASYMMETRIC_MORPH_BC || type == L_MORPH_DILATE)
1724 return ((1 << depth) - 1);
1756 PROCNAME(
"processMorphArgs1");
1759 return (
PIX *)ERROR_PTR(
"&pixt not defined", procName, pixd);
1762 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1764 return (
PIX *)ERROR_PTR(
"sel not defined", procName, pixd);
1765 if (pixGetDepth(pixs) != 1)
1766 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1769 if (sx == 0 || sy == 0)
1770 return (
PIX *)ERROR_PTR(
"sel of size 0", procName, pixd);
1776 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1781 if ((*ppixt =
pixCopy(NULL, pixs)) == NULL)
1782 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
1803 PROCNAME(
"processMorphArgs2");
1806 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1808 return (
PIX *)ERROR_PTR(
"sel not defined", procName, pixd);
1809 if (pixGetDepth(pixs) != 1)
1810 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1813 if (sx == 0 || sy == 0)
1814 return (
PIX *)ERROR_PTR(
"sel of size 0", procName, pixd);
PIX * pixCloseGeneralized(PIX *pixd, PIX *pixs, SEL *sel)
pixCloseGeneralized()
l_ok selectComposableSizes(l_int32 size, l_int32 *pfactor1, l_int32 *pfactor2)
selectComposableSizes()
l_ok pixResizeImageData(PIX *pixd, const PIX *pixs)
pixResizeImageData()
PIX * pixRemoveBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixRemoveBorderGeneral()
l_uint32 getMorphBorderPixelColor(l_int32 type, l_int32 depth)
getMorphBorderPixelColor()
PIX * pixCloseBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseBrick()
PIX * pixOpen(PIX *pixd, PIX *pixs, SEL *sel)
pixOpen()
l_ok pixRasterop(PIX *pixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, l_int32 op, PIX *pixs, l_int32 sx, l_int32 sy)
pixRasterop()
PIX * pixCloseSafeCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeCompBrick()
PIX * pixDilateBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateBrick()
l_ok selGetParameters(SEL *sel, l_int32 *psy, l_int32 *psx, l_int32 *pcy, l_int32 *pcx)
selGetParameters()
void resetMorphBoundaryCondition(l_int32 bc)
resetMorphBoundaryCondition()
static PIX * processMorphArgs2(PIX *pixd, PIX *pixs, SEL *sel)
processMorphArgs2()
l_ok pixSetAll(PIX *pix)
pixSetAll()
l_ok selFindMaxTranslations(SEL *sel, l_int32 *pxp, l_int32 *pyp, l_int32 *pxn, l_int32 *pyn)
selFindMaxTranslations()
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
PIX * pixAddBorder(PIX *pixs, l_int32 npix, l_uint32 val)
pixAddBorder()
PIX * pixErode(PIX *pixd, PIX *pixs, SEL *sel)
pixErode()
PIX * pixRemoveBorder(PIX *pixs, l_int32 npix)
pixRemoveBorder()
PIX * pixCloseSafeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeBrick()
l_ok pixClearAll(PIX *pix)
pixClearAll()
void selDestroy(SEL **psel)
selDestroy()
SEL * selCreateComb(l_int32 factor1, l_int32 factor2, l_int32 direction)
selCreateComb()
SEL * selCreateBrick(l_int32 h, l_int32 w, l_int32 cy, l_int32 cx, l_int32 type)
selCreateBrick()
PIX * pixCloseSafe(PIX *pixd, PIX *pixs, SEL *sel)
pixCloseSafe()
PIX * pixDilateCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateCompBrick()
PIX * pixClone(PIX *pixs)
pixClone()
void pixDestroy(PIX **ppix)
pixDestroy()
PIX * pixOpenGeneralized(PIX *pixd, PIX *pixs, SEL *sel)
pixOpenGeneralized()
PIX * pixOpenBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenBrick()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCloseCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseCompBrick()
PIX * pixHMT(PIX *pixd, PIX *pixs, SEL *sel)
pixHMT()
PIX * pixClose(PIX *pixd, PIX *pixs, SEL *sel)
pixClose()
PIX * pixErodeCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeCompBrick()
static PIX * processMorphArgs1(PIX *pixd, PIX *pixs, SEL *sel, PIX **ppixt)
processMorphArgs1()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixDilate(PIX *pixd, PIX *pixs, SEL *sel)
pixDilate()
PIX * pixErodeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeBrick()
PIX * pixOpenCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenCompBrick()
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()