-----------------------------------------------------------------* * Union and intersection of parallel composite operations * *-----------------------------------------------------------------*/ ! * \brief pixUnionOfMorphOps() * * \param[in] pixs binary * \param[in] sela * \param[in] type L_MORPH_DILATE, etc. * \return pixd union of the specified morphological operatio
| 499 | * on pixs for each Sel in the Sela, or NULL on error |
| 500 | */ |
| 501 | PIX * |
| 502 | pixUnionOfMorphOps(PIX *pixs, |
| 503 | SELA *sela, |
| 504 | l_int32 type) |
| 505 | { |
| 506 | l_int32 n, i; |
| 507 | PIX *pixt, *pixd; |
| 508 | SEL *sel; |
| 509 | |
| 510 | PROCNAME("pixUnionOfMorphOps"); |
| 511 | |
| 512 | if (!pixs || pixGetDepth(pixs) != 1) |
| 513 | return (PIX *)ERROR_PTR("pixs undefined or not 1 bpp", procName, NULL); |
| 514 | if (!sela) |
| 515 | return (PIX *)ERROR_PTR("sela not defined", procName, NULL); |
| 516 | n = selaGetCount(sela); |
| 517 | if (n == 0) |
| 518 | return (PIX *)ERROR_PTR("no sels in sela", procName, NULL); |
| 519 | if (type != L_MORPH_DILATE && type != L_MORPH_ERODE && |
| 520 | type != L_MORPH_OPEN && type != L_MORPH_CLOSE && |
| 521 | type != L_MORPH_HMT) |
| 522 | return (PIX *)ERROR_PTR("invalid type", procName, NULL); |
| 523 | |
| 524 | pixd = pixCreateTemplate(pixs); |
| 525 | for (i = 0; i < n; i++) { |
| 526 | sel = selaGetSel(sela, i); |
| 527 | if (type == L_MORPH_DILATE) |
| 528 | pixt = pixDilate(NULL, pixs, sel); |
| 529 | else if (type == L_MORPH_ERODE) |
| 530 | pixt = pixErode(NULL, pixs, sel); |
| 531 | else if (type == L_MORPH_OPEN) |
| 532 | pixt = pixOpen(NULL, pixs, sel); |
| 533 | else if (type == L_MORPH_CLOSE) |
| 534 | pixt = pixClose(NULL, pixs, sel); |
| 535 | else /* type == L_MORPH_HMT */ |
| 536 | pixt = pixHMT(NULL, pixs, sel); |
| 537 | pixOr(pixd, pixd, pixt); |
| 538 | pixDestroy(&pixt); |
| 539 | } |
| 540 | |
| 541 | return pixd; |
| 542 | } |
| 543 | |
| 544 | |
| 545 | /*! |
nothing calls this directly
no test coverage detected