122 #include "allheaders.h" 131 static void dilateGrayLow(l_uint32 *datad, l_int32 w, l_int32 h,
132 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
133 l_int32 size, l_int32 direction, l_uint8 *buffer,
135 static void erodeGrayLow(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,
162 l_uint8 *buffer, *minarray;
163 l_int32 w, h, wplb, wplt;
164 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
165 l_uint32 *datab, *datat;
166 PIX *pixb, *pixt, *pixd;
168 PROCNAME(
"pixErodeGray");
171 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
172 if (pixGetDepth(pixs) != 8)
173 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
174 if (hsize < 1 || vsize < 1)
175 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
176 if ((hsize & 1) == 0 ) {
177 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
180 if ((vsize & 1) == 0 ) {
181 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
185 pixb = pixt = pixd = NULL;
186 buffer = minarray = NULL;
188 if (hsize == 1 && vsize == 1)
192 leftpix = (hsize + 1) / 2;
193 rightpix = (3 * hsize + 1) / 2;
196 }
else if (hsize == 1) {
199 toppix = (vsize + 1) / 2;
200 bottompix = (3 * vsize + 1) / 2;
202 leftpix = (hsize + 1) / 2;
203 rightpix = (3 * hsize + 1) / 2;
204 toppix = (vsize + 1) / 2;
205 bottompix = (3 * vsize + 1) / 2;
210 if (!pixb || !pixt) {
211 L_ERROR(
"pixb and pixt not made\n", procName);
218 wplb = pixGetWpl(pixb);
219 wplt = pixGetWpl(pixt);
221 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
222 maxsize = L_MAX(hsize, vsize);
223 minarray = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
224 if (!buffer || !minarray) {
225 L_ERROR(
"buffer and minarray not made\n", procName);
230 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
232 }
else if (hsize == 1) {
233 erodeGrayLow(datat, w, h, wplt, datab, wplb, vsize, L_VERT,
236 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
240 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
248 L_ERROR(
"pixd not made\n", procName);
278 l_uint8 *buffer, *maxarray;
279 l_int32 w, h, wplb, wplt;
280 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
281 l_uint32 *datab, *datat;
282 PIX *pixb, *pixt, *pixd;
284 PROCNAME(
"pixDilateGray");
287 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
288 if (pixGetDepth(pixs) != 8)
289 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
290 if (hsize < 1 || vsize < 1)
291 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
292 if ((hsize & 1) == 0 ) {
293 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
296 if ((vsize & 1) == 0 ) {
297 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
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", procName);
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", procName);
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", procName);
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;
401 PROCNAME(
"pixOpenGray");
404 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
405 if (pixGetDepth(pixs) != 8)
406 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
407 if (hsize < 1 || vsize < 1)
408 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
409 if ((hsize & 1) == 0 ) {
410 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
413 if ((vsize & 1) == 0 ) {
414 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
418 pixb = pixt = pixd = NULL;
419 buffer = array = NULL;
421 if (hsize == 1 && vsize == 1)
425 leftpix = (hsize + 1) / 2;
426 rightpix = (3 * hsize + 1) / 2;
429 }
else if (hsize == 1) {
432 toppix = (vsize + 1) / 2;
433 bottompix = (3 * vsize + 1) / 2;
435 leftpix = (hsize + 1) / 2;
436 rightpix = (3 * hsize + 1) / 2;
437 toppix = (vsize + 1) / 2;
438 bottompix = (3 * vsize + 1) / 2;
443 if (!pixb || !pixt) {
444 L_ERROR(
"pixb and pixt not made\n", procName);
451 wplb = pixGetWpl(pixb);
452 wplt = pixGetWpl(pixt);
454 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
455 maxsize = L_MAX(hsize, vsize);
456 array = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
457 if (!buffer || !array) {
458 L_ERROR(
"buffer and array not made\n", procName);
463 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
467 dilateGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
470 else if (hsize == 1) {
471 erodeGrayLow(datat, w, h, wplt, datab, wplb, vsize, L_VERT,
478 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
482 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
486 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
496 L_ERROR(
"pixd not made\n", procName);
528 l_int32 w, h, wplb, wplt;
529 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
530 l_uint32 *datab, *datat;
531 PIX *pixb, *pixt, *pixd;
533 PROCNAME(
"pixCloseGray");
536 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
537 if (pixGetDepth(pixs) != 8)
538 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
539 if (hsize < 1 || vsize < 1)
540 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
541 if ((hsize & 1) == 0 ) {
542 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
545 if ((vsize & 1) == 0 ) {
546 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
550 pixb = pixt = pixd = NULL;
551 buffer = array = NULL;
553 if (hsize == 1 && vsize == 1)
557 leftpix = (hsize + 1) / 2;
558 rightpix = (3 * hsize + 1) / 2;
561 }
else if (hsize == 1) {
564 toppix = (vsize + 1) / 2;
565 bottompix = (3 * vsize + 1) / 2;
567 leftpix = (hsize + 1) / 2;
568 rightpix = (3 * hsize + 1) / 2;
569 toppix = (vsize + 1) / 2;
570 bottompix = (3 * vsize + 1) / 2;
575 if (!pixb || !pixt) {
576 L_ERROR(
"pixb and pixt not made\n", procName);
583 wplb = pixGetWpl(pixb);
584 wplt = pixGetWpl(pixt);
586 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
587 maxsize = L_MAX(hsize, vsize);
588 array = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
589 if (!buffer || !array) {
590 L_ERROR(
"buffer and array not made\n", procName);
595 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
599 erodeGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
601 }
else if (hsize == 1) {
606 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
609 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
617 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
621 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
627 L_ERROR(
"pixd not made\n", procName);
665 PIX *pixt, *pixb, *pixbd, *pixd;
667 PROCNAME(
"pixErodeGray3");
670 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
671 if (pixGetDepth(pixs) != 8)
672 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
673 if (pixGetColormap(pixs))
674 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
675 if ((hsize != 1 && hsize != 3) ||
676 (vsize != 1 && vsize != 3))
677 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
679 if (hsize == 1 && vsize == 1)
716 l_uint32 *datas, *datad, *lines, *lined;
717 l_int32 w, h, wpl, i, j;
718 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, minval;
721 PROCNAME(
"pixErodeGray3h");
724 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
725 if (pixGetDepth(pixs) != 8)
726 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
732 wpl = pixGetWpl(pixs);
733 for (i = 0; i < h; i++) {
734 lines = datas + i * wpl;
735 lined = datad + i * wpl;
736 for (j = 1; j < w - 8; j += 8) {
747 minval = L_MIN(val1, val2);
750 minval = L_MIN(val3, val4);
753 minval = L_MIN(val5, val6);
756 minval = L_MIN(val7, val8);
783 l_uint32 *datas, *datad, *linesi, *linedi;
784 l_int32 w, h, wpl, i, j;
785 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, minval;
788 PROCNAME(
"pixErodeGray3v");
791 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
792 if (pixGetDepth(pixs) != 8)
793 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
799 wpl = pixGetWpl(pixs);
800 for (j = 0; j < w; j++) {
801 for (i = 1; i < h - 8; i += 8) {
802 linesi = datas + i * wpl;
803 linedi = datad + i * wpl;
814 minval = L_MIN(val1, val2);
817 minval = L_MIN(val3, val4);
820 minval = L_MIN(val5, val6);
823 minval = L_MIN(val7, val8);
851 PIX *pixt, *pixb, *pixbd, *pixd;
853 PROCNAME(
"pixDilateGray3");
856 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
857 if (pixGetDepth(pixs) != 8)
858 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
859 if (pixGetColormap(pixs))
860 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
861 if ((hsize != 1 && hsize != 3) ||
862 (vsize != 1 && vsize != 3))
863 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
865 if (hsize == 1 && vsize == 1)
902 l_uint32 *datas, *datad, *lines, *lined;
903 l_int32 w, h, wpl, i, j;
904 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, maxval;
907 PROCNAME(
"pixDilateGray3h");
910 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
911 if (pixGetDepth(pixs) != 8)
912 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
918 wpl = pixGetWpl(pixs);
919 for (i = 0; i < h; i++) {
920 lines = datas + i * wpl;
921 lined = datad + i * wpl;
922 for (j = 1; j < w - 8; j += 8) {
933 maxval = L_MAX(val1, val2);
936 maxval = L_MAX(val3, val4);
939 maxval = L_MAX(val5, val6);
942 maxval = L_MAX(val7, val8);
966 l_uint32 *datas, *datad, *linesi, *linedi;
967 l_int32 w, h, wpl, i, j;
968 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, maxval;
971 PROCNAME(
"pixDilateGray3v");
974 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
975 if (pixGetDepth(pixs) != 8)
976 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
982 wpl = pixGetWpl(pixs);
983 for (j = 0; j < w; j++) {
984 for (i = 1; i < h - 8; i += 8) {
985 linesi = datas + i * wpl;
986 linedi = datad + i * wpl;
997 maxval = L_MAX(val1, val2);
1000 maxval = L_MAX(val3, val4);
1003 maxval = L_MAX(val5, val6);
1006 maxval = L_MAX(val7, val8);
1036 PIX *pixt, *pixb, *pixbd, *pixd;
1038 PROCNAME(
"pixOpenGray3");
1041 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1042 if (pixGetDepth(pixs) != 8)
1043 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1044 if (pixGetColormap(pixs))
1045 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
1046 if ((hsize != 1 && hsize != 3) ||
1047 (vsize != 1 && vsize != 3))
1048 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
1050 if (hsize == 1 && vsize == 1)
1060 }
else if (hsize == 1) {
1102 PIX *pixt, *pixb, *pixbd, *pixd;
1104 PROCNAME(
"pixCloseGray3");
1107 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1108 if (pixGetDepth(pixs) != 8)
1109 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1110 if (pixGetColormap(pixs))
1111 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
1112 if ((hsize != 1 && hsize != 3) ||
1113 (vsize != 1 && vsize != 3))
1114 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
1116 if (hsize == 1 && vsize == 1)
1126 }
else if (hsize == 1) {
1190 l_int32 hsize, nsteps, startmax, startx, starty;
1192 l_uint32 *lines, *lined;
1194 if (direction == L_HORIZ) {
1196 nsteps = (w - 2 * hsize) / size;
1197 for (i = 0; i < h; i++) {
1198 lines = datas + i * wpls;
1199 lined = datad + i * wpld;
1202 for (j = 0; j < w; j++)
1205 for (j = 0; j < nsteps; j++) {
1207 startmax = (j + 1) * size - 1;
1208 maxarray[size - 1] = buffer[startmax];
1209 for (k = 1; k < size; k++) {
1210 maxarray[size - 1 - k] =
1211 L_MAX(maxarray[size - k], buffer[startmax - k]);
1212 maxarray[size - 1 + k] =
1213 L_MAX(maxarray[size + k - 2], buffer[startmax + k]);
1217 startx = hsize + j * size;
1219 SET_DATA_BYTE(lined, startx + size - 1, maxarray[2 * size - 2]);
1220 for (k = 1; k < size - 1; k++) {
1221 maxval = L_MAX(maxarray[k], maxarray[k + size - 1]);
1228 nsteps = (h - 2 * hsize) / size;
1229 for (j = 0; j < w; j++) {
1231 for (i = 0; i < h; i++) {
1232 lines = datas + i * wpls;
1236 for (i = 0; i < nsteps; i++) {
1238 startmax = (i + 1) * size - 1;
1239 maxarray[size - 1] = buffer[startmax];
1240 for (k = 1; k < size; k++) {
1241 maxarray[size - 1 - k] =
1242 L_MAX(maxarray[size - k], buffer[startmax - k]);
1243 maxarray[size - 1 + k] =
1244 L_MAX(maxarray[size + k - 2], buffer[startmax + k]);
1248 starty = hsize + i * size;
1249 lined = datad + starty * wpld;
1252 maxarray[2 * size - 2]);
1253 for (k = 1; k < size - 1; k++) {
1254 maxval = L_MAX(maxarray[k], maxarray[k + size - 1]);
1294 l_int32 hsize, nsteps, startmin, startx, starty;
1296 l_uint32 *lines, *lined;
1298 if (direction == L_HORIZ) {
1300 nsteps = (w - 2 * hsize) / size;
1301 for (i = 0; i < h; i++) {
1302 lines = datas + i * wpls;
1303 lined = datad + i * wpld;
1306 for (j = 0; j < w; j++)
1309 for (j = 0; j < nsteps; j++) {
1311 startmin = (j + 1) * size - 1;
1312 minarray[size - 1] = buffer[startmin];
1313 for (k = 1; k < size; k++) {
1314 minarray[size - 1 - k] =
1315 L_MIN(minarray[size - k], buffer[startmin - k]);
1316 minarray[size - 1 + k] =
1317 L_MIN(minarray[size + k - 2], buffer[startmin + k]);
1321 startx = hsize + j * size;
1323 SET_DATA_BYTE(lined, startx + size - 1, minarray[2 * size - 2]);
1324 for (k = 1; k < size - 1; k++) {
1325 minval = L_MIN(minarray[k], minarray[k + size - 1]);
1332 nsteps = (h - 2 * hsize) / size;
1333 for (j = 0; j < w; j++) {
1335 for (i = 0; i < h; i++) {
1336 lines = datas + i * wpls;
1340 for (i = 0; i < nsteps; i++) {
1342 startmin = (i + 1) * size - 1;
1343 minarray[size - 1] = buffer[startmin];
1344 for (k = 1; k < size; k++) {
1345 minarray[size - 1 - k] =
1346 L_MIN(minarray[size - k], buffer[startmin - k]);
1347 minarray[size - 1 + k] =
1348 L_MIN(minarray[size + k - 2], buffer[startmin + k]);
1352 starty = hsize + i * size;
1353 lined = datad + starty * wpld;
1356 minarray[2 * size - 2]);
1357 for (k = 1; k < size - 1; k++) {
1358 minval = L_MIN(minarray[k], minarray[k + size - 1]);
PIX * pixCloseGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseGray3()
PIX * pixDilateGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray()
static PIX * pixErodeGray3h(PIX *pixs)
pixErodeGray3h()
PIX * pixRemoveBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixRemoveBorderGeneral()
PIX * pixOpenGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenGray3()
static PIX * pixDilateGray3h(PIX *pixs)
pixDilateGray3h()
PIX * pixCloseGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseGray()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
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()
l_ok pixSetOrClearBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_int32 op)
pixSetOrClearBorder()
l_ok pixSetBorderVal(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixSetBorderVal()
static PIX * pixDilateGray3v(PIX *pixs)
pixDilateGray3v()
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_BYTE(pdata, n)
PIX * pixClone(PIX *pixs)
pixClone()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
static PIX * pixErodeGray3v(PIX *pixs)
pixErodeGray3v()
PIX * pixDilateGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray3()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixOpenGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenGray()
PIX * pixErodeGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray()
PIX * pixErodeGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray3()
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()
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()