87#include <config_auto.h>
90#include "allheaders.h"
93#define SWAP(x, y) {temp = (x); (x) = (y); (y) = temp;}
118 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
121 pixd = pixDilateBrick(NULL, pixs, 3, 3);
123 pixd = pixErodeBrick(NULL, pixs, 3, 3);
124 pixXor(pixd, pixd, pixs);
152 const char *sequence,
158 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
160 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
162 pixd = pixMorphSequence(pixs, sequence, dispsep);
163 pixCombineMasked(pixd, pixs, pixm);
196 const char *sequence,
197 l_int32 connectivity,
202l_int32 n, i, x, y, w, h;
208 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
210 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
212 if (minw <= 0) minw = 1;
213 if (minh <= 0) minh = 1;
216 if ((boxa = pixConnComp(pixs, &pixas, connectivity)) == NULL)
217 return (
PIX *)ERROR_PTR(
"boxa not made", __func__, NULL);
224 return (
PIX *)ERROR_PTR(
"pixad not made", __func__, NULL);
227 pixd = pixCreateTemplate(pixs);
228 n = pixaGetCount(pixad);
229 for (i = 0; i < n; i++) {
230 pixaGetBoxGeometry(pixad, i, &x, &y, &w, &h);
231 pix = pixaGetPix(pixad, i,
L_CLONE);
232 pixRasterop(pixd, x, y, w, h,
PIX_PAINT, pix, 0, 0);
237 *pboxa = pixaGetBoxa(pixad,
L_CLONE);
264 const char *sequence,
268l_int32 n, i, w, h, d;
274 return (
PIXA *)ERROR_PTR(
"pixas not defined", __func__, NULL);
275 if ((n = pixaGetCount(pixas)) == 0)
276 return (
PIXA *)ERROR_PTR(
"no pix in pixas", __func__, NULL);
277 if (n != pixaGetBoxaCount(pixas))
278 L_WARNING(
"boxa size != n\n", __func__);
279 pixaGetPixDimensions(pixas, 0, NULL, NULL, &d);
281 return (
PIXA *)ERROR_PTR(
"depth not 1 bpp", __func__, NULL);
284 return (
PIXA *)ERROR_PTR(
"sequence not defined", __func__, NULL);
285 if (minw <= 0) minw = 1;
286 if (minh <= 0) minh = 1;
288 if ((pixad = pixaCreate(n)) == NULL)
289 return (
PIXA *)ERROR_PTR(
"pixad not made", __func__, NULL);
290 for (i = 0; i < n; i++) {
291 pixaGetPixDimensions(pixas, i, &w, &h, NULL);
292 if (w >= minw && h >= minh) {
293 if ((pix1 = pixaGetPix(pixas, i,
L_CLONE)) == NULL) {
295 return (
PIXA *)ERROR_PTR(
"pix1 not found", __func__, NULL);
297 if ((pix2 = pixMorphCompSequence(pix1, sequence, 0)) == NULL) {
299 return (
PIXA *)ERROR_PTR(
"pix2 not made", __func__, NULL);
302 box = pixaGetBox(pixas, i,
L_COPY);
346 const char *sequence,
347 l_int32 connectivity,
352l_int32 n, i, x, y, w, h;
357 if (pboxa) *pboxa = NULL;
359 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
361 return (
PIX *)ERROR_PTR(
"pixm not defined", __func__, NULL);
362 if (pixGetDepth(pixs) != 1 || pixGetDepth(pixm) != 1)
363 return (
PIX *)ERROR_PTR(
"pixs and pixm not both 1 bpp", __func__, NULL);
365 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
367 if (minw <= 0) minw = 1;
368 if (minh <= 0) minh = 1;
371 if ((boxa = pixConnComp(pixm, &pixam, connectivity)) == NULL)
372 return (
PIX *)ERROR_PTR(
"boxa not made", __func__, NULL);
379 return (
PIX *)ERROR_PTR(
"pixad not made", __func__, NULL);
382 pixd = pixCreateTemplate(pixs);
383 n = pixaGetCount(pixad);
384 for (i = 0; i < n; i++) {
385 pixaGetBoxGeometry(pixad, i, &x, &y, &w, &h);
386 pix = pixaGetPix(pixad, i,
L_CLONE);
387 pixRasterop(pixd, x, y, w, h,
PIX_PAINT, pix, 0, 0);
392 *pboxa = pixaGetBoxa(pixad,
L_CLONE);
423 const char *sequence,
427l_int32 n, i, w, h, same, maxd, fullpa, fullba;
429PIX *pix1, *pix2, *pix3;
433 return (
PIXA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
434 if (pixGetDepth(pixs) != 1)
435 return (
PIXA *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
437 return (
PIXA *)ERROR_PTR(
"sequence not defined", __func__, NULL);
439 return (
PIXA *)ERROR_PTR(
"pixam not defined", __func__, NULL);
440 pixaVerifyDepth(pixam, &same, &maxd);
442 return (
PIXA *)ERROR_PTR(
"mask depth not 1 bpp", __func__, NULL);
443 pixaIsFull(pixam, &fullpa, &fullba);
444 if (!fullpa || !fullba)
445 return (
PIXA *)ERROR_PTR(
"missing comps in pixam", __func__, NULL);
446 n = pixaGetCount(pixam);
447 if (minw <= 0) minw = 1;
448 if (minh <= 0) minh = 1;
450 if ((pixad = pixaCreate(n)) == NULL)
451 return (
PIXA *)ERROR_PTR(
"pixad not made", __func__, NULL);
456 for (i = 0; i < n; i++) {
457 pixaGetPixDimensions(pixam, i, &w, &h, NULL);
458 if (w >= minw && h >= minh) {
459 pix1 = pixaGetPix(pixam, i,
L_CLONE);
460 box = pixaGetBox(pixam, i,
L_COPY);
461 pix2 = pixClipRectangle(pixs, box, NULL);
462 pixAnd(pix2, pix2, pix1);
463 pix3 = pixMorphCompSequence(pix2, sequence, 0);
469 L_ERROR(
"pix3 not made in iter %d; aborting\n", __func__, i);
502 if (!pixs || pixGetDepth(pixs) != 1)
503 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", __func__, NULL);
505 return (
PIX *)ERROR_PTR(
"sela not defined", __func__, NULL);
506 n = selaGetCount(sela);
508 return (
PIX *)ERROR_PTR(
"no sels in sela", __func__, NULL);
509 if (type != L_MORPH_DILATE && type != L_MORPH_ERODE &&
510 type != L_MORPH_OPEN && type != L_MORPH_CLOSE &&
512 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
514 pixd = pixCreateTemplate(pixs);
515 for (i = 0; i < n; i++) {
516 sel = selaGetSel(sela, i);
517 if (type == L_MORPH_DILATE)
518 pixt = pixDilate(NULL, pixs, sel);
519 else if (type == L_MORPH_ERODE)
520 pixt = pixErode(NULL, pixs, sel);
521 else if (type == L_MORPH_OPEN)
522 pixt = pixOpen(NULL, pixs, sel);
523 else if (type == L_MORPH_CLOSE)
524 pixt = pixClose(NULL, pixs, sel);
526 pixt = pixHMT(NULL, pixs, sel);
527 pixOr(pixd, pixd, pixt);
553 if (!pixs || pixGetDepth(pixs) != 1)
554 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", __func__, NULL);
556 return (
PIX *)ERROR_PTR(
"sela not defined", __func__, NULL);
557 n = selaGetCount(sela);
559 return (
PIX *)ERROR_PTR(
"no sels in sela", __func__, NULL);
560 if (type != L_MORPH_DILATE && type != L_MORPH_ERODE &&
561 type != L_MORPH_OPEN && type != L_MORPH_CLOSE &&
563 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
565 pixd = pixCreateTemplate(pixs);
567 for (i = 0; i < n; i++) {
568 sel = selaGetSel(sela, i);
569 if (type == L_MORPH_DILATE)
570 pixt = pixDilate(NULL, pixs, sel);
571 else if (type == L_MORPH_ERODE)
572 pixt = pixErode(NULL, pixs, sel);
573 else if (type == L_MORPH_OPEN)
574 pixt = pixOpen(NULL, pixs, sel);
575 else if (type == L_MORPH_CLOSE)
576 pixt = pixClose(NULL, pixs, sel);
578 pixt = pixHMT(NULL, pixs, sel);
579 pixAnd(pixd, pixd, pixt);
602 l_int32 connectivity,
606l_int32 n, i, x, y, w, h;
608PIX *pix1, *pix2, *pixd;
612 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
613 if (pixGetDepth(pixs) != 1)
614 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
615 if (minw <= 0) minw = 1;
616 if (minh <= 0) minh = 1;
618 if ((boxa = pixConnComp(pixs, &pixa, connectivity)) == NULL)
619 return (
PIX *)ERROR_PTR(
"boxa not made", __func__, NULL);
620 n = boxaGetCount(boxa);
621 pixd = pixCopy(NULL, pixs);
622 for (i = 0; i < n; i++) {
623 boxaGetBoxGeometry(boxa, i, &x, &y, &w, &h);
624 if (w >= minw && h >= minh) {
625 pix1 = pixaGetPix(pixa, i,
L_CLONE);
626 if ((pix2 = pixHolesByFilling(pix1, 12 - connectivity)) == NULL) {
627 L_ERROR(
"pix2 not made in iter %d\n", __func__, i);
631 pixRasterop(pixd, x, y, w, h,
PIX_PAINT, pix2, 0, 0);
677l_int32 i, nc, x, y, w, h, xb, yb;
685 return ERROR_INT(
"pixs not defined", __func__, 1);
687 return ERROR_INT(
"pixp not defined", __func__, 1);
689 return ERROR_INT(
"pixe not defined", __func__, 1);
690 if (pixGetDepth(pixs) != 1 || pixGetDepth(pixp) != 1 ||
691 pixGetDepth(pixe) != 1)
692 return ERROR_INT(
"all input pix not 1 bpp", __func__, 1);
693 if (dsize < 0 || dsize > 4)
694 return ERROR_INT(
"dsize not in {0,1,2,3,4}", __func__, 1);
697 boxa = pixConnComp(pixe, &pixa, 8);
698 if ((nc = boxaGetCount(boxa)) == 0) {
699 L_WARNING(
"no matched patterns\n", __func__);
711 sel = selCreateBrick(2 * dsize + 1, 2 * dsize + 1, dsize, dsize,
713 pix1 = pixAddBorder(pixp, dsize, 0);
714 pix2 = pixDilate(NULL, pix1, sel);
718 pix2 = pixClone(pixp);
728 pixGetDimensions(pix2, &w, &h, NULL);
729 for (i = 0; i < nc; i++) {
730 ptaGetIPt(pta, i, &x, &y);
731 boxaGetBoxGeometry(boxa, i, &xb, &yb, NULL, NULL);
732 pixRasterop(pixs, xb + x - x0 - dsize, yb + y - y0 - dsize,
782l_int32 i, nc, xb, yb, x, y, xi, yi, rval, gval, bval;
784PIX *pixd, *pixt, *pixps;
790 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
792 return (
PIX *)ERROR_PTR(
"pixp not defined", __func__, NULL);
794 return (
PIX *)ERROR_PTR(
"pixe not defined", __func__, NULL);
795 if (pixGetDepth(pixs) != 1 || pixGetDepth(pixp) != 1 ||
796 pixGetDepth(pixe) != 1)
797 return (
PIX *)ERROR_PTR(
"all input pix not 1 bpp", __func__, NULL);
798 if (scale > 1.0 || scale <= 0.0) {
799 L_WARNING(
"scale > 1.0 or < 0.0; setting to 1.0\n", __func__);
804 boxa = pixConnComp(pixe, &pixa, 8);
805 if ((nc = boxaGetCount(boxa)) == 0) {
806 L_WARNING(
"no matched patterns\n", __func__);
813 extractRGBValues(color, &rval, &gval, &bval);
815 pixd = pixConvert1To4(NULL, pixs, 0, 1);
816 cmap = pixcmapCreate(4);
817 pixcmapAddColor(cmap, 255, 255, 255);
818 pixcmapAddColor(cmap, 0, 0, 0);
819 pixSetColormap(pixd, cmap);
828 for (i = 0; i < nc; i++) {
829 ptaGetIPt(pta, i, &x, &y);
830 boxaGetBoxGeometry(boxa, i, &xb, &yb, NULL, NULL);
831 pixSetMaskedCmap(pixd, pixp, xb + x - x0, yb + y - y0,
835 pixt = pixScaleToGray(pixs, scale);
836 pixd = pixThresholdTo4bpp(pixt, nlevels, 1);
837 pixps = pixScaleBySampling(pixp, scale, scale);
839 for (i = 0; i < nc; i++) {
840 ptaGetIPt(pta, i, &x, &y);
841 boxaGetBoxGeometry(boxa, i, &xb, &yb, NULL, NULL);
842 xi = (l_int32)(scale * (xb + x - x0));
843 yi = (l_int32)(scale * (yb + y - y0));
844 pixSetMaskedCmap(pixd, pixps, xi, yi, rval, gval, bval);
889l_int32 maxdepth, i, j, n;
890PIX *pix0, *pix1, *pix2;
895 return (
PIXA *)ERROR_PTR(
"pixas undefined", __func__, NULL);
897 L_INFO(
"niters = %d; nothing to do\n", __func__, niters);
898 return pixaCopy(pixas,
L_CLONE);
900 if (type != L_MORPH_DILATE && type != L_MORPH_ERODE)
901 return (
PIXA *)ERROR_PTR(
"invalid type", __func__, NULL);
902 pixaGetDepthInfo(pixas, &maxdepth, NULL);
904 return (
PIXA *)ERROR_PTR(
"some pix have bpp > 1", __func__, NULL);
907 selt = selCreateBrick(2, 2, 0, 0, SEL_HIT);
910 n = pixaGetCount(pixas);
911 pixad = pixaCreate(n * niters);
912 for (i = 0; i < n; i++) {
913 pix1 = pixaGetPix(pixas, i,
L_CLONE);
914 if (include) pixaAddPix(pixad, pix1,
L_COPY);
916 for (j = 0; j < niters; j++) {
917 if (type == L_MORPH_DILATE) {
918 pix2 = pixDilate(NULL, pix1, selt);
920 pix2 = pixErode(NULL, pix1, selt);
958l_int32 i, j, n, nsc, w, h, scalew, scaleh;
964 return (
PIXA *)ERROR_PTR(
"pixas undefined", __func__, NULL);
965 if (!nasc || numaGetCount(nasc) == 0)
966 return (
PIXA *)ERROR_PTR(
"nasc undefined or empty", __func__, NULL);
967 if (type != L_HORIZ && type != L_VERT && type != L_BOTH_DIRECTIONS)
968 return (
PIXA *)ERROR_PTR(
"invalid type", __func__, NULL);
970 n = pixaGetCount(pixas);
971 nsc = numaGetCount(nasc);
972 if ((pixad = pixaCreate(n * (nsc + 1))) == NULL) {
973 L_ERROR(
"pixad not made: n = %d, nsc = %d\n", __func__, n, nsc);
976 for (i = 0; i < n; i++) {
977 pix1 = pixaGetPix(pixas, i,
L_CLONE);
978 if (include) pixaAddPix(pixad, pix1,
L_COPY);
979 pixGetDimensions(pix1, &w, &h, NULL);
980 for (j = 0; j < nsc; j++) {
981 numaGetFValue(nasc, j, &scalefact);
984 if (type == L_HORIZ || type == L_BOTH_DIRECTIONS)
985 scalew = w * scalefact;
986 if (type == L_VERT || type == L_BOTH_DIRECTIONS)
987 scaleh = h * scalefact;
988 pix2 = pixScaleToSize(pix1, scalew, scaleh);
1022 l_int32 connectivity)
1025PIX *pixt, *pixd, *temp;
1028 if (!pixs || pixGetDepth(pixs) != 1)
1029 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", __func__, NULL);
1031 return (
PIX *)ERROR_PTR(
"mask pix not defined", __func__, NULL);
1032 if (connectivity != 4 && connectivity != 8)
1033 return (
PIX *)ERROR_PTR(
"connectivity not in {4,8}", __func__, NULL);
1034 if (maxiters <= 0) maxiters = 1000;
1035 if (pixSizesEqual(pixs, pixm) == 0)
1036 return (
PIX *)ERROR_PTR(
"pix sizes unequal", __func__, NULL);
1038 if ((sel_3 = selCreateBrick(3, 3, 1, 1, SEL_HIT)) == NULL)
1039 return (
PIX *)ERROR_PTR(
"sel_3 not made", __func__, NULL);
1040 if (connectivity == 4) {
1041 selSetElement(sel_3, 0, 0, SEL_DONT_CARE);
1042 selSetElement(sel_3, 2, 2, SEL_DONT_CARE);
1043 selSetElement(sel_3, 2, 0, SEL_DONT_CARE);
1044 selSetElement(sel_3, 0, 2, SEL_DONT_CARE);
1047 pixt = pixCopy(NULL, pixs);
1048 pixd = pixCreateTemplate(pixs);
1049 for (i = 1; i <= maxiters; i++) {
1050 pixDilate(pixd, pixt, sel_3);
1051 pixAnd(pixd, pixd, pixm);
1052 pixEqual(pixd, pixt, &same);
1053 if (same || i == maxiters)
1058 lept_stderr(
" Num iters in binary reconstruction = %d\n", i);
1084l_int32 count, i, size;
1087PIX *pix1, *pix2, *pix3;
1091 return (
NUMA *)ERROR_PTR(
"seed pix not defined", __func__, NULL);
1092 if (runtype != L_RUN_OFF && runtype != L_RUN_ON)
1093 return (
NUMA *)ERROR_PTR(
"invalid run type", __func__, NULL);
1094 if (direction != L_HORIZ && direction != L_VERT)
1095 return (
NUMA *)ERROR_PTR(
"direction not in {L_HORIZ, L_VERT}",
1097 if (pixGetDepth(pixs) != 1)
1098 return (
NUMA *)ERROR_PTR(
"pixs must be binary", __func__, NULL);
1100 if (direction == L_HORIZ)
1101 sel_2a = selCreateBrick(1, 2, 0, 0, SEL_HIT);
1103 sel_2a = selCreateBrick(2, 1, 0, 0, SEL_HIT);
1105 return (
NUMA *)ERROR_PTR(
"sel_2a not made", __func__, NULL);
1107 if (runtype == L_RUN_OFF) {
1108 if ((pix1 = pixCopy(NULL, pixs)) == NULL) {
1109 selDestroy(&sel_2a);
1110 return (
NUMA *)ERROR_PTR(
"pix1 not made", __func__, NULL);
1112 pixInvert(pix1, pix1);
1114 pix1 = pixClone(pixs);
1119 pix2 = pixCreateTemplate(pixs);
1120 pix3 = pixCreateTemplate(pixs);
1121 pixCountPixels(pix1, &count, NULL);
1122 numaAddNumber(na, count);
1123 pixErode(pix2, pix1, sel_2a);
1124 pixCountPixels(pix2, &count, NULL);
1125 numaAddNumber(na, count);
1126 for (i = 0; i < maxsize / 2; i++) {
1127 pixErode(pix3, pix2, sel_2a);
1128 pixCountPixels(pix3, &count, NULL);
1129 numaAddNumber(na, count);
1130 pixErode(pix2, pix3, sel_2a);
1131 pixCountPixels(pix2, &count, NULL);
1132 numaAddNumber(na, count);
1136 size = numaGetCount(na);
1137 nah = numaCreate(size);
1138 numaAddNumber(nah, 0);
1139 for (i = 1; i < size - 1; i++) {
1141 numaAddNumber(nah, val);
1147 selDestroy(&sel_2a);
1185 return (
PIX *)ERROR_PTR(
"seed pix not defined", __func__, NULL);
1186 if (pixGetDepth(pixs) != 8)
1187 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1188 if (hsize < 1 || vsize < 1)
1189 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", __func__, NULL);
1190 if ((hsize & 1) == 0 ) {
1191 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", __func__);
1194 if ((vsize & 1) == 0 ) {
1195 L_WARNING(
"vert sel size must be odd; increasing by 1\n", __func__);
1198 if (type != L_TOPHAT_WHITE && type != L_TOPHAT_BLACK)
1199 return (
PIX *)ERROR_PTR(
"type must be L_TOPHAT_BLACK or L_TOPHAT_WHITE",
1202 if (hsize == 1 && vsize == 1)
1203 return pixCreateTemplate(pixs);
1207 case L_TOPHAT_WHITE:
1208 if ((pixt = pixOpenGray(pixs, hsize, vsize)) == NULL)
1209 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
1210 pixd = pixSubtractGray(NULL, pixs, pixt);
1213 case L_TOPHAT_BLACK:
1214 if ((pixd = pixCloseGray(pixs, hsize, vsize)) == NULL)
1215 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
1216 pixSubtractGray(pixd, pixd, pixs);
1219 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
1277 l_int32 connectivity)
1282 return (
PIX *)ERROR_PTR(
"src pix not defined", __func__, NULL);
1283 if (pixGetDepth(pixs) != 8)
1284 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1286 return (
PIX *)ERROR_PTR(
"height not >= 0", __func__, NULL);
1288 return pixCreateTemplate(pixs);
1290 if ((pixsd = pixCopy(NULL, pixs)) == NULL)
1291 return (
PIX *)ERROR_PTR(
"pixsd not made", __func__, NULL);
1292 pixAddConstantGray(pixsd, -height);
1293 pixSeedfillGray(pixsd, pixs, connectivity);
1294 pixd = pixSubtractGray(NULL, pixs, pixsd);
1334PIX *pix1, *pix2, *pix3, *pixd;
1337 return (
PIX *)ERROR_PTR(
"seed pix not defined", __func__, NULL);
1338 if (pixGetDepth(pixs) != 8)
1339 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1340 if (xsize < 1 || ysize < 1)
1341 return (
PIX *)ERROR_PTR(
"size < 1", __func__, NULL);
1342 if (type != L_TOPHAT_WHITE && type != L_TOPHAT_BLACK)
1343 return (
PIX *)ERROR_PTR(
"type must be L_TOPHAT_BLACK or L_TOPHAT_WHITE",
1346 if (xsize == 1 && ysize == 1)
1347 return pixCreateTemplate(pixs);
1351 case L_TOPHAT_WHITE:
1352 if ((pix1 = pixScaleGrayMinMax(pixs, xsize, ysize, L_CHOOSE_MIN))
1354 return (
PIX *)ERROR_PTR(
"pix1 not made", __func__, NULL);
1355 pix2 = pixBlockconv(pix1, 1, 1);
1356 pix3 = pixScaleBySampling(pix2, xsize, ysize);
1357 pixd = pixSubtractGray(NULL, pixs, pix3);
1360 case L_TOPHAT_BLACK:
1361 if ((pix1 = pixScaleGrayMinMax(pixs, xsize, ysize, L_CHOOSE_MAX))
1363 return (
PIX *)ERROR_PTR(
"pix1 not made", __func__, NULL);
1364 pix2 = pixBlockconv(pix1, 1, 1);
1365 pixd = pixScaleBySampling(pix2, xsize, ysize);
1366 pixSubtractGray(pixd, pixd, pixs);
1369 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
1397 return (
PIX *)ERROR_PTR(
"seed pix not defined", __func__, NULL);
1398 if (pixGetDepth(pixs) != 8)
1399 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1400 if (hsize < 1 || vsize < 1)
1401 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", __func__, NULL);
1402 if ((hsize & 1) == 0 ) {
1403 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", __func__);
1406 if ((vsize & 1) == 0 ) {
1407 L_WARNING(
"vert sel size must be odd; increasing by 1\n", __func__);
1413 pixg = pixBlockconvGray(pixs, NULL, smoothing, smoothing);
1416 pixd = pixDilateGray(pixg, hsize, vsize);
1417 pixSubtractGray(pixd, pixd, pixg);
1444l_int32 *centtab = NULL;
1445l_int32 *sumtab = NULL;
1451 return (
PTA *)ERROR_PTR(
"pixa not defined", __func__, NULL);
1452 if ((n = pixaGetCount(pixa)) == 0)
1453 return (
PTA *)ERROR_PTR(
"no pix in pixa", __func__, NULL);
1455 if ((pta = ptaCreate(n)) == NULL)
1456 return (
PTA *)ERROR_PTR(
"pta not defined", __func__, NULL);
1457 centtab = makePixelCentroidTab8();
1458 sumtab = makePixelSumTab8();
1460 for (i = 0; i < n; i++) {
1461 pix = pixaGetPix(pixa, i,
L_CLONE);
1462 if (
pixCentroid(pix, centtab, sumtab, &x, &y) == 1)
1463 L_ERROR(
"centroid failure for pix %d\n", __func__, i);
1465 ptaAddPt(pta, x, y);
1500l_int32 w, h, d, i, j, wpl, pixsum, rowsum, val;
1501l_float32 xsum, ysum;
1502l_uint32 *data, *line;
1505l_int32 *ctab, *stab;
1507 if (!pxave || !pyave)
1508 return ERROR_INT(
"&pxave and &pyave not defined", __func__, 1);
1509 *pxave = *pyave = 0.0;
1511 return ERROR_INT(
"pix not defined", __func__, 1);
1512 pixGetDimensions(pix, &w, &h, &d);
1513 if (d != 1 && d != 8)
1514 return ERROR_INT(
"pix not 1 or 8 bpp", __func__, 1);
1519 pixSetPadBits(pix, 0);
1521 ctab = makePixelCentroidTab8();
1523 stab = makePixelSumTab8();
1526 data = pixGetData(pix);
1527 wpl = pixGetWpl(pix);
1531 for (i = 0; i < h; i++) {
1546 line = data + wpl * i;
1548 for (j = 0; j < wpl; j++) {
1552 rowsum += stab[byte];
1553 xsum += ctab[byte] + (j * 32 + 24) * stab[
byte];
1554 byte = (word >> 8) & 0xff;
1555 rowsum += stab[byte];
1556 xsum += ctab[byte] + (j * 32 + 16) * stab[
byte];
1557 byte = (word >> 16) & 0xff;
1558 rowsum += stab[byte];
1559 xsum += ctab[byte] + (j * 32 + 8) * stab[
byte];
1560 byte = (word >> 24) & 0xff;
1561 rowsum += stab[byte];
1562 xsum += ctab[byte] + j * 32 * stab[byte];
1569 L_WARNING(
"no ON pixels in pix\n", __func__);
1571 *pxave = xsum / (l_float32)pixsum;
1572 *pyave = ysum / (l_float32)pixsum;
1575 for (i = 0; i < h; i++) {
1576 line = data + wpl * i;
1577 for (j = 0; j < w; j++) {
1585 L_WARNING(
"all pixels are 0\n", __func__);
1587 *pxave = xsum / (l_float32)pixsum;
1588 *pyave = ysum / (l_float32)pixsum;
1593 if (!centtab) LEPT_FREE(ctab);
1594 if (!sumtab) LEPT_FREE(stab);
#define GET_DATA_BYTE(pdata, n)
PIXA * pixaExtendByScaling(PIXA *pixas, NUMA *nasc, l_int32 type, l_int32 include)
pixaExtendByScaling()
PIX * pixSelectiveConnCompFill(PIX *pixs, l_int32 connectivity, l_int32 minw, l_int32 minh)
pixSelectiveConnCompFill()
PIX * pixHDome(PIX *pixs, l_int32 height, l_int32 connectivity)
pixHDome()
NUMA * pixRunHistogramMorph(PIX *pixs, l_int32 runtype, l_int32 direction, l_int32 maxsize)
pixRunHistogramMorph()
PIXA * pixaExtendByMorph(PIXA *pixas, l_int32 type, l_int32 niters, SEL *sel, l_int32 include)
pixaExtendByMorph()
PTA * pixaCentroids(PIXA *pixa)
pixaCentroids()
PIX * pixMorphGradient(PIX *pixs, l_int32 hsize, l_int32 vsize, l_int32 smoothing)
pixMorphGradient()
PIX * pixExtractBoundary(PIX *pixs, l_int32 type)
pixExtractBoundary()
PIX * pixIntersectionOfMorphOps(PIX *pixs, SELA *sela, l_int32 type)
pixIntersectionOfMorphOps()
l_ok pixRemoveMatchedPattern(PIX *pixs, PIX *pixp, PIX *pixe, l_int32 x0, l_int32 y0, l_int32 dsize)
pixRemoveMatchedPattern()
PIX * pixMorphSequenceByRegion(PIX *pixs, PIX *pixm, const char *sequence, l_int32 connectivity, l_int32 minw, l_int32 minh, BOXA **pboxa)
pixMorphSequenceByRegion()
PIX * pixDisplayMatchedPattern(PIX *pixs, PIX *pixp, PIX *pixe, l_int32 x0, l_int32 y0, l_uint32 color, l_float32 scale, l_int32 nlevels)
pixDisplayMatchedPattern()
PIX * pixTophat(PIX *pixs, l_int32 hsize, l_int32 vsize, l_int32 type)
pixTophat()
PIXA * pixaMorphSequenceByComponent(PIXA *pixas, const char *sequence, l_int32 minw, l_int32 minh)
pixaMorphSequenceByComponent()
PIX * pixFastTophat(PIX *pixs, l_int32 xsize, l_int32 ysize, l_int32 type)
pixFastTophat()
PIX * pixSeedfillMorph(PIX *pixs, PIX *pixm, l_int32 maxiters, l_int32 connectivity)
pixSeedfillMorph()
l_ok pixCentroid(PIX *pix, l_int32 *centtab, l_int32 *sumtab, l_float32 *pxave, l_float32 *pyave)
pixCentroid()
PIX * pixMorphSequenceMasked(PIX *pixs, PIX *pixm, const char *sequence, l_int32 dispsep)
pixMorphSequenceMasked()
PIX * pixUnionOfMorphOps(PIX *pixs, SELA *sela, l_int32 type)
pixUnionOfMorphOps()
PIXA * pixaMorphSequenceByRegion(PIX *pixs, PIXA *pixam, const char *sequence, l_int32 minw, l_int32 minh)
pixaMorphSequenceByRegion()
PIX * pixMorphSequenceByComponent(PIX *pixs, const char *sequence, l_int32 connectivity, l_int32 minw, l_int32 minh, BOXA **pboxa)
pixMorphSequenceByComponent()