35#include "allheaders.h"
37PIX *pixMorphDwa_1(
PIX *pixd,
PIX *pixs, l_int32 operation,
char *selname);
38PIX *pixFMorphopGen_1(
PIX *pixd,
PIX *pixs, l_int32 operation,
char *selname);
39l_int32 fmorphopgen_low_1(l_uint32 *datad, l_int32 w,
40 l_int32 h, l_int32 wpld,
41 l_uint32 *datas, l_int32 wpls,
44static l_int32 NUM_SELS_GENERATED = 58;
45static char SEL_NAMES[][80] = {
125pixMorphDwa_1(
PIX *pixd,
130l_int32 bordercolor, bordersize;
131PIX *pixt1, *pixt2, *pixt3;
134 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
135 if (pixGetDepth(pixs) != 1)
136 return (
PIX *)ERROR_PTR(
"pixs must be 1 bpp", __func__, pixd);
139 bordercolor = getMorphBorderPixelColor(L_MORPH_ERODE, 1);
141 if (bordercolor == 0 && operation == L_MORPH_CLOSE)
144 pixt1 = pixAddBorder(pixs, bordersize, 0);
145 pixt2 = pixFMorphopGen_1(NULL, pixt1, operation, selname);
146 pixt3 = pixRemoveBorder(pixt2, bordersize);
153 pixCopy(pixd, pixt3);
183pixFMorphopGen_1(
PIX *pixd,
188l_int32 i, index, found, w, h, wpls, wpld, bordercolor, erodeop, borderop;
189l_uint32 *datad, *datas, *datat;
193 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
194 if (pixGetDepth(pixs) != 1)
195 return (
PIX *)ERROR_PTR(
"pixs must be 1 bpp", __func__, pixd);
198 bordercolor = getMorphBorderPixelColor(L_MORPH_ERODE, 1);
199 if (bordercolor == 1)
205 for (i = 0; i < NUM_SELS_GENERATED; i++) {
206 if (strcmp(selname, SEL_NAMES[i]) == 0) {
213 return (
PIX *)ERROR_PTR(
"sel index not found", __func__, pixd);
216 if ((pixd = pixCreateTemplate(pixs)) == NULL)
217 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
220 pixResizeImageData(pixd, pixs);
221 wpls = pixGetWpl(pixs);
222 wpld = pixGetWpl(pixd);
228 w = pixGetWidth(pixs) - 64;
229 h = pixGetHeight(pixs) - 64;
230 datas = pixGetData(pixs) + 32 * wpls + 1;
231 datad = pixGetData(pixd) + 32 * wpld + 1;
233 if (operation == L_MORPH_DILATE || operation == L_MORPH_ERODE) {
235 if (operation == L_MORPH_ERODE) {
240 if ((pixt = pixCopy(NULL, pixs)) == NULL)
241 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, pixd);
242 datat = pixGetData(pixt) + 32 * wpls + 1;
243 pixSetOrClearBorder(pixt, 32, 32, 32, 32, borderop);
244 fmorphopgen_low_1(datad, w, h, wpld, datat, wpls, index);
248 pixSetOrClearBorder(pixs, 32, 32, 32, 32, borderop);
249 fmorphopgen_low_1(datad, w, h, wpld, datas, wpls, index);
253 if ((pixt = pixCreateTemplate(pixs)) == NULL)
254 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, pixd);
255 datat = pixGetData(pixt) + 32 * wpls + 1;
256 if (operation == L_MORPH_OPEN) {
257 pixSetOrClearBorder(pixs, 32, 32, 32, 32, erodeop);
258 fmorphopgen_low_1(datat, w, h, wpls, datas, wpls, index+1);
259 pixSetOrClearBorder(pixt, 32, 32, 32, 32,
PIX_CLR);
260 fmorphopgen_low_1(datad, w, h, wpld, datat, wpls, index);
263 pixSetOrClearBorder(pixs, 32, 32, 32, 32,
PIX_CLR);
264 fmorphopgen_low_1(datat, w, h, wpls, datas, wpls, index);
265 pixSetOrClearBorder(pixt, 32, 32, 32, 32, erodeop);
266 fmorphopgen_low_1(datad, w, h, wpld, datat, wpls, index+1);