-------------------------------------------------------------------------* * Run a sequence of binary rasterop morphological operations * *-------------------------------------------------------------------------*/ ! * \brief pixMorphSequence() * * \param[in] pixs * \param[in] sequence string specifying sequence * \param[in] dispsep controls debug display of each res
| 130 | * </pre> |
| 131 | */ |
| 132 | PIX * |
| 133 | pixMorphSequence(PIX *pixs, |
| 134 | const char *sequence, |
| 135 | l_int32 dispsep) |
| 136 | { |
| 137 | char *rawop, *op; |
| 138 | char fname[256]; |
| 139 | l_int32 nops, i, j, nred, fact, w, h, x, border, pdfout; |
| 140 | l_int32 level[4]; |
| 141 | PIX *pix1, *pix2; |
| 142 | PIXA *pixa; |
| 143 | SARRAY *sa; |
| 144 | |
| 145 | PROCNAME("pixMorphSequence"); |
| 146 | |
| 147 | if (!pixs) |
| 148 | return (PIX *)ERROR_PTR("pixs not defined", procName, NULL); |
| 149 | if (!sequence) |
| 150 | return (PIX *)ERROR_PTR("sequence not defined", procName, NULL); |
| 151 | |
| 152 | /* Split sequence into individual operations */ |
| 153 | sa = sarrayCreate(0); |
| 154 | sarraySplitString(sa, sequence, "+"); |
| 155 | nops = sarrayGetCount(sa); |
| 156 | pdfout = (dispsep < 0) ? 1 : 0; |
| 157 | if (!morphSequenceVerify(sa)) { |
| 158 | sarrayDestroy(&sa); |
| 159 | return (PIX *)ERROR_PTR("sequence not valid", procName, NULL); |
| 160 | } |
| 161 | |
| 162 | /* Parse and operate */ |
| 163 | pixa = NULL; |
| 164 | if (pdfout) { |
| 165 | pixa = pixaCreate(0); |
| 166 | pixaAddPix(pixa, pixs, L_CLONE); |
| 167 | } |
| 168 | border = 0; |
| 169 | pix1 = pixCopy(NULL, pixs); |
| 170 | pix2 = NULL; |
| 171 | x = 0; |
| 172 | for (i = 0; i < nops; i++) { |
| 173 | rawop = sarrayGetString(sa, i, L_NOCOPY); |
| 174 | op = stringRemoveChars(rawop, " \n\t"); |
| 175 | switch (op[0]) |
| 176 | { |
| 177 | case 'd': |
| 178 | case 'D': |
| 179 | sscanf(&op[1], "%d.%d", &w, &h); |
| 180 | pix2 = pixDilateBrick(NULL, pix1, w, h); |
| 181 | pixSwapAndDestroy(&pix1, &pix2); |
| 182 | break; |
| 183 | case 'e': |
| 184 | case 'E': |
| 185 | sscanf(&op[1], "%d.%d", &w, &h); |
| 186 | pix2 = pixErodeBrick(NULL, pix1, w, h); |
| 187 | pixSwapAndDestroy(&pix1, &pix2); |
| 188 | break; |
| 189 | case 'o': |
no test coverage detected