166 #include <config_auto.h>
170 #include "allheaders.h"
176 LEPT_DLL l_int32 MORPH_BC = ASYMMETRIC_MORPH_BC;
179 static const l_int32 ACCEPTABLE_COST = 5;
217 l_int32 i, j, w, h, sx, sy, cx, cy, seldata;
220 PROCNAME(
"pixDilate");
223 return (
PIX *)ERROR_PTR(
"processMorphArgs1 failed", procName, pixd);
228 for (i = 0; i < sy; i++) {
229 for (j = 0; j < sx; j++) {
230 seldata = sel->
data[i][j];
271 l_int32 i, j, w, h, sx, sy, cx, cy, seldata;
272 l_int32 xp, yp, xn, yn;
275 PROCNAME(
"pixErode");
278 return (
PIX *)ERROR_PTR(
"processMorphArgs1 failed", procName, pixd);
283 for (i = 0; i < sy; i++) {
284 for (j = 0; j < sx; j++) {
285 seldata = sel->
data[i][j];
299 if (MORPH_BC == ASYMMETRIC_MORPH_BC) {
346 l_int32 i, j, w, h, sx, sy, cx, cy, firstrasterop, seldata;
347 l_int32 xp, yp, xn, yn;
353 return (
PIX *)ERROR_PTR(
"processMorphArgs1 failed", procName, pixd);
357 firstrasterop = TRUE;
358 for (i = 0; i < sy; i++) {
359 for (j = 0; j < sx; j++) {
360 seldata = sel->
data[i][j];
362 if (firstrasterop == TRUE) {
366 firstrasterop = FALSE;
371 }
else if (seldata == 2) {
372 if (firstrasterop == TRUE) {
376 firstrasterop = FALSE;
435 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
437 if ((pixt =
pixErode(NULL, pixs, sel)) == NULL)
438 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
479 PROCNAME(
"pixClose");
482 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
484 if ((pixt =
pixDilate(NULL, pixs, sel)) == NULL)
485 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
528 l_int32 xp, yp, xn, yn, xmax, xbord;
531 PROCNAME(
"pixCloseSafe");
534 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
536 return (
PIX *)ERROR_PTR(
"sel not defined", procName, pixd);
537 if (pixGetDepth(pixs) != 1)
538 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
541 if (MORPH_BC == SYMMETRIC_MORPH_BC)
545 xmax = L_MAX(xp, xn);
546 xbord = 32 * ((xmax + 31) / 32);
549 return (
PIX *)ERROR_PTR(
"pixt1 not made", procName, pixd);
552 return (
PIX *)ERROR_PTR(
"pixt2 not made", procName, pixd);
597 PROCNAME(
"pixOpenGeneralized");
600 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
602 if ((pixt =
pixHMT(NULL, pixs, sel)) == NULL)
603 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
644 PROCNAME(
"pixCloseGeneralized");
647 return (
PIX *)ERROR_PTR(
"pixd not returned", procName, pixd);
649 if ((pixt =
pixDilate(NULL, pixs, sel)) == NULL)
650 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
694 SEL *sel, *selh, *selv;
696 PROCNAME(
"pixDilateBrick");
699 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
700 if (pixGetDepth(pixs) != 1)
701 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
702 if (hsize < 1 || vsize < 1)
703 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
705 if (hsize == 1 && vsize == 1)
707 if (hsize == 1 || vsize == 1) {
708 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
710 return (
PIX *)ERROR_PTR(
"sel not made", procName, pixd);
714 if ((selh =
selCreateBrick(1, hsize, 0, hsize / 2, SEL_HIT)) == NULL)
715 return (
PIX *)ERROR_PTR(
"selh not made", procName, pixd);
716 if ((selv =
selCreateBrick(vsize, 1, vsize / 2, 0, SEL_HIT)) == NULL) {
718 return (
PIX *)ERROR_PTR(
"selv not made", procName, pixd);
764 SEL *sel, *selh, *selv;
766 PROCNAME(
"pixErodeBrick");
769 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
770 if (pixGetDepth(pixs) != 1)
771 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
772 if (hsize < 1 || vsize < 1)
773 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
775 if (hsize == 1 && vsize == 1)
777 if (hsize == 1 || vsize == 1) {
778 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
780 return (
PIX *)ERROR_PTR(
"sel not made", procName, pixd);
784 if ((selh =
selCreateBrick(1, hsize, 0, hsize / 2, SEL_HIT)) == NULL)
785 return (
PIX *)ERROR_PTR(
"selh not made", procName, pixd);
786 if ((selv =
selCreateBrick(vsize, 1, vsize / 2, 0, SEL_HIT)) == NULL) {
788 return (
PIX *)ERROR_PTR(
"selv not made", procName, pixd);
834 SEL *sel, *selh, *selv;
836 PROCNAME(
"pixOpenBrick");
839 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
840 if (pixGetDepth(pixs) != 1)
841 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
842 if (hsize < 1 || vsize < 1)
843 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
845 if (hsize == 1 && vsize == 1)
847 if (hsize == 1 || vsize == 1) {
848 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
850 return (
PIX *)ERROR_PTR(
"sel not made", procName, pixd);
851 pixd =
pixOpen(pixd, pixs, sel);
854 if ((selh =
selCreateBrick(1, hsize, 0, hsize / 2, SEL_HIT)) == NULL)
855 return (
PIX *)ERROR_PTR(
"selh not made", procName, pixd);
856 if ((selv =
selCreateBrick(vsize, 1, vsize / 2, 0, SEL_HIT)) == NULL) {
858 return (
PIX *)ERROR_PTR(
"selv not made", procName, pixd);
906 SEL *sel, *selh, *selv;
908 PROCNAME(
"pixCloseBrick");
911 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
912 if (pixGetDepth(pixs) != 1)
913 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
914 if (hsize < 1 || vsize < 1)
915 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
917 if (hsize == 1 && vsize == 1)
919 if (hsize == 1 || vsize == 1) {
920 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
922 return (
PIX *)ERROR_PTR(
"sel not made", procName, pixd);
926 if ((selh =
selCreateBrick(1, hsize, 0, hsize / 2, SEL_HIT)) == NULL)
927 return (
PIX *)ERROR_PTR(
"selh not made", procName, pixd);
928 if ((selv =
selCreateBrick(vsize, 1, vsize / 2, 0, SEL_HIT)) == NULL) {
930 return (
PIX *)ERROR_PTR(
"selv not made", procName, pixd);
982 l_int32 maxtrans, bordsize;
983 PIX *pixsb, *pixt, *pixdb;
984 SEL *sel, *selh, *selv;
986 PROCNAME(
"pixCloseSafeBrick");
989 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
990 if (pixGetDepth(pixs) != 1)
991 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
992 if (hsize < 1 || vsize < 1)
993 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
995 if (hsize == 1 && vsize == 1)
999 if (MORPH_BC == SYMMETRIC_MORPH_BC)
1002 maxtrans = L_MAX(hsize / 2, vsize / 2);
1003 bordsize = 32 * ((maxtrans + 31) / 32);
1006 if (hsize == 1 || vsize == 1) {
1007 sel =
selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT);
1010 return (
PIX *)ERROR_PTR(
"sel not made", procName, pixd);
1012 pixdb =
pixClose(NULL, pixsb, sel);
1017 if (!selh || !selv) {
1021 return (
PIX *)ERROR_PTR(
"selh and selv not both made",
1077 selectComposableSels(l_int32 size,
1082 l_int32 factor1, factor2;
1084 PROCNAME(
"selectComposableSels");
1086 if (!psel1 && !psel2)
1087 return ERROR_INT(
"neither &sel1 nor &sel2 are defined", procName, 1);
1088 if (psel1) *psel1 = NULL;
1089 if (psel2) *psel2 = NULL;
1090 if (size < 1 || size > 10000)
1091 return ERROR_INT(
"size < 1 or size > 10000", procName, 1);
1092 if (direction != L_HORIZ && direction != L_VERT)
1093 return ERROR_INT(
"invalid direction", procName, 1);
1096 return ERROR_INT(
"factors not found", procName, 1);
1099 if (direction == L_HORIZ)
1136 l_int32 i, midval, val1, val2m, val2p;
1137 l_int32 index, prodm, prodp;
1138 l_int32 mincost, totcost, rastcostm, rastcostp, diffm, diffp;
1139 l_int32 lowval[256];
1141 l_int32 rastcost[256];
1144 PROCNAME(
"selectComposableSizes");
1146 if (size < 1 || size > 10000)
1147 return ERROR_INT(
"size < 1 or size > 10000", procName, 1);
1148 if (!pfactor1 || !pfactor2)
1149 return ERROR_INT(
"&factor1 or &factor2 not defined", procName, 1);
1151 midval = (l_int32)(sqrt((l_float64)size) + 0.001);
1152 if (midval * midval == size) {
1153 *pfactor1 = *pfactor2 = midval;
1159 for (val1 = midval + 1, i = 0; val1 > 0; val1--, i++) {
1160 val2m = size / val1;
1162 prodm = val1 * val2m;
1163 prodp = val1 * val2p;
1164 rastcostm = val1 + val2m - 2 * midval;
1165 rastcostp = val1 + val2p - 2 * midval;
1166 diffm = L_ABS(size - prodm);
1167 diffp = L_ABS(size - prodp);
1168 if (diffm <= diffp) {
1169 lowval[i] = L_MIN(val1, val2m);
1170 hival[i] = L_MAX(val1, val2m);
1171 rastcost[i] = rastcostm;
1174 lowval[i] = L_MIN(val1, val2p);
1175 hival[i] = L_MAX(val1, val2p);
1176 rastcost[i] = rastcostp;
1184 for (i = 0; i < midval + 1; i++) {
1185 if (diff[i] == 0 && rastcost[i] < ACCEPTABLE_COST) {
1186 *pfactor1 = hival[i];
1187 *pfactor2 = lowval[i];
1190 totcost = 4 * diff[i] + rastcost[i];
1191 if (totcost < mincost) {
1196 *pfactor1 = hival[index];
1197 *pfactor2 = lowval[index];
1249 PIX *pix1, *pix2, *pix3;
1255 PROCNAME(
"pixDilateCompBrick");
1258 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1259 if (pixGetDepth(pixs) != 1)
1260 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1261 if (hsize < 1 || vsize < 1)
1262 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1264 if (hsize == 1 && vsize == 1)
1267 if (selectComposableSels(hsize, L_HORIZ, &selh1, &selh2)) {
1270 return (
PIX *)ERROR_PTR(
"horiz sels not made", procName, pixd);
1274 if (selectComposableSels(vsize, L_VERT, &selv1, &selv2)) {
1279 return (
PIX *)ERROR_PTR(
"vert sels not made", procName, pixd);
1287 }
else if (hsize == 1) {
1366 PROCNAME(
"pixErodeCompBrick");
1369 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1370 if (pixGetDepth(pixs) != 1)
1371 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1372 if (hsize < 1 || vsize < 1)
1373 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1375 if (hsize == 1 && vsize == 1)
1378 if (selectComposableSels(hsize, L_HORIZ, &selh1, &selh2)) {
1381 return (
PIX *)ERROR_PTR(
"horiz sels not made", procName, pixd);
1385 if (selectComposableSels(vsize, L_VERT, &selv1, &selv2)) {
1390 return (
PIX *)ERROR_PTR(
"vert sels not made", procName, pixd);
1395 pixt =
pixErode(NULL, pixs, selh1);
1396 pixd =
pixErode(pixd, pixt, selh2);
1397 }
else if (hsize == 1) {
1398 pixt =
pixErode(NULL, pixs, selv1);
1399 pixd =
pixErode(pixd, pixt, selv2);
1401 pixt =
pixErode(NULL, pixs, selh1);
1402 pixd =
pixErode(pixd, pixt, selh2);
1468 PROCNAME(
"pixOpenCompBrick");
1471 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1472 if (pixGetDepth(pixs) != 1)
1473 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1474 if (hsize < 1 || vsize < 1)
1475 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1477 if (hsize == 1 && vsize == 1)
1480 if (selectComposableSels(hsize, L_HORIZ, &selh1, &selh2)) {
1483 return (
PIX *)ERROR_PTR(
"horiz sels not made", procName, pixd);
1487 if (selectComposableSels(vsize, L_VERT, &selv1, &selv2)) {
1492 return (
PIX *)ERROR_PTR(
"vert sels not made", procName, pixd);
1497 pixt =
pixErode(NULL, pixs, selh1);
1498 pixd =
pixErode(pixd, pixt, selh2);
1501 }
else if (hsize == 1) {
1502 pixt =
pixErode(NULL, pixs, selv1);
1503 pixd =
pixErode(pixd, pixt, selv2);
1507 pixt =
pixErode(NULL, pixs, selh1);
1508 pixd =
pixErode(pixd, pixt, selh2);
1578 PROCNAME(
"pixCloseCompBrick");
1581 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1582 if (pixGetDepth(pixs) != 1)
1583 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1584 if (hsize < 1 || vsize < 1)
1585 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1587 if (hsize == 1 && vsize == 1)
1590 if (selectComposableSels(hsize, L_HORIZ, &selh1, &selh2)) {
1593 return (
PIX *)ERROR_PTR(
"horiz sels not made", procName, pixd);
1597 if (selectComposableSels(vsize, L_VERT, &selv1, &selv2)) {
1602 return (
PIX *)ERROR_PTR(
"vert sels not made", procName, pixd);
1611 }
else if (hsize == 1) {
1687 l_int32 maxtrans, bordsize;
1688 PIX *pixsb, *pixt, *pixdb;
1694 PROCNAME(
"pixCloseSafeCompBrick");
1697 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1698 if (pixGetDepth(pixs) != 1)
1699 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1700 if (hsize < 1 || vsize < 1)
1701 return (
PIX *)ERROR_PTR(
"hsize and vsize not >= 1", procName, pixd);
1703 if (hsize == 1 && vsize == 1)
1707 if (MORPH_BC == SYMMETRIC_MORPH_BC)
1711 if (selectComposableSels(hsize, L_HORIZ, &selh1, &selh2)) {
1714 return (
PIX *)ERROR_PTR(
"horiz sels not made", procName, pixd);
1718 if (selectComposableSels(vsize, L_VERT, &selv1, &selv2)) {
1723 return (
PIX *)ERROR_PTR(
"vert sels not made", procName, pixd);
1727 maxtrans = L_MAX(hsize / 2, vsize / 2);
1728 bordsize = 32 * ((maxtrans + 31) / 32);
1736 }
else if (hsize == 1) {
1784 PROCNAME(
"resetMorphBoundaryCondition");
1786 if (bc != SYMMETRIC_MORPH_BC && bc != ASYMMETRIC_MORPH_BC) {
1787 L_WARNING(
"invalid bc; using asymmetric\n", procName);
1788 bc = ASYMMETRIC_MORPH_BC;
1806 PROCNAME(
"getMorphBorderPixelColor");
1808 if (type != L_MORPH_DILATE && type != L_MORPH_ERODE)
1809 return ERROR_INT(
"invalid type", procName, 0);
1810 if (depth != 1 && depth != 2 && depth != 4 && depth != 8 &&
1811 depth != 16 && depth != 32)
1812 return ERROR_INT(
"invalid depth", procName, 0);
1814 if (MORPH_BC == ASYMMETRIC_MORPH_BC || type == L_MORPH_DILATE)
1819 return ((1 << depth) - 1);
1851 PROCNAME(
"processMorphArgs1");
1854 return (
PIX *)ERROR_PTR(
"&pixt not defined", procName, pixd);
1857 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1859 return (
PIX *)ERROR_PTR(
"sel not defined", procName, pixd);
1860 if (pixGetDepth(pixs) != 1)
1861 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1864 if (sx == 0 || sy == 0)
1865 return (
PIX *)ERROR_PTR(
"sel of size 0", procName, pixd);
1871 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1876 if ((*ppixt =
pixCopy(NULL, pixs)) == NULL)
1877 return (
PIX *)ERROR_PTR(
"pixt not made", procName, pixd);
1898 PROCNAME(
"processMorphArgs2");
1901 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1903 return (
PIX *)ERROR_PTR(
"sel not defined", procName, pixd);
1904 if (pixGetDepth(pixs) != 1)
1905 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, pixd);
1908 if (sx == 0 || sy == 0)
1909 return (
PIX *)ERROR_PTR(
"sel of size 0", procName, pixd);
PIX * pixCloseSafe(PIX *pixd, PIX *pixs, SEL *sel)
pixCloseSafe()
PIX * pixOpenBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenBrick()
void resetMorphBoundaryCondition(l_int32 bc)
resetMorphBoundaryCondition()
PIX * pixOpen(PIX *pixd, PIX *pixs, SEL *sel)
pixOpen()
PIX * pixErode(PIX *pixd, PIX *pixs, SEL *sel)
pixErode()
l_ok selectComposableSizes(l_int32 size, l_int32 *pfactor1, l_int32 *pfactor2)
selectComposableSizes()
PIX * pixOpenCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenCompBrick()
PIX * pixOpenGeneralized(PIX *pixd, PIX *pixs, SEL *sel)
pixOpenGeneralized()
PIX * pixClose(PIX *pixd, PIX *pixs, SEL *sel)
pixClose()
static PIX * processMorphArgs1(PIX *pixd, PIX *pixs, SEL *sel, PIX **ppixt)
processMorphArgs1()
PIX * pixCloseSafeCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeCompBrick()
PIX * pixCloseSafeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeBrick()
PIX * pixErodeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeBrick()
PIX * pixCloseCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseCompBrick()
PIX * pixDilate(PIX *pixd, PIX *pixs, SEL *sel)
pixDilate()
PIX * pixHMT(PIX *pixd, PIX *pixs, SEL *sel)
pixHMT()
static PIX * processMorphArgs2(PIX *pixd, PIX *pixs, SEL *sel)
processMorphArgs2()
l_uint32 getMorphBorderPixelColor(l_int32 type, l_int32 depth)
getMorphBorderPixelColor()
PIX * pixDilateBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateBrick()
PIX * pixCloseBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseBrick()
PIX * pixCloseGeneralized(PIX *pixd, PIX *pixs, SEL *sel)
pixCloseGeneralized()
PIX * pixDilateCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateCompBrick()
PIX * pixErodeCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeCompBrick()
l_ok pixResizeImageData(PIX *pixd, const PIX *pixs)
pixResizeImageData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
PIX * pixClone(PIX *pixs)
pixClone()
l_ok pixClearAll(PIX *pix)
pixClearAll()
PIX * pixRemoveBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixRemoveBorderGeneral()
PIX * pixAddBorder(PIX *pixs, l_int32 npix, l_uint32 val)
pixAddBorder()
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()
PIX * pixRemoveBorder(PIX *pixs, l_int32 npix)
pixRemoveBorder()
l_ok pixSetAll(PIX *pix)
pixSetAll()
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()
l_ok selGetParameters(SEL *sel, l_int32 *psy, l_int32 *psx, l_int32 *pcy, l_int32 *pcx)
selGetParameters()
l_ok selFindMaxTranslations(SEL *sel, l_int32 *pxp, l_int32 *pyp, l_int32 *pxn, l_int32 *pyn)
selFindMaxTranslations()
SEL * selCreateComb(l_int32 factor1, l_int32 factor2, l_int32 direction)
selCreateComb()
void selDestroy(SEL **psel)
selDestroy()
SEL * selCreateBrick(l_int32 h, l_int32 w, l_int32 cy, l_int32 cx, l_int32 type)
selCreateBrick()