-------------------------------------------------------------------------* * Run a sequence of binary dwa morphological operations * *-------------------------------------------------------------------------*/ ! * \brief pixMorphSequenceDwa() * * \param[in] pixs * \param[in] sequence string specifying sequence * \param[in] dispsep controls debug display of each
| 446 | * </pre> |
| 447 | */ |
| 448 | PIX * |
| 449 | pixMorphSequenceDwa(PIX *pixs, |
| 450 | const char *sequence, |
| 451 | l_int32 dispsep) |
| 452 | { |
| 453 | char *rawop, *op; |
| 454 | char fname[256]; |
| 455 | l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout; |
| 456 | l_int32 level[4]; |
| 457 | PIX *pix1, *pix2; |
| 458 | PIXA *pixa; |
| 459 | SARRAY *sa; |
| 460 | |
| 461 | PROCNAME("pixMorphSequenceDwa"); |
| 462 | |
| 463 | if (!pixs) |
| 464 | return (PIX *)ERROR_PTR("pixs not defined", procName, NULL); |
| 465 | if (!sequence) |
| 466 | return (PIX *)ERROR_PTR("sequence not defined", procName, NULL); |
| 467 | |
| 468 | /* Split sequence into individual operations */ |
| 469 | sa = sarrayCreate(0); |
| 470 | sarraySplitString(sa, sequence, "+"); |
| 471 | nops = sarrayGetCount(sa); |
| 472 | pdfout = (dispsep < 0) ? 1 : 0; |
| 473 | |
| 474 | if (!morphSequenceVerify(sa)) { |
| 475 | sarrayDestroy(&sa); |
| 476 | return (PIX *)ERROR_PTR("sequence not valid", procName, NULL); |
| 477 | } |
| 478 | |
| 479 | /* Parse and operate */ |
| 480 | pixa = NULL; |
| 481 | if (pdfout) { |
| 482 | pixa = pixaCreate(0); |
| 483 | pixaAddPix(pixa, pixs, L_CLONE); |
| 484 | } |
| 485 | border = 0; |
| 486 | pix1 = pixCopy(NULL, pixs); |
| 487 | pix2 = NULL; |
| 488 | x = 0; |
| 489 | for (i = 0; i < nops; i++) { |
| 490 | rawop = sarrayGetString(sa, i, L_NOCOPY); |
| 491 | op = stringRemoveChars(rawop, " \n\t"); |
| 492 | switch (op[0]) |
| 493 | { |
| 494 | case 'd': |
| 495 | case 'D': |
| 496 | sscanf(&op[1], "%d.%d", &w, &h); |
| 497 | pix2 = pixDilateBrickDwa(NULL, pix1, w, h); |
| 498 | pixSwapAndDestroy(&pix1, &pix2); |
| 499 | break; |
| 500 | case 'e': |
| 501 | case 'E': |
| 502 | sscanf(&op[1], "%d.%d", &w, &h); |
| 503 | pix2 = pixErodeBrickDwa(NULL, pix1, w, h); |
| 504 | pixSwapAndDestroy(&pix1, &pix2); |
| 505 | break; |
no test coverage detected