138 const char *sequence,
143l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
150 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
152 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
155 sa = sarrayCreate(0);
156 sarraySplitString(sa, sequence,
"+");
157 nops = sarrayGetCount(sa);
158 pdfout = (dispsep < 0) ? 1 : 0;
161 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
167 pixa = pixaCreate(0);
168 pixaAddPix(pixa, pixs,
L_CLONE);
171 pix1 = pixCopy(NULL, pixs);
174 for (i = 0; i < nops; i++) {
175 rawop = sarrayGetString(sa, i,
L_NOCOPY);
176 op = stringRemoveChars(rawop,
" \n\t");
181 sscanf(&op[1],
"%d.%d", &w, &h);
182 pix2 = pixDilateBrick(NULL, pix1, w, h);
183 pixSwapAndDestroy(&pix1, &pix2);
187 sscanf(&op[1],
"%d.%d", &w, &h);
188 pix2 = pixErodeBrick(NULL, pix1, w, h);
189 pixSwapAndDestroy(&pix1, &pix2);
193 sscanf(&op[1],
"%d.%d", &w, &h);
194 pixOpenBrick(pix1, pix1, w, h);
198 sscanf(&op[1],
"%d.%d", &w, &h);
199 pixCloseSafeBrick(pix1, pix1, w, h);
203 nred = strlen(op) - 1;
204 for (j = 0; j < nred; j++)
205 level[j] = op[j + 1] -
'0';
206 for (j = nred; j < 4; j++)
208 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
210 pixSwapAndDestroy(&pix1, &pix2);
214 sscanf(&op[1],
"%d", &fact);
215 pix2 = pixExpandReplicate(pix1, fact);
216 pixSwapAndDestroy(&pix1, &pix2);
220 sscanf(&op[1],
"%d", &border);
221 pix2 = pixAddBorder(pix1, border, 0);
222 pixSwapAndDestroy(&pix1, &pix2);
232 pixDisplay(pix1, x, 0);
236 pixaAddPix(pixa, pix1,
L_COPY);
239 pix2 = pixRemoveBorder(pix1, border);
240 pixSwapAndDestroy(&pix1, &pix2);
244 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
303 const char *sequence,
308l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
315 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
317 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
320 sa = sarrayCreate(0);
321 sarraySplitString(sa, sequence,
"+");
322 nops = sarrayGetCount(sa);
323 pdfout = (dispsep < 0) ? 1 : 0;
327 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
333 pixa = pixaCreate(0);
334 pixaAddPix(pixa, pixs,
L_CLONE);
337 pix1 = pixCopy(NULL, pixs);
340 for (i = 0; i < nops; i++) {
341 rawop = sarrayGetString(sa, i,
L_NOCOPY);
342 op = stringRemoveChars(rawop,
" \n\t");
347 sscanf(&op[1],
"%d.%d", &w, &h);
348 pix2 = pixDilateCompBrick(NULL, pix1, w, h);
349 pixSwapAndDestroy(&pix1, &pix2);
353 sscanf(&op[1],
"%d.%d", &w, &h);
354 pix2 = pixErodeCompBrick(NULL, pix1, w, h);
355 pixSwapAndDestroy(&pix1, &pix2);
359 sscanf(&op[1],
"%d.%d", &w, &h);
360 pixOpenCompBrick(pix1, pix1, w, h);
364 sscanf(&op[1],
"%d.%d", &w, &h);
365 pixCloseSafeCompBrick(pix1, pix1, w, h);
369 nred = strlen(op) - 1;
370 for (j = 0; j < nred; j++)
371 level[j] = op[j + 1] -
'0';
372 for (j = nred; j < 4; j++)
374 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
376 pixSwapAndDestroy(&pix1, &pix2);
380 sscanf(&op[1],
"%d", &fact);
381 pix2 = pixExpandReplicate(pix1, fact);
382 pixSwapAndDestroy(&pix1, &pix2);
386 sscanf(&op[1],
"%d", &border);
387 pix2 = pixAddBorder(pix1, border, 0);
388 pixSwapAndDestroy(&pix1, &pix2);
398 pixDisplay(pix1, x, 0);
402 pixaAddPix(pixa, pix1,
L_COPY);
405 pix2 = pixRemoveBorder(pix1, border);
406 pixSwapAndDestroy(&pix1, &pix2);
410 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
450 const char *sequence,
455l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
462 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
464 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
467 sa = sarrayCreate(0);
468 sarraySplitString(sa, sequence,
"+");
469 nops = sarrayGetCount(sa);
470 pdfout = (dispsep < 0) ? 1 : 0;
474 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
480 pixa = pixaCreate(0);
481 pixaAddPix(pixa, pixs,
L_CLONE);
484 pix1 = pixCopy(NULL, pixs);
487 for (i = 0; i < nops; i++) {
488 rawop = sarrayGetString(sa, i,
L_NOCOPY);
489 op = stringRemoveChars(rawop,
" \n\t");
494 sscanf(&op[1],
"%d.%d", &w, &h);
495 pix2 = pixDilateBrickDwa(NULL, pix1, w, h);
496 pixSwapAndDestroy(&pix1, &pix2);
500 sscanf(&op[1],
"%d.%d", &w, &h);
501 pix2 = pixErodeBrickDwa(NULL, pix1, w, h);
502 pixSwapAndDestroy(&pix1, &pix2);
506 sscanf(&op[1],
"%d.%d", &w, &h);
507 pixOpenBrickDwa(pix1, pix1, w, h);
511 sscanf(&op[1],
"%d.%d", &w, &h);
512 pixCloseBrickDwa(pix1, pix1, w, h);
516 nred = strlen(op) - 1;
517 for (j = 0; j < nred; j++)
518 level[j] = op[j + 1] -
'0';
519 for (j = nred; j < 4; j++)
521 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
523 pixSwapAndDestroy(&pix1, &pix2);
527 sscanf(&op[1],
"%d", &fact);
528 pix2 = pixExpandReplicate(pix1, fact);
529 pixSwapAndDestroy(&pix1, &pix2);
533 sscanf(&op[1],
"%d", &border);
534 pix2 = pixAddBorder(pix1, border, 0);
535 pixSwapAndDestroy(&pix1, &pix2);
545 pixDisplay(pix1, x, 0);
549 pixaAddPix(pixa, pix1,
L_COPY);
552 pix2 = pixRemoveBorder(pix1, border);
553 pixSwapAndDestroy(&pix1, &pix2);
557 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
597 const char *sequence,
602l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
609 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
611 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
614 sa = sarrayCreate(0);
615 sarraySplitString(sa, sequence,
"+");
616 nops = sarrayGetCount(sa);
617 pdfout = (dispsep < 0) ? 1 : 0;
621 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
627 pixa = pixaCreate(0);
628 pixaAddPix(pixa, pixs,
L_CLONE);
631 pix1 = pixCopy(NULL, pixs);
634 for (i = 0; i < nops; i++) {
635 rawop = sarrayGetString(sa, i,
L_NOCOPY);
636 op = stringRemoveChars(rawop,
" \n\t");
641 sscanf(&op[1],
"%d.%d", &w, &h);
642 pix2 = pixDilateCompBrickDwa(NULL, pix1, w, h);
643 pixSwapAndDestroy(&pix1, &pix2);
647 sscanf(&op[1],
"%d.%d", &w, &h);
648 pix2 = pixErodeCompBrickDwa(NULL, pix1, w, h);
649 pixSwapAndDestroy(&pix1, &pix2);
653 sscanf(&op[1],
"%d.%d", &w, &h);
654 pixOpenCompBrickDwa(pix1, pix1, w, h);
658 sscanf(&op[1],
"%d.%d", &w, &h);
659 pixCloseCompBrickDwa(pix1, pix1, w, h);
663 nred = strlen(op) - 1;
664 for (j = 0; j < nred; j++)
665 level[j] = op[j + 1] -
'0';
666 for (j = nred; j < 4; j++)
668 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
670 pixSwapAndDestroy(&pix1, &pix2);
674 sscanf(&op[1],
"%d", &fact);
675 pix2 = pixExpandReplicate(pix1, fact);
676 pixSwapAndDestroy(&pix1, &pix2);
680 sscanf(&op[1],
"%d", &border);
681 pix2 = pixAddBorder(pix1, border, 0);
682 pixSwapAndDestroy(&pix1, &pix2);
692 pixDisplay(pix1, x, 0);
696 pixaAddPix(pixa, pix1,
L_COPY);
699 pix2 = pixRemoveBorder(pix1, border);
700 pixSwapAndDestroy(&pix1, &pix2);
704 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
735char *rawop, *op = NULL;
736l_int32 nops, i, j, nred, fact, valid, w, h, netred, border;
738l_int32 intlogbase2[5] = {1, 2, 3, 0, 4};
741 return ERROR_INT(
"sa not defined", __func__, FALSE);
743 nops = sarrayGetCount(sa);
747 for (i = 0; i < nops; i++) {
748 rawop = sarrayGetString(sa, i,
L_NOCOPY);
749 op = stringRemoveChars(rawop,
" \n\t");
760 if (sscanf(&op[1],
"%d.%d", &w, &h) != 2) {
761 lept_stderr(
"*** op: %s invalid\n", op);
765 if (w <= 0 || h <= 0) {
766 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be > 0\n",
775 nred = strlen(op) - 1;
777 if (nred < 1 || nred > 4) {
779 "*** op = %s; num reduct = %d; must be in {1,2,3,4}\n",
784 for (j = 0; j < nred; j++) {
785 level[j] = op[j + 1] -
'0';
786 if (level[j] < 1 || level[j] > 4) {
787 lept_stderr(
"*** op = %s; level[%d] = %d is invalid\n",
796 for (j = 0; j < nred; j++) {
797 level[j] = op[j + 1] -
'0';
804 if (sscanf(&op[1],
"%d", &fact) != 1) {
805 lept_stderr(
"*** op: %s; fact invalid\n", op);
809 if (fact != 2 && fact != 4 && fact != 8 && fact != 16) {
810 lept_stderr(
"*** op = %s; invalid fact = %d\n", op, fact);
814 netred -= intlogbase2[fact / 4];
819 if (sscanf(&op[1],
"%d", &fact) != 1) {
820 lept_stderr(
"*** op: %s; fact invalid\n", op);
825 lept_stderr(
"*** op = %s; must be first op\n", op);
830 lept_stderr(
"*** op = %s; invalid fact = %d\n", op, fact);
838 lept_stderr(
"*** nonexistent op = %s\n", op);
844 if (border != 0 && netred != 0) {
845 lept_stderr(
"*** op = %s; border added but net reduction not 0\n", op);
905 const char *sequence,
911l_int32 nops, i, valid, w, h, x, pdfout;
917 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
919 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
922 sa = sarrayCreate(0);
923 sarraySplitString(sa, sequence,
"+");
924 nops = sarrayGetCount(sa);
925 pdfout = (dispsep < 0) ? 1 : 0;
929 for (i = 0; i < nops; i++) {
930 rawop = sarrayGetString(sa, i,
L_NOCOPY);
931 op = stringRemoveChars(rawop,
" \n\t");
942 if (sscanf(&op[1],
"%d.%d", &w, &h) != 2) {
943 lept_stderr(
"*** op: %s invalid\n", op);
947 if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
948 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be odd\n",
957 if (op[1] !=
'w' && op[1] !=
'W' &&
958 op[1] !=
'b' && op[1] !=
'B') {
960 "*** op = %s; arg %c must be 'w' or 'b'\n", op, op[1]);
964 sscanf(&op[2],
"%d.%d", &w, &h);
965 if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
966 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be odd\n",
974 lept_stderr(
"*** nonexistent op = %s\n", op);
981 return (
PIX *)ERROR_PTR(
"sequence invalid", __func__, NULL);
987 pixa = pixaCreate(0);
988 pixaAddPix(pixa, pixs,
L_CLONE);
990 pix1 = pixCopy(NULL, pixs);
993 for (i = 0; i < nops; i++) {
994 rawop = sarrayGetString(sa, i,
L_NOCOPY);
995 op = stringRemoveChars(rawop,
" \n\t");
1000 sscanf(&op[1],
"%d.%d", &w, &h);
1001 pix2 = pixDilateGray(pix1, w, h);
1002 pixSwapAndDestroy(&pix1, &pix2);
1006 sscanf(&op[1],
"%d.%d", &w, &h);
1007 pix2 = pixErodeGray(pix1, w, h);
1008 pixSwapAndDestroy(&pix1, &pix2);
1012 sscanf(&op[1],
"%d.%d", &w, &h);
1013 pix2 = pixOpenGray(pix1, w, h);
1014 pixSwapAndDestroy(&pix1, &pix2);
1018 sscanf(&op[1],
"%d.%d", &w, &h);
1019 pix2 = pixCloseGray(pix1, w, h);
1020 pixSwapAndDestroy(&pix1, &pix2);
1024 sscanf(&op[2],
"%d.%d", &w, &h);
1025 if (op[1] ==
'w' || op[1] ==
'W')
1026 pix2 = pixTophat(pix1, w, h, L_TOPHAT_WHITE);
1028 pix2 = pixTophat(pix1, w, h, L_TOPHAT_BLACK);
1029 pixSwapAndDestroy(&pix1, &pix2);
1039 pixDisplay(pix1, x, dispy);
1043 pixaAddPix(pixa, pix1,
L_COPY);
1047 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
1106 const char *sequence,
1112l_int32 nops, i, valid, w, h, x, pdfout;
1118 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1120 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
1123 sa = sarrayCreate(0);
1124 sarraySplitString(sa, sequence,
"+");
1125 nops = sarrayGetCount(sa);
1126 pdfout = (dispsep < 0) ? 1 : 0;
1130 for (i = 0; i < nops; i++) {
1131 rawop = sarrayGetString(sa, i,
L_NOCOPY);
1132 op = stringRemoveChars(rawop,
" \n\t");
1143 if (sscanf(&op[1],
"%d.%d", &w, &h) != 2) {
1144 lept_stderr(
"*** op: %s invalid\n", op);
1148 if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
1149 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be odd\n",
1157 lept_stderr(
"*** nonexistent op = %s\n", op);
1164 return (
PIX *)ERROR_PTR(
"sequence invalid", __func__, NULL);
1170 pixa = pixaCreate(0);
1171 pixaAddPix(pixa, pixs,
L_CLONE);
1173 pix1 = pixCopy(NULL, pixs);
1176 for (i = 0; i < nops; i++) {
1177 rawop = sarrayGetString(sa, i,
L_NOCOPY);
1178 op = stringRemoveChars(rawop,
" \n\t");
1183 sscanf(&op[1],
"%d.%d", &w, &h);
1184 pix2 = pixColorMorph(pix1, L_MORPH_DILATE, w, h);
1185 pixSwapAndDestroy(&pix1, &pix2);
1189 sscanf(&op[1],
"%d.%d", &w, &h);
1190 pix2 = pixColorMorph(pix1, L_MORPH_ERODE, w, h);
1191 pixSwapAndDestroy(&pix1, &pix2);
1195 sscanf(&op[1],
"%d.%d", &w, &h);
1196 pix2 = pixColorMorph(pix1, L_MORPH_OPEN, w, h);
1197 pixSwapAndDestroy(&pix1, &pix2);
1201 sscanf(&op[1],
"%d.%d", &w, &h);
1202 pix2 = pixColorMorph(pix1, L_MORPH_CLOSE, w, h);
1203 pixSwapAndDestroy(&pix1, &pix2);
1213 pixDisplay(pix1, x, dispy);
1217 pixaAddPix(pixa, pix1,
L_COPY);
1221 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",