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", L_ABS(dispsep));
302 const char *sequence,
307l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
314 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
316 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
319 sa = sarrayCreate(0);
320 sarraySplitString(sa, sequence,
"+");
321 nops = sarrayGetCount(sa);
322 pdfout = (dispsep < 0) ? 1 : 0;
326 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
332 pixa = pixaCreate(0);
333 pixaAddPix(pixa, pixs,
L_CLONE);
336 pix1 = pixCopy(NULL, pixs);
339 for (i = 0; i < nops; i++) {
340 rawop = sarrayGetString(sa, i,
L_NOCOPY);
341 op = stringRemoveChars(rawop,
" \n\t");
346 sscanf(&op[1],
"%d.%d", &w, &h);
347 pix2 = pixDilateCompBrick(NULL, pix1, w, h);
348 pixSwapAndDestroy(&pix1, &pix2);
352 sscanf(&op[1],
"%d.%d", &w, &h);
353 pix2 = pixErodeCompBrick(NULL, pix1, w, h);
354 pixSwapAndDestroy(&pix1, &pix2);
358 sscanf(&op[1],
"%d.%d", &w, &h);
359 pixOpenCompBrick(pix1, pix1, w, h);
363 sscanf(&op[1],
"%d.%d", &w, &h);
364 pixCloseSafeCompBrick(pix1, pix1, w, h);
368 nred = strlen(op) - 1;
369 for (j = 0; j < nred; j++)
370 level[j] = op[j + 1] -
'0';
371 for (j = nred; j < 4; j++)
373 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
375 pixSwapAndDestroy(&pix1, &pix2);
379 sscanf(&op[1],
"%d", &fact);
380 pix2 = pixExpandReplicate(pix1, fact);
381 pixSwapAndDestroy(&pix1, &pix2);
385 sscanf(&op[1],
"%d", &border);
386 pix2 = pixAddBorder(pix1, border, 0);
387 pixSwapAndDestroy(&pix1, &pix2);
397 pixDisplay(pix1, x, 0);
401 pixaAddPix(pixa, pix1,
L_COPY);
404 pix2 = pixRemoveBorder(pix1, border);
405 pixSwapAndDestroy(&pix1, &pix2);
409 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
449 const char *sequence,
454l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
461 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
463 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
466 sa = sarrayCreate(0);
467 sarraySplitString(sa, sequence,
"+");
468 nops = sarrayGetCount(sa);
469 pdfout = (dispsep < 0) ? 1 : 0;
473 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
479 pixa = pixaCreate(0);
480 pixaAddPix(pixa, pixs,
L_CLONE);
483 pix1 = pixCopy(NULL, pixs);
486 for (i = 0; i < nops; i++) {
487 rawop = sarrayGetString(sa, i,
L_NOCOPY);
488 op = stringRemoveChars(rawop,
" \n\t");
493 sscanf(&op[1],
"%d.%d", &w, &h);
494 pix2 = pixDilateBrickDwa(NULL, pix1, w, h);
495 pixSwapAndDestroy(&pix1, &pix2);
499 sscanf(&op[1],
"%d.%d", &w, &h);
500 pix2 = pixErodeBrickDwa(NULL, pix1, w, h);
501 pixSwapAndDestroy(&pix1, &pix2);
505 sscanf(&op[1],
"%d.%d", &w, &h);
506 pixOpenBrickDwa(pix1, pix1, w, h);
510 sscanf(&op[1],
"%d.%d", &w, &h);
511 pixCloseBrickDwa(pix1, pix1, w, h);
515 nred = strlen(op) - 1;
516 for (j = 0; j < nred; j++)
517 level[j] = op[j + 1] -
'0';
518 for (j = nred; j < 4; j++)
520 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
522 pixSwapAndDestroy(&pix1, &pix2);
526 sscanf(&op[1],
"%d", &fact);
527 pix2 = pixExpandReplicate(pix1, fact);
528 pixSwapAndDestroy(&pix1, &pix2);
532 sscanf(&op[1],
"%d", &border);
533 pix2 = pixAddBorder(pix1, border, 0);
534 pixSwapAndDestroy(&pix1, &pix2);
544 pixDisplay(pix1, x, 0);
548 pixaAddPix(pixa, pix1,
L_COPY);
551 pix2 = pixRemoveBorder(pix1, border);
552 pixSwapAndDestroy(&pix1, &pix2);
556 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
596 const char *sequence,
601l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout;
608 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
610 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
613 sa = sarrayCreate(0);
614 sarraySplitString(sa, sequence,
"+");
615 nops = sarrayGetCount(sa);
616 pdfout = (dispsep < 0) ? 1 : 0;
620 return (
PIX *)ERROR_PTR(
"sequence not valid", __func__, NULL);
626 pixa = pixaCreate(0);
627 pixaAddPix(pixa, pixs,
L_CLONE);
630 pix1 = pixCopy(NULL, pixs);
633 for (i = 0; i < nops; i++) {
634 rawop = sarrayGetString(sa, i,
L_NOCOPY);
635 op = stringRemoveChars(rawop,
" \n\t");
640 sscanf(&op[1],
"%d.%d", &w, &h);
641 pix2 = pixDilateCompBrickDwa(NULL, pix1, w, h);
642 pixSwapAndDestroy(&pix1, &pix2);
646 sscanf(&op[1],
"%d.%d", &w, &h);
647 pix2 = pixErodeCompBrickDwa(NULL, pix1, w, h);
648 pixSwapAndDestroy(&pix1, &pix2);
652 sscanf(&op[1],
"%d.%d", &w, &h);
653 pixOpenCompBrickDwa(pix1, pix1, w, h);
657 sscanf(&op[1],
"%d.%d", &w, &h);
658 pixCloseCompBrickDwa(pix1, pix1, w, h);
662 nred = strlen(op) - 1;
663 for (j = 0; j < nred; j++)
664 level[j] = op[j + 1] -
'0';
665 for (j = nred; j < 4; j++)
667 pix2 = pixReduceRankBinaryCascade(pix1, level[0], level[1],
669 pixSwapAndDestroy(&pix1, &pix2);
673 sscanf(&op[1],
"%d", &fact);
674 pix2 = pixExpandReplicate(pix1, fact);
675 pixSwapAndDestroy(&pix1, &pix2);
679 sscanf(&op[1],
"%d", &border);
680 pix2 = pixAddBorder(pix1, border, 0);
681 pixSwapAndDestroy(&pix1, &pix2);
691 pixDisplay(pix1, x, 0);
695 pixaAddPix(pixa, pix1,
L_COPY);
698 pix2 = pixRemoveBorder(pix1, border);
699 pixSwapAndDestroy(&pix1, &pix2);
703 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
734char *rawop, *op = NULL;
735l_int32 nops, i, j, nred, fact, valid, w, h, netred, border;
737l_int32 intlogbase2[5] = {1, 2, 3, 0, 4};
740 return ERROR_INT(
"sa not defined", __func__, FALSE);
742 nops = sarrayGetCount(sa);
746 for (i = 0; i < nops; i++) {
747 rawop = sarrayGetString(sa, i,
L_NOCOPY);
748 op = stringRemoveChars(rawop,
" \n\t");
759 if (sscanf(&op[1],
"%d.%d", &w, &h) != 2) {
760 lept_stderr(
"*** op: %s invalid\n", op);
764 if (w <= 0 || h <= 0) {
765 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be > 0\n",
774 nred = strlen(op) - 1;
776 if (nred < 1 || nred > 4) {
778 "*** op = %s; num reduct = %d; must be in {1,2,3,4}\n",
783 for (j = 0; j < nred; j++) {
784 level[j] = op[j + 1] -
'0';
785 if (level[j] < 1 || level[j] > 4) {
786 lept_stderr(
"*** op = %s; level[%d] = %d is invalid\n",
795 for (j = 0; j < nred; j++) {
796 level[j] = op[j + 1] -
'0';
803 if (sscanf(&op[1],
"%d", &fact) != 1) {
804 lept_stderr(
"*** op: %s; fact invalid\n", op);
808 if (fact != 2 && fact != 4 && fact != 8 && fact != 16) {
809 lept_stderr(
"*** op = %s; invalid fact = %d\n", op, fact);
813 netred -= intlogbase2[fact / 4];
818 if (sscanf(&op[1],
"%d", &fact) != 1) {
819 lept_stderr(
"*** op: %s; fact invalid\n", op);
824 lept_stderr(
"*** op = %s; must be first op\n", op);
829 lept_stderr(
"*** op = %s; invalid fact = %d\n", op, fact);
837 lept_stderr(
"*** nonexistent op = %s\n", op);
843 if (border != 0 && netred != 0) {
844 lept_stderr(
"*** op = %s; border added but net reduction not 0\n", op);
904 const char *sequence,
910l_int32 nops, i, valid, w, h, x, pdfout;
916 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
918 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
921 sa = sarrayCreate(0);
922 sarraySplitString(sa, sequence,
"+");
923 nops = sarrayGetCount(sa);
924 pdfout = (dispsep < 0) ? 1 : 0;
928 for (i = 0; i < nops; i++) {
929 rawop = sarrayGetString(sa, i,
L_NOCOPY);
930 op = stringRemoveChars(rawop,
" \n\t");
941 if (sscanf(&op[1],
"%d.%d", &w, &h) != 2) {
942 lept_stderr(
"*** op: %s invalid\n", op);
946 if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
947 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be odd\n",
956 if (op[1] !=
'w' && op[1] !=
'W' &&
957 op[1] !=
'b' && op[1] !=
'B') {
959 "*** op = %s; arg %c must be 'w' or 'b'\n", op, op[1]);
963 sscanf(&op[2],
"%d.%d", &w, &h);
964 if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
965 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be odd\n",
973 lept_stderr(
"*** nonexistent op = %s\n", op);
980 return (
PIX *)ERROR_PTR(
"sequence invalid", __func__, NULL);
986 pixa = pixaCreate(0);
987 pixaAddPix(pixa, pixs,
L_CLONE);
989 pix1 = pixCopy(NULL, pixs);
992 for (i = 0; i < nops; i++) {
993 rawop = sarrayGetString(sa, i,
L_NOCOPY);
994 op = stringRemoveChars(rawop,
" \n\t");
999 sscanf(&op[1],
"%d.%d", &w, &h);
1000 pix2 = pixDilateGray(pix1, w, h);
1001 pixSwapAndDestroy(&pix1, &pix2);
1005 sscanf(&op[1],
"%d.%d", &w, &h);
1006 pix2 = pixErodeGray(pix1, w, h);
1007 pixSwapAndDestroy(&pix1, &pix2);
1011 sscanf(&op[1],
"%d.%d", &w, &h);
1012 pix2 = pixOpenGray(pix1, w, h);
1013 pixSwapAndDestroy(&pix1, &pix2);
1017 sscanf(&op[1],
"%d.%d", &w, &h);
1018 pix2 = pixCloseGray(pix1, w, h);
1019 pixSwapAndDestroy(&pix1, &pix2);
1023 sscanf(&op[2],
"%d.%d", &w, &h);
1024 if (op[1] ==
'w' || op[1] ==
'W')
1025 pix2 = pixTophat(pix1, w, h, L_TOPHAT_WHITE);
1027 pix2 = pixTophat(pix1, w, h, L_TOPHAT_BLACK);
1028 pixSwapAndDestroy(&pix1, &pix2);
1038 pixDisplay(pix1, x, dispy);
1042 pixaAddPix(pixa, pix1,
L_COPY);
1046 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",
1105 const char *sequence,
1111l_int32 nops, i, valid, w, h, x, pdfout;
1117 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1119 return (
PIX *)ERROR_PTR(
"sequence not defined", __func__, NULL);
1122 sa = sarrayCreate(0);
1123 sarraySplitString(sa, sequence,
"+");
1124 nops = sarrayGetCount(sa);
1125 pdfout = (dispsep < 0) ? 1 : 0;
1129 for (i = 0; i < nops; i++) {
1130 rawop = sarrayGetString(sa, i,
L_NOCOPY);
1131 op = stringRemoveChars(rawop,
" \n\t");
1142 if (sscanf(&op[1],
"%d.%d", &w, &h) != 2) {
1143 lept_stderr(
"*** op: %s invalid\n", op);
1147 if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
1148 lept_stderr(
"*** op: %s; w = %d, h = %d; must both be odd\n",
1156 lept_stderr(
"*** nonexistent op = %s\n", op);
1163 return (
PIX *)ERROR_PTR(
"sequence invalid", __func__, NULL);
1169 pixa = pixaCreate(0);
1170 pixaAddPix(pixa, pixs,
L_CLONE);
1172 pix1 = pixCopy(NULL, pixs);
1175 for (i = 0; i < nops; i++) {
1176 rawop = sarrayGetString(sa, i,
L_NOCOPY);
1177 op = stringRemoveChars(rawop,
" \n\t");
1182 sscanf(&op[1],
"%d.%d", &w, &h);
1183 pix2 = pixColorMorph(pix1, L_MORPH_DILATE, w, h);
1184 pixSwapAndDestroy(&pix1, &pix2);
1188 sscanf(&op[1],
"%d.%d", &w, &h);
1189 pix2 = pixColorMorph(pix1, L_MORPH_ERODE, w, h);
1190 pixSwapAndDestroy(&pix1, &pix2);
1194 sscanf(&op[1],
"%d.%d", &w, &h);
1195 pix2 = pixColorMorph(pix1, L_MORPH_OPEN, w, h);
1196 pixSwapAndDestroy(&pix1, &pix2);
1200 sscanf(&op[1],
"%d.%d", &w, &h);
1201 pix2 = pixColorMorph(pix1, L_MORPH_CLOSE, w, h);
1202 pixSwapAndDestroy(&pix1, &pix2);
1212 pixDisplay(pix1, x, dispy);
1216 pixaAddPix(pixa, pix1,
L_COPY);
1220 snprintf(fname,
sizeof(fname),
"/tmp/lept/seq_output_%d.pdf",