123 #include <config_auto.h>
126 #include "allheaders.h"
135 static void dilateGrayLow(l_uint32 *datad, l_int32 w, l_int32 h,
136 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
137 l_int32 size, l_int32 direction, l_uint8 *buffer,
139 static void erodeGrayLow(l_uint32 *datad, l_int32 w, l_int32 h,
140 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
141 l_int32 size, l_int32 direction, l_uint8 *buffer,
166 l_uint8 *buffer, *minarray;
167 l_int32 w, h, wplb, wplt;
168 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
169 l_uint32 *datab, *datat;
170 PIX *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)
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;
212 if (!pixb || !pixt) {
213 L_ERROR(
"pixb and pixt not made\n", __func__);
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,
242 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
250 L_ERROR(
"pixd not made\n", __func__);
280 l_uint8 *buffer, *maxarray;
281 l_int32 w, h, wplb, wplt;
282 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
283 l_uint32 *datab, *datat;
284 PIX *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)
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;
326 if (!pixb || !pixt) {
327 L_ERROR(
"pixb and pixt not made\n", __func__);
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,
364 L_ERROR(
"pixd not made\n", __func__);
396 l_int32 w, h, wplb, wplt;
397 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
398 l_uint32 *datab, *datat;
399 PIX *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)
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;
441 if (!pixb || !pixt) {
442 L_ERROR(
"pixb and pixt not made\n", __func__);
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,
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,
476 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
480 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
484 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
494 L_ERROR(
"pixd not made\n", __func__);
526 l_int32 w, h, wplb, wplt;
527 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
528 l_uint32 *datab, *datat;
529 PIX *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)
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;
571 if (!pixb || !pixt) {
572 L_ERROR(
"pixb and pixt not made\n", __func__);
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,
595 erodeGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
597 }
else if (hsize == 1) {
602 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
605 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
613 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
617 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
623 L_ERROR(
"pixd not made\n", __func__);
661 PIX *pixt, *pixb, *pixbd, *pixd;
664 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
665 if (pixGetDepth(pixs) != 8)
666 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
667 if (pixGetColormap(pixs))
668 return (
PIX *)ERROR_PTR(
"pix has colormap", __func__, NULL);
669 if ((hsize != 1 && hsize != 3) ||
670 (vsize != 1 && vsize != 3))
671 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", __func__, NULL);
673 if (hsize == 1 && vsize == 1)
710 l_uint32 *datas, *datad, *lines, *lined;
711 l_int32 w, h, wpl, i, j;
712 l_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);
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);
775 l_uint32 *datas, *datad, *linesi, *linedi;
776 l_int32 w, h, wpl, i, j;
777 l_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);
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);
841 PIX *pixt, *pixb, *pixbd, *pixd;
844 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
845 if (pixGetDepth(pixs) != 8)
846 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
847 if (pixGetColormap(pixs))
848 return (
PIX *)ERROR_PTR(
"pix has colormap", __func__, NULL);
849 if ((hsize != 1 && hsize != 3) ||
850 (vsize != 1 && vsize != 3))
851 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", __func__, NULL);
853 if (hsize == 1 && vsize == 1)
890 l_uint32 *datas, *datad, *lines, *lined;
891 l_int32 w, h, wpl, i, j;
892 l_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);
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);
952 l_uint32 *datas, *datad, *linesi, *linedi;
953 l_int32 w, h, wpl, i, j;
954 l_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);
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);
1020 PIX *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)
1042 }
else if (hsize == 1) {
1084 PIX *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)
1106 }
else if (hsize == 1) {
1173 l_int32 hsize, nsteps, startmax, startx, starty;
1175 l_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]);
1280 l_int32 hsize, nsteps, startmin, startx, starty;
1282 l_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]);
#define GET_DATA_BYTE(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
static void erodeGrayLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_int32 size, l_int32 direction, l_uint8 *buffer, l_uint8 *minarray)
erodeGrayLow()
static void dilateGrayLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_int32 size, l_int32 direction, l_uint8 *buffer, l_uint8 *maxarray)
dilateGrayLow()
static PIX * pixErodeGray3h(PIX *pixs)
pixErodeGray3h()
static PIX * pixErodeGray3v(PIX *pixs)
pixErodeGray3v()
PIX * pixErodeGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray3()
static PIX * pixDilateGray3h(PIX *pixs)
pixDilateGray3h()
PIX * pixOpenGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenGray3()
PIX * pixCloseGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseGray()
static PIX * pixDilateGray3v(PIX *pixs)
pixDilateGray3v()
PIX * pixCloseGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseGray3()
PIX * pixDilateGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray()
PIX * pixOpenGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenGray()
PIX * pixErodeGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray()
PIX * pixDilateGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray3()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixRemoveBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixRemoveBorderGeneral()
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()
l_ok pixSetBorderVal(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixSetBorderVal()
l_ok pixSetOrClearBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_int32 op)
pixSetOrClearBorder()