35#include <config_auto.h>
39#include "allheaders.h"
41PIX *pixMorphDwa_2(
PIX *pixd,
PIX *pixs, l_int32 operation,
char *selname);
42PIX *pixFMorphopGen_2(
PIX *pixd,
PIX *pixs, l_int32 operation,
char *selname);
43l_int32 fmorphopgen_low_2(l_uint32 *datad, l_int32 w,
44 l_int32 h, l_int32 wpld,
45 l_uint32 *datas, l_int32 wpls,
48static l_int32 NUM_SELS_GENERATED = 76;
49static char SEL_NAMES[][80] = {
147pixMorphDwa_2(
PIX *pixd,
152l_int32 bordercolor, bordersize;
153PIX *pixt1, *pixt2, *pixt3;
156 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
157 if (pixGetDepth(pixs) != 1)
158 return (
PIX *)ERROR_PTR(
"pixs must be 1 bpp", __func__, pixd);
161 bordercolor = getMorphBorderPixelColor(L_MORPH_ERODE, 1);
163 if (bordercolor == 0 && operation == L_MORPH_CLOSE)
166 pixt1 = pixAddBorder(pixs, bordersize, 0);
167 pixt2 = pixFMorphopGen_2(NULL, pixt1, operation, selname);
168 pixt3 = pixRemoveBorder(pixt2, bordersize);
175 pixCopy(pixd, pixt3);
205pixFMorphopGen_2(
PIX *pixd,
210l_int32 i, index, found, w, h, wpls, wpld, bordercolor, erodeop, borderop;
211l_uint32 *datad, *datas, *datat;
215 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
216 if (pixGetDepth(pixs) != 1)
217 return (
PIX *)ERROR_PTR(
"pixs must be 1 bpp", __func__, pixd);
220 bordercolor = getMorphBorderPixelColor(L_MORPH_ERODE, 1);
221 if (bordercolor == 1)
227 for (i = 0; i < NUM_SELS_GENERATED; i++) {
228 if (strcmp(selname, SEL_NAMES[i]) == 0) {
235 return (
PIX *)ERROR_PTR(
"sel index not found", __func__, pixd);
238 if ((pixd = pixCreateTemplate(pixs)) == NULL)
239 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
242 pixResizeImageData(pixd, pixs);
243 wpls = pixGetWpl(pixs);
244 wpld = pixGetWpl(pixd);
250 w = pixGetWidth(pixs) - 64;
251 h = pixGetHeight(pixs) - 64;
252 datas = pixGetData(pixs) + 32 * wpls + 1;
253 datad = pixGetData(pixd) + 32 * wpld + 1;
255 if (operation == L_MORPH_DILATE || operation == L_MORPH_ERODE) {
257 if (operation == L_MORPH_ERODE) {
262 if ((pixt = pixCopy(NULL, pixs)) == NULL)
263 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, pixd);
264 datat = pixGetData(pixt) + 32 * wpls + 1;
265 pixSetOrClearBorder(pixt, 32, 32, 32, 32, borderop);
266 fmorphopgen_low_2(datad, w, h, wpld, datat, wpls, index);
270 pixSetOrClearBorder(pixs, 32, 32, 32, 32, borderop);
271 fmorphopgen_low_2(datad, w, h, wpld, datas, wpls, index);
275 if ((pixt = pixCreateTemplate(pixs)) == NULL)
276 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, pixd);
277 datat = pixGetData(pixt) + 32 * wpls + 1;
278 if (operation == L_MORPH_OPEN) {
279 pixSetOrClearBorder(pixs, 32, 32, 32, 32, erodeop);
280 fmorphopgen_low_2(datat, w, h, wpls, datas, wpls, index+1);
281 pixSetOrClearBorder(pixt, 32, 32, 32, 32,
PIX_CLR);
282 fmorphopgen_low_2(datad, w, h, wpld, datat, wpls, index);
285 pixSetOrClearBorder(pixs, 32, 32, 32, 32,
PIX_CLR);
286 fmorphopgen_low_2(datat, w, h, wpls, datas, wpls, index);
287 pixSetOrClearBorder(pixt, 32, 32, 32, 32, erodeop);
288 fmorphopgen_low_2(datad, w, h, wpld, datat, wpls, index+1);