166l_uint8 *buffer, *minarray;
167l_int32 w, h, wplb, wplt;
168l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
169l_uint32 *datab, *datat;
170PIX *pixb, *pixt, *pixd;
173 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
174 if (pixGetDepth(pixs) != 8)
175 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
176 if (hsize < 1 || vsize < 1)
177 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", __func__, NULL);
178 if ((hsize & 1) == 0 ) {
179 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", __func__);
182 if ((vsize & 1) == 0 ) {
183 L_WARNING(
"vert sel size must be odd; increasing by 1\n", __func__);
187 pixb = pixt = pixd = NULL;
188 buffer = minarray = NULL;
190 if (hsize == 1 && vsize == 1)
191 return pixCopy(NULL, pixs);
194 leftpix = (hsize + 1) / 2;
195 rightpix = (3 * hsize + 1) / 2;
198 }
else if (hsize == 1) {
201 toppix = (vsize + 1) / 2;
202 bottompix = (3 * vsize + 1) / 2;
204 leftpix = (hsize + 1) / 2;
205 rightpix = (3 * hsize + 1) / 2;
206 toppix = (vsize + 1) / 2;
207 bottompix = (3 * vsize + 1) / 2;
210 pixb = pixAddBorderGeneral(pixs, leftpix, rightpix, toppix, bottompix, 255);
211 pixt = pixCreateTemplate(pixb);
212 if (!pixb || !pixt) {
213 L_ERROR(
"pixb and pixt not made\n", __func__);
217 pixGetDimensions(pixt, &w, &h, NULL);
218 datab = pixGetData(pixb);
219 datat = pixGetData(pixt);
220 wplb = pixGetWpl(pixb);
221 wplt = pixGetWpl(pixt);
223 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
224 maxsize = L_MAX(hsize, vsize);
225 minarray = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
226 if (!buffer || !minarray) {
227 L_ERROR(
"buffer and minarray not made\n", __func__);
232 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
234 }
else if (hsize == 1) {
235 erodeGrayLow(datat, w, h, wplt, datab, wplb, vsize, L_VERT,
238 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
240 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
242 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
245 pixt = pixClone(pixb);
248 pixd = pixRemoveBorderGeneral(pixt, leftpix, rightpix, toppix, bottompix);
250 L_ERROR(
"pixd not made\n", __func__);
280l_uint8 *buffer, *maxarray;
281l_int32 w, h, wplb, wplt;
282l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
283l_uint32 *datab, *datat;
284PIX *pixb, *pixt, *pixd;
287 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
288 if (pixGetDepth(pixs) != 8)
289 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
290 if (hsize < 1 || vsize < 1)
291 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", __func__, NULL);
292 if ((hsize & 1) == 0 ) {
293 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", __func__);
296 if ((vsize & 1) == 0 ) {
297 L_WARNING(
"vert sel size must be odd; increasing by 1\n", __func__);
301 pixb = pixt = pixd = NULL;
302 buffer = maxarray = NULL;
304 if (hsize == 1 && vsize == 1)
305 return pixCopy(NULL, pixs);
308 leftpix = (hsize + 1) / 2;
309 rightpix = (3 * hsize + 1) / 2;
312 }
else if (hsize == 1) {
315 toppix = (vsize + 1) / 2;
316 bottompix = (3 * vsize + 1) / 2;
318 leftpix = (hsize + 1) / 2;
319 rightpix = (3 * hsize + 1) / 2;
320 toppix = (vsize + 1) / 2;
321 bottompix = (3 * vsize + 1) / 2;
324 pixb = pixAddBorderGeneral(pixs, leftpix, rightpix, toppix, bottompix, 0);
325 pixt = pixCreateTemplate(pixb);
326 if (!pixb || !pixt) {
327 L_ERROR(
"pixb and pixt not made\n", __func__);
331 pixGetDimensions(pixt, &w, &h, NULL);
332 datab = pixGetData(pixb);
333 datat = pixGetData(pixt);
334 wplb = pixGetWpl(pixb);
335 wplt = pixGetWpl(pixt);
337 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
338 maxsize = L_MAX(hsize, vsize);
339 maxarray = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
340 if (!buffer || !maxarray) {
341 L_ERROR(
"buffer and maxarray not made\n", __func__);
346 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
348 }
else if (hsize == 1) {
352 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
354 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
359 pixt = pixClone(pixb);
362 pixd = pixRemoveBorderGeneral(pixt, leftpix, rightpix, toppix, bottompix);
364 L_ERROR(
"pixd not made\n", __func__);
396l_int32 w, h, wplb, wplt;
397l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
398l_uint32 *datab, *datat;
399PIX *pixb, *pixt, *pixd;
402 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
403 if (pixGetDepth(pixs) != 8)
404 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
405 if (hsize < 1 || vsize < 1)
406 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", __func__, NULL);
407 if ((hsize & 1) == 0 ) {
408 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", __func__);
411 if ((vsize & 1) == 0 ) {
412 L_WARNING(
"vert sel size must be odd; increasing by 1\n", __func__);
416 pixb = pixt = pixd = NULL;
417 buffer = array = NULL;
419 if (hsize == 1 && vsize == 1)
420 return pixCopy(NULL, pixs);
423 leftpix = (hsize + 1) / 2;
424 rightpix = (3 * hsize + 1) / 2;
427 }
else if (hsize == 1) {
430 toppix = (vsize + 1) / 2;
431 bottompix = (3 * vsize + 1) / 2;
433 leftpix = (hsize + 1) / 2;
434 rightpix = (3 * hsize + 1) / 2;
435 toppix = (vsize + 1) / 2;
436 bottompix = (3 * vsize + 1) / 2;
439 pixb = pixAddBorderGeneral(pixs, leftpix, rightpix, toppix, bottompix, 255);
440 pixt = pixCreateTemplate(pixb);
441 if (!pixb || !pixt) {
442 L_ERROR(
"pixb and pixt not made\n", __func__);
446 pixGetDimensions(pixt, &w, &h, NULL);
447 datab = pixGetData(pixb);
448 datat = pixGetData(pixt);
449 wplb = pixGetWpl(pixb);
450 wplt = pixGetWpl(pixt);
452 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
453 maxsize = L_MAX(hsize, vsize);
454 array = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
455 if (!buffer || !array) {
456 L_ERROR(
"buffer and array not made\n", __func__);
461 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
463 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
465 dilateGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
468 else if (hsize == 1) {
469 erodeGrayLow(datat, w, h, wplt, datab, wplb, vsize, L_VERT,
471 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
476 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
478 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
480 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
482 pixSetOrClearBorder(pixb, leftpix, rightpix, toppix, bottompix,
484 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
486 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
492 pixd = pixRemoveBorderGeneral(pixb, leftpix, rightpix, toppix, bottompix);
494 L_ERROR(
"pixd not made\n", __func__);
526l_int32 w, h, wplb, wplt;
527l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
528l_uint32 *datab, *datat;
529PIX *pixb, *pixt, *pixd;
532 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
533 if (pixGetDepth(pixs) != 8)
534 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
535 if (hsize < 1 || vsize < 1)
536 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", __func__, NULL);
537 if ((hsize & 1) == 0 ) {
538 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", __func__);
541 if ((vsize & 1) == 0 ) {
542 L_WARNING(
"vert sel size must be odd; increasing by 1\n", __func__);
546 pixb = pixt = pixd = NULL;
547 buffer = array = NULL;
549 if (hsize == 1 && vsize == 1)
550 return pixCopy(NULL, pixs);
553 leftpix = (hsize + 1) / 2;
554 rightpix = (3 * hsize + 1) / 2;
557 }
else if (hsize == 1) {
560 toppix = (vsize + 1) / 2;
561 bottompix = (3 * vsize + 1) / 2;
563 leftpix = (hsize + 1) / 2;
564 rightpix = (3 * hsize + 1) / 2;
565 toppix = (vsize + 1) / 2;
566 bottompix = (3 * vsize + 1) / 2;
569 pixb = pixAddBorderGeneral(pixs, leftpix, rightpix, toppix, bottompix, 0);
570 pixt = pixCreateTemplate(pixb);
571 if (!pixb || !pixt) {
572 L_ERROR(
"pixb and pixt not made\n", __func__);
576 pixGetDimensions(pixt, &w, &h, NULL);
577 datab = pixGetData(pixb);
578 datat = pixGetData(pixt);
579 wplb = pixGetWpl(pixb);
580 wplt = pixGetWpl(pixt);
582 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
583 maxsize = L_MAX(hsize, vsize);
584 array = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
585 if (!buffer || !array) {
586 L_ERROR(
"buffer and array not made\n", __func__);
591 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
593 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
595 erodeGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
597 }
else if (hsize == 1) {
600 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
602 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
605 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
607 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
611 pixSetOrClearBorder(pixb, leftpix, rightpix, toppix, bottompix,
613 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
615 pixSetOrClearBorder(pixt, leftpix, rightpix, toppix, bottompix,
617 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
621 pixd = pixRemoveBorderGeneral(pixb, leftpix, rightpix, toppix, bottompix);
623 L_ERROR(
"pixd not made\n", __func__);
710l_uint32 *datas, *datad, *lines, *lined;
711l_int32 w, h, wpl, i, j;
712l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, minval;
716 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
717 if (pixGetDepth(pixs) != 8)
718 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
720 pixd = pixCreateTemplate(pixs);
721 pixGetDimensions(pixs, &w, &h, NULL);
722 datas = pixGetData(pixs);
723 datad = pixGetData(pixd);
724 wpl = pixGetWpl(pixs);
725 for (i = 0; i < h; i++) {
726 lines = datas + i * wpl;
727 lined = datad + i * wpl;
728 for (j = 1; j < w - 8; j += 8) {
739 minval = L_MIN(val1, val2);
742 minval = L_MIN(val3, val4);
745 minval = L_MIN(val5, val6);
748 minval = L_MIN(val7, val8);
775l_uint32 *datas, *datad, *linesi, *linedi;
776l_int32 w, h, wpl, i, j;
777l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, minval;
781 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
782 if (pixGetDepth(pixs) != 8)
783 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
785 pixd = pixCreateTemplate(pixs);
786 pixGetDimensions(pixs, &w, &h, NULL);
787 datas = pixGetData(pixs);
788 datad = pixGetData(pixd);
789 wpl = pixGetWpl(pixs);
790 for (j = 0; j < w; j++) {
791 for (i = 1; i < h - 8; i += 8) {
792 linesi = datas + i * wpl;
793 linedi = datad + i * wpl;
804 minval = L_MIN(val1, val2);
807 minval = L_MIN(val3, val4);
810 minval = L_MIN(val5, val6);
813 minval = L_MIN(val7, val8);
890l_uint32 *datas, *datad, *lines, *lined;
891l_int32 w, h, wpl, i, j;
892l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, maxval;
896 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
897 if (pixGetDepth(pixs) != 8)
898 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
900 pixd = pixCreateTemplate(pixs);
901 pixGetDimensions(pixs, &w, &h, NULL);
902 datas = pixGetData(pixs);
903 datad = pixGetData(pixd);
904 wpl = pixGetWpl(pixs);
905 for (i = 0; i < h; i++) {
906 lines = datas + i * wpl;
907 lined = datad + i * wpl;
908 for (j = 1; j < w - 8; j += 8) {
919 maxval = L_MAX(val1, val2);
922 maxval = L_MAX(val3, val4);
925 maxval = L_MAX(val5, val6);
928 maxval = L_MAX(val7, val8);
952l_uint32 *datas, *datad, *linesi, *linedi;
953l_int32 w, h, wpl, i, j;
954l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, maxval;
958 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
959 if (pixGetDepth(pixs) != 8)
960 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
962 pixd = pixCreateTemplate(pixs);
963 pixGetDimensions(pixs, &w, &h, NULL);
964 datas = pixGetData(pixs);
965 datad = pixGetData(pixd);
966 wpl = pixGetWpl(pixs);
967 for (j = 0; j < w; j++) {
968 for (i = 1; i < h - 8; i += 8) {
969 linesi = datas + i * wpl;
970 linedi = datad + i * wpl;
981 maxval = L_MAX(val1, val2);
984 maxval = L_MAX(val3, val4);
987 maxval = L_MAX(val5, val6);
990 maxval = L_MAX(val7, val8);
1020PIX *pixt, *pixb, *pixbd, *pixd;
1023 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1024 if (pixGetDepth(pixs) != 8)
1025 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1026 if (pixGetColormap(pixs))
1027 return (
PIX *)ERROR_PTR(
"pix has colormap", __func__, NULL);
1028 if ((hsize != 1 && hsize != 3) ||
1029 (vsize != 1 && vsize != 3))
1030 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", __func__, NULL);
1032 if (hsize == 1 && vsize == 1)
1033 return pixCopy(NULL, pixs);
1035 pixb = pixAddBorderGeneral(pixs, 4, 8, 2, 8, 255);
1039 pixSetBorderVal(pixt, 4, 8, 2, 8, 0);
1042 }
else if (hsize == 1) {
1044 pixSetBorderVal(pixt, 4, 8, 2, 8, 0);
1051 pixSetBorderVal(pixbd, 4, 8, 2, 8, 0);
1058 pixd = pixRemoveBorderGeneral(pixbd, 4, 8, 2, 8);
1084PIX *pixt, *pixb, *pixbd, *pixd;
1087 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1088 if (pixGetDepth(pixs) != 8)
1089 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1090 if (pixGetColormap(pixs))
1091 return (
PIX *)ERROR_PTR(
"pix has colormap", __func__, NULL);
1092 if ((hsize != 1 && hsize != 3) ||
1093 (vsize != 1 && vsize != 3))
1094 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", __func__, NULL);
1096 if (hsize == 1 && vsize == 1)
1097 return pixCopy(NULL, pixs);
1099 pixb = pixAddBorderGeneral(pixs, 4, 8, 2, 8, 0);
1103 pixSetBorderVal(pixt, 4, 8, 2, 8, 255);
1106 }
else if (hsize == 1) {
1108 pixSetBorderVal(pixt, 4, 8, 2, 8, 255);
1115 pixSetBorderVal(pixbd, 4, 8, 2, 8, 255);
1122 pixd = pixRemoveBorderGeneral(pixbd, 4, 8, 2, 8);
1173l_int32 hsize, nsteps, startmax, startx, starty;
1175l_uint32 *lines, *lined;
1177 if (direction == L_HORIZ) {
1179 nsteps = (w - 2 * hsize) / size;
1180 for (i = 0; i < h; i++) {
1181 lines = datas + i * wpls;
1182 lined = datad + i * wpld;
1185 for (j = 0; j < w; j++)
1188 for (j = 0; j < nsteps; j++) {
1190 startmax = (j + 1) * size - 1;
1191 maxarray[size - 1] = buffer[startmax];
1192 for (k = 1; k < size; k++) {
1193 maxarray[size - 1 - k] =
1194 L_MAX(maxarray[size - k], buffer[startmax - k]);
1195 maxarray[size - 1 + k] =
1196 L_MAX(maxarray[size + k - 2], buffer[startmax + k]);
1200 startx = hsize + j * size;
1202 SET_DATA_BYTE(lined, startx + size - 1, maxarray[2 * size - 2]);
1203 for (k = 1; k < size - 1; k++) {
1204 maxval = L_MAX(maxarray[k], maxarray[k + size - 1]);
1211 nsteps = (h - 2 * hsize) / size;
1212 for (j = 0; j < w; j++) {
1214 for (i = 0; i < h; i++) {
1215 lines = datas + i * wpls;
1219 for (i = 0; i < nsteps; i++) {
1221 startmax = (i + 1) * size - 1;
1222 maxarray[size - 1] = buffer[startmax];
1223 for (k = 1; k < size; k++) {
1224 maxarray[size - 1 - k] =
1225 L_MAX(maxarray[size - k], buffer[startmax - k]);
1226 maxarray[size - 1 + k] =
1227 L_MAX(maxarray[size + k - 2], buffer[startmax + k]);
1231 starty = hsize + i * size;
1232 lined = datad + starty * wpld;
1235 maxarray[2 * size - 2]);
1236 for (k = 1; k < size - 1; k++) {
1237 maxval = L_MAX(maxarray[k], maxarray[k + size - 1]);
1280l_int32 hsize, nsteps, startmin, startx, starty;
1282l_uint32 *lines, *lined;
1284 if (direction == L_HORIZ) {
1286 nsteps = (w - 2 * hsize) / size;
1287 for (i = 0; i < h; i++) {
1288 lines = datas + i * wpls;
1289 lined = datad + i * wpld;
1292 for (j = 0; j < w; j++)
1295 for (j = 0; j < nsteps; j++) {
1297 startmin = (j + 1) * size - 1;
1298 minarray[size - 1] = buffer[startmin];
1299 for (k = 1; k < size; k++) {
1300 minarray[size - 1 - k] =
1301 L_MIN(minarray[size - k], buffer[startmin - k]);
1302 minarray[size - 1 + k] =
1303 L_MIN(minarray[size + k - 2], buffer[startmin + k]);
1307 startx = hsize + j * size;
1309 SET_DATA_BYTE(lined, startx + size - 1, minarray[2 * size - 2]);
1310 for (k = 1; k < size - 1; k++) {
1311 minval = L_MIN(minarray[k], minarray[k + size - 1]);
1318 nsteps = (h - 2 * hsize) / size;
1319 for (j = 0; j < w; j++) {
1321 for (i = 0; i < h; i++) {
1322 lines = datas + i * wpls;
1326 for (i = 0; i < nsteps; i++) {
1328 startmin = (i + 1) * size - 1;
1329 minarray[size - 1] = buffer[startmin];
1330 for (k = 1; k < size; k++) {
1331 minarray[size - 1 - k] =
1332 L_MIN(minarray[size - k], buffer[startmin - k]);
1333 minarray[size - 1 + k] =
1334 L_MIN(minarray[size + k - 2], buffer[startmin + k]);
1338 starty = hsize + i * size;
1339 lined = datad + starty * wpld;
1342 minarray[2 * size - 2]);
1343 for (k = 1; k < size - 1; k++) {
1344 minval = L_MIN(minarray[k], minarray[k + size - 1]);