88#include <config_auto.h>
92#include "allheaders.h"
97LEPT_DLL l_int32 ConvolveSamplingFactX = 1;
98LEPT_DLL l_int32 ConvolveSamplingFactY = 1;
101static void blockconvLow(l_uint32 *data, l_int32 w, l_int32 h, l_int32 wpl,
102 l_uint32 *dataa, l_int32 wpla, l_int32 wc,
104static void blockconvAccumLow(l_uint32 *datad, l_int32 w, l_int32 h,
105 l_int32 wpld, l_uint32 *datas, l_int32 d,
107static void blocksumLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpl,
108 l_uint32 *dataa, l_int32 wpla, l_int32 wc, l_int32 hc);
137PIX *pixs, *pixd, *pixr, *pixrc, *pixg, *pixgc, *pixb, *pixbc;
140 return (
PIX *)ERROR_PTR(
"pix not defined", __func__, NULL);
141 if (wc <= 0 || hc <= 0)
142 return pixCopy(NULL, pix);
143 pixGetDimensions(pix, &w, &h, &d);
144 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
145 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
146 "reducing!\n", __func__, wc, hc, w, h);
147 wc = L_MIN(wc, (w - 1) / 2);
148 hc = L_MIN(hc, (h - 1) / 2);
150 if (wc == 0 || hc == 0)
151 return pixCopy(NULL, pix);
154 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
155 L_WARNING(
"pix has colormap; removing\n", __func__);
157 d = pixGetDepth(pixs);
159 pixs = pixClone(pix);
162 if (d != 8 && d != 32) {
164 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", __func__, NULL);
170 pixr = pixGetRGBComponent(pixs,
COLOR_RED);
179 pixd = pixCreateRGBImage(pixrc, pixgc, pixbc);
219l_int32 w, h, d, wpl, wpla;
220l_uint32 *datad, *dataa;
224 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
225 pixGetDimensions(pixs, &w, &h, &d);
227 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
228 if (wc <= 0 || hc <= 0)
229 return pixCopy(NULL, pixs);
230 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
231 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
232 "reducing!\n", __func__, wc, hc, w, h);
233 wc = L_MIN(wc, (w - 1) / 2);
234 hc = L_MIN(hc, (h - 1) / 2);
236 if (wc == 0 || hc == 0)
237 return pixCopy(NULL, pixs);
240 if (pixGetDepth(pixacc) == 32) {
241 pixt = pixClone(pixacc);
243 L_WARNING(
"pixacc not 32 bpp; making new one\n", __func__);
245 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
249 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
252 if ((pixd = pixCreateTemplate(pixs)) == NULL) {
254 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
257 pixSetPadBits(pixt, 0);
258 wpl = pixGetWpl(pixd);
259 wpla = pixGetWpl(pixt);
260 datad = pixGetData(pixd);
261 dataa = pixGetData(pixt);
326l_int32 i, j, imax, imin, jmax, jmin;
327l_int32 wn, hn, fwc, fhc, wmwc, hmhc;
328l_float32 norm, normh, normw;
330l_uint32 *linemina, *linemaxa, *line;
334 if (wmwc <= 0 || hmhc <= 0) {
335 L_ERROR(
"wc >= w || hc >= h\n", __func__);
340 norm = 1.0 / ((l_float32)(fwc) * fhc);
345 for (i = 0; i < h; i++) {
346 imin = L_MAX(i - 1 - hc, 0);
347 imax = L_MIN(i + hc, h - 1);
348 line = data + wpl * i;
349 linemina = dataa + wpla * imin;
350 linemaxa = dataa + wpla * imax;
351 for (j = 0; j < w; j++) {
352 jmin = L_MAX(j - 1 - wc, 0);
353 jmax = L_MIN(j + wc, w - 1);
354 val = linemaxa[jmax] - linemaxa[jmin]
355 + linemina[jmin] - linemina[jmax];
356 val = (l_uint8)(norm * val + 0.5);
364 for (i = 0; i <= hc; i++) {
365 hn = L_MAX(1, hc + i);
366 normh = (l_float32)fhc / (l_float32)hn;
367 line = data + wpl * i;
368 for (j = 0; j <= wc; j++) {
369 wn = L_MAX(1, wc + j);
370 normw = (l_float32)fwc / (l_float32)wn;
372 val = (l_uint8)L_MIN(val * normh * normw, 255);
375 for (j = wc + 1; j < wmwc; j++) {
377 val = (l_uint8)L_MIN(val * normh, 255);
380 for (j = wmwc; j < w; j++) {
382 normw = (l_float32)fwc / (l_float32)wn;
384 val = (l_uint8)L_MIN(val * normh * normw, 255);
389 for (i = hmhc; i < h; i++) {
391 normh = (l_float32)fhc / (l_float32)hn;
392 line = data + wpl * i;
393 for (j = 0; j <= wc; j++) {
395 normw = (l_float32)fwc / (l_float32)wn;
397 val = (l_uint8)L_MIN(val * normh * normw, 255);
400 for (j = wc + 1; j < wmwc; j++) {
402 val = (l_uint8)L_MIN(val * normh, 255);
405 for (j = wmwc; j < w; j++) {
407 normw = (l_float32)fwc / (l_float32)wn;
409 val = (l_uint8)L_MIN(val * normh * normw, 255);
414 for (i = hc + 1; i < hmhc; i++) {
415 line = data + wpl * i;
416 for (j = 0; j <= wc; j++) {
418 normw = (l_float32)fwc / (l_float32)wn;
420 val = (l_uint8)L_MIN(val * normw, 255);
423 for (j = wmwc; j < w; j++) {
425 normw = (l_float32)fwc / (l_float32)wn;
427 val = (l_uint8)L_MIN(val * normw, 255);
456l_int32 w, h, d, wpls, wpld;
457l_uint32 *datas, *datad;
461 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
463 pixGetDimensions(pixs, &w, &h, &d);
464 if (d != 1 && d != 8 && d != 32)
465 return (
PIX *)ERROR_PTR(
"pixs not 1, 8 or 32 bpp", __func__, NULL);
466 if ((pixd = pixCreate(w, h, 32)) == NULL)
467 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
469 datas = pixGetData(pixs);
470 datad = pixGetData(pixd);
471 wpls = pixGetWpl(pixs);
472 wpld = pixGetWpl(pixd);
473 blockconvAccumLow(datad, w, h, wpld, datas, d, wpls);
500blockconvAccumLow(l_uint32 *datad,
511l_uint32 *lines, *lined, *linedp;
518 for (j = 0; j < w; j++) {
523 lined[j] = lined[j - 1] + val;
527 for (i = 1; i < h; i++) {
528 lines = datas + i * wpls;
529 lined = datad + i * wpld;
530 linedp = lined - wpld;
531 for (j = 0; j < w; j++) {
534 lined[0] = val + linedp[0];
536 lined[j] = val + lined[j - 1] + linedp[j] - linedp[j - 1];
541 for (j = 0; j < w; j++) {
546 lined[j] = lined[j - 1] + val;
550 for (i = 1; i < h; i++) {
551 lines = datas + i * wpls;
552 lined = datad + i * wpld;
553 linedp = lined - wpld;
554 for (j = 0; j < w; j++) {
557 lined[0] = val + linedp[0];
559 lined[j] = val + lined[j - 1] + linedp[j] - linedp[j - 1];
562 }
else if (d == 32) {
564 for (j = 0; j < w; j++) {
569 lined[j] = lined[j - 1] + val32;
573 for (i = 1; i < h; i++) {
574 lines = datas + i * wpls;
575 lined = datad + i * wpld;
576 linedp = lined - wpld;
577 for (j = 0; j < w; j++) {
580 lined[0] = val32 + linedp[0];
582 lined[j] = val32 + lined[j - 1] + linedp[j] - linedp[j - 1];
586 L_ERROR(
"depth not 1, 8 or 32 bpp\n", __func__);
636l_int32 i, j, w, h, d, wpla, wpld, jmax;
637l_uint32 *linemina, *linemaxa, *lined, *dataa, *datad;
638PIX *pixsb, *pixacc, *pixd;
641 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
642 pixGetDimensions(pixs, &w, &h, &d);
644 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
645 if (wc <= 0 || hc <= 0)
646 return pixCopy(NULL, pixs);
647 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
648 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
649 "reducing!\n", __func__, wc, hc, w, h);
650 wc = L_MIN(wc, (w - 1) / 2);
651 hc = L_MIN(hc, (h - 1) / 2);
653 if (wc == 0 || hc == 0)
654 return pixCopy(NULL, pixs);
656 if ((pixsb = pixAddMirroredBorder(pixs, wc + 1, wc, hc + 1, hc)) == NULL)
657 return (
PIX *)ERROR_PTR(
"pixsb not made", __func__, NULL);
661 return (
PIX *)ERROR_PTR(
"pixacc not made", __func__, NULL);
662 if ((pixd = pixCreate(w, h, 32)) == NULL) {
664 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
667 wpla = pixGetWpl(pixacc);
668 wpld = pixGetWpl(pixd);
669 datad = pixGetData(pixd);
670 dataa = pixGetData(pixacc);
671 for (i = 0; i < h; i++) {
672 lined = datad + i * wpld;
673 linemina = dataa + i * wpla;
674 linemaxa = dataa + (i + 2 * hc + 1) * wpla;
675 for (j = 0; j < w; j++) {
676 jmax = j + 2 * wc + 1;
677 lined[j] = linemaxa[jmax] - linemaxa[j] -
678 linemina[jmax] + linemina[j];
728l_int32 i, j, w, h, d, xrat, yrat;
729PIX *pixs, *pixd, *pixc, *pixt;
730PIX *pixr, *pixrc, *pixg, *pixgc, *pixb, *pixbc;
734 return (
PIX *)ERROR_PTR(
"pix not defined", __func__, NULL);
735 if (wc <= 0 || hc <= 0)
736 return pixCopy(NULL, pix);
737 if (nx <= 1 && ny <= 1)
739 pixGetDimensions(pix, &w, &h, &d);
740 if (w < 2 * wc + 3 || h < 2 * hc + 3) {
741 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
742 "reducing!\n", __func__, wc, hc, w, h);
743 wc = L_MIN(wc, (w - 1) / 2);
744 hc = L_MIN(hc, (h - 1) / 2);
746 if (wc == 0 || hc == 0)
747 return pixCopy(NULL, pix);
756 L_WARNING(
"tile width too small; nx reduced to %d\n", __func__, nx);
760 L_WARNING(
"tile height too small; ny reduced to %d\n", __func__, ny);
764 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
765 L_WARNING(
"pix has colormap; removing\n", __func__);
767 d = pixGetDepth(pixs);
769 pixs = pixClone(pix);
772 if (d != 8 && d != 32) {
774 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", __func__, NULL);
784 if ((pixd = pixCreateTemplate(pixs)) == NULL) {
786 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
788 pt = pixTilingCreate(pixs, nx, ny, 0, 0, wc + 2, hc + 2);
789 for (i = 0; i < ny; i++) {
790 for (j = 0; j < nx; j++) {
791 pixt = pixTilingGetTile(pt, i, j);
797 pixr = pixGetRGBComponent(pixt,
COLOR_RED);
806 pixc = pixCreateRGBImage(pixrc, pixgc, pixbc);
812 pixTilingPaintTile(pixd, i, j, pixc, pt);
819 pixTilingDestroy(&pt);
852l_int32 w, h, d, wd, hd, i, j, imin, imax, jmin, jmax, wplt, wpld;
855l_uint32 *datat, *datad, *lined, *linemint, *linemaxt;
859 return (
PIX *)ERROR_PTR(
"pix not defined", __func__, NULL);
860 pixGetDimensions(pixs, &w, &h, &d);
862 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
863 if (wc <= 0 || hc <= 0)
864 return pixCopy(NULL, pixs);
865 if (w < 2 * wc + 3 || h < 2 * hc + 3) {
866 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
867 "reducing!\n", __func__, wc, hc, w, h);
868 wc = L_MIN(wc, (w - 1) / 2);
869 hc = L_MIN(hc, (h - 1) / 2);
871 if (wc == 0 || hc == 0)
872 return pixCopy(NULL, pixs);
877 if (pixGetDepth(pixacc) == 32) {
878 pixt = pixClone(pixacc);
880 L_WARNING(
"pixacc not 32 bpp; making new one\n", __func__);
882 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
886 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
889 if ((pixd = pixCreateTemplate(pixs)) == NULL) {
891 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
893 datat = pixGetData(pixt);
894 wplt = pixGetWpl(pixt);
895 datad = pixGetData(pixd);
896 wpld = pixGetWpl(pixd);
897 norm = 1. / (l_float32)((2 * wc + 1) * (2 * hc + 1));
908 for (i = hc; i < hc + hd - 2; i++) {
909 imin = L_MAX(i - hc - 1, 0);
910 imax = L_MIN(i + hc, h - 1);
911 lined = datad + i * wpld;
912 linemint = datat + imin * wplt;
913 linemaxt = datat + imax * wplt;
914 for (j = wc; j < wc + wd - 2; j++) {
915 jmin = L_MAX(j - wc - 1, 0);
916 jmax = L_MIN(j + wc, w - 1);
917 val = linemaxt[jmax] - linemaxt[jmin]
918 + linemint[jmin] - linemint[jmax];
919 val = (l_uint8)(norm * val + 0.5);
981PIX *pixb, *pixm, *pixms;
983 if (!ppixm && !ppixms && !pfpixv && !pfpixrv)
984 return ERROR_INT(
"no output requested", __func__, 1);
985 if (ppixm) *ppixm = NULL;
986 if (ppixms) *ppixms = NULL;
987 if (pfpixv) *pfpixv = NULL;
988 if (pfpixrv) *pfpixrv = NULL;
989 if (!pixs || pixGetDepth(pixs) != 8)
990 return ERROR_INT(
"pixs not defined or not 8 bpp", __func__, 1);
991 if (wc < 2 || hc < 2)
992 return ERROR_INT(
"wc and hc not >= 2", __func__, 1);
996 pixb = pixAddBorderGeneral(pixs, wc + 1, wc + 1, hc + 1, hc + 1, 0);
998 pixb = pixClone(pixs);
1000 if (!pfpixv && !pfpixrv) {
1061l_int32 i, j, w, h, d, wd, hd, wplc, wpld, wincr, hincr;
1063l_uint32 *datac, *datad, *linec1, *linec2, *lined;
1065PIX *pixb, *pixc, *pixd;
1068 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1069 d = pixGetDepth(pixs);
1070 if (d != 8 && d != 32)
1071 return (
PIX *)ERROR_PTR(
"pixs not 8 or 32 bpp", __func__, NULL);
1072 if (wc < 2 || hc < 2)
1073 return (
PIX *)ERROR_PTR(
"wc and hc not >= 2", __func__, NULL);
1075 pixb = pixc = pixd = NULL;
1079 pixb = pixAddBorderGeneral(pixs, wc + 1, wc + 1, hc + 1, hc + 1, 0);
1081 pixb = pixClone(pixs);
1085 L_ERROR(
"pixc not made\n", __func__);
1088 wplc = pixGetWpl(pixc);
1089 datac = pixGetData(pixc);
1093 pixGetDimensions(pixb, &w, &h, NULL);
1094 wd = w - 2 * (wc + 1);
1095 hd = h - 2 * (hc + 1);
1096 if (wd < 2 || hd < 2) {
1097 L_ERROR(
"w or h is too small for the kernel\n", __func__);
1100 if ((pixd = pixCreate(wd, hd, d)) == NULL) {
1101 L_ERROR(
"pixd not made\n", __func__);
1104 wpld = pixGetWpl(pixd);
1105 datad = pixGetData(pixd);
1111 norm = 1.0 / ((l_float32)(wincr) * hincr);
1112 for (i = 0; i < hd; i++) {
1113 linec1 = datac + i * wplc;
1114 linec2 = datac + (i + hincr) * wplc;
1115 lined = datad + i * wpld;
1116 for (j = 0; j < wd; j++) {
1117 val = linec2[j + wincr] - linec2[j] - linec1[j + wincr] + linec1[j];
1119 val = (l_uint8)(norm * val);
1122 val = (l_uint32)(norm * val);
1175l_int32 i, j, w, h, wd, hd, wpl, wpld, wincr, hincr;
1177l_uint32 *datad, *lined;
1180l_float64 *data, *line1, *line2;
1184 if (!pixs || (pixGetDepth(pixs) != 8))
1185 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", __func__, NULL);
1186 if (wc < 2 || hc < 2)
1187 return (
PIX *)ERROR_PTR(
"wc and hc not >= 2", __func__, NULL);
1193 pixb = pixAddBorderGeneral(pixs, wc + 1, wc + 1, hc + 1, hc + 1, 0);
1195 pixb = pixClone(pixs);
1198 L_ERROR(
"dpix not made\n", __func__);
1201 wpl = dpixGetWpl(dpix);
1202 data = dpixGetData(dpix);
1206 pixGetDimensions(pixb, &w, &h, NULL);
1207 wd = w - 2 * (wc + 1);
1208 hd = h - 2 * (hc + 1);
1209 if (wd < 2 || hd < 2) {
1210 L_ERROR(
"w or h too small for kernel\n", __func__);
1213 if ((pixd = pixCreate(wd, hd, 32)) == NULL) {
1214 L_ERROR(
"pixd not made\n", __func__);
1217 wpld = pixGetWpl(pixd);
1218 datad = pixGetData(pixd);
1222 norm = 1.0 / ((l_float32)(wincr) * hincr);
1223 for (i = 0; i < hd; i++) {
1224 line1 = data + i * wpl;
1225 line2 = data + (i + hincr) * wpl;
1226 lined = datad + i * wpld;
1227 for (j = 0; j < wd; j++) {
1228 val = line2[j + wincr] - line2[j] - line1[j + wincr] + line1[j];
1229 ival = (l_uint32)(norm * val + 0.5);
1271l_int32 i, j, w, h, ws, hs, ds, wplm, wplms, wplv, wplrv, valm, valms;
1273l_uint32 *linem, *linems, *datam, *datams;
1274l_float32 *linev = NULL, *linerv = NULL, *datav = NULL, *datarv = NULL;
1275FPIX *fpixv, *fpixrv;
1277 if (!pfpixv && !pfpixrv)
1278 return ERROR_INT(
"no output requested", __func__, 1);
1279 if (pfpixv) *pfpixv = NULL;
1280 if (pfpixrv) *pfpixrv = NULL;
1281 if (!pixm || pixGetDepth(pixm) != 8)
1282 return ERROR_INT(
"pixm undefined or not 8 bpp", __func__, 1);
1283 if (!pixms || pixGetDepth(pixms) != 32)
1284 return ERROR_INT(
"pixms undefined or not 32 bpp", __func__, 1);
1285 pixGetDimensions(pixm, &w, &h, NULL);
1286 pixGetDimensions(pixms, &ws, &hs, &ds);
1287 if (w != ws || h != hs)
1288 return ERROR_INT(
"pixm and pixms sizes differ", __func__, 1);
1291 fpixv = fpixCreate(w, h);
1293 wplv = fpixGetWpl(fpixv);
1294 datav = fpixGetData(fpixv);
1297 fpixrv = fpixCreate(w, h);
1299 wplrv = fpixGetWpl(fpixrv);
1300 datarv = fpixGetData(fpixrv);
1303 wplm = pixGetWpl(pixm);
1304 wplms = pixGetWpl(pixms);
1305 datam = pixGetData(pixm);
1306 datams = pixGetData(pixms);
1307 for (i = 0; i < h; i++) {
1308 linem = datam + i * wplm;
1309 linems = datams + i * wplms;
1311 linev = datav + i * wplv;
1313 linerv = datarv + i * wplrv;
1314 for (j = 0; j < w; j++) {
1319 valms = (l_int32)linems[j];
1320 var = (l_float32)valms - (l_float32)valm * valm;
1324 linerv[j] = (l_float32)sqrt(var);
1355l_int32 i, j, w, h, wpl, wpls, val;
1356l_uint32 *datas, *lines;
1357l_float64 *data, *line, *linep;
1360 if (!pixs || (pixGetDepth(pixs) != 8))
1361 return (
DPIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", __func__, NULL);
1362 pixGetDimensions(pixs, &w, &h, NULL);
1363 if ((dpix = dpixCreate(w, h)) == NULL)
1364 return (
DPIX *)ERROR_PTR(
"dpix not made", __func__, NULL);
1366 datas = pixGetData(pixs);
1367 wpls = pixGetWpl(pixs);
1368 data = dpixGetData(dpix);
1369 wpl = dpixGetWpl(dpix);
1373 for (j = 0; j < w; j++) {
1376 line[0] = (l_float64)(val) * val;
1378 line[j] = line[j - 1] + (l_float64)(val) * val;
1382 for (i = 1; i < h; i++) {
1383 lines = datas + i * wpls;
1384 line = data + i * wpl;
1385 linep = line - wpl;;
1386 for (j = 0; j < w; j++) {
1389 line[0] = linep[0] + (l_float64)(val) * val;
1391 line[j] = line[j - 1] + linep[j] - linep[j - 1]
1392 + (l_float64)(val) * val;
1438l_int32 w, h, d, thresh;
1442 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1443 pixGetDimensions(pixs, &w, &h, &d);
1445 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
1446 if (rank < 0.0 || rank > 1.0)
1447 return (
PIX *)ERROR_PTR(
"rank must be in [0.0, 1.0]", __func__, NULL);
1450 pixd = pixCreateTemplate(pixs);
1455 if (wc <= 0 || hc <= 0)
1456 return pixCopy(NULL, pixs);
1457 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
1458 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
1459 "reducing!\n", __func__, wc, hc, w, h);
1460 wc = L_MIN(wc, (w - 1) / 2);
1461 hc = L_MIN(hc, (h - 1) / 2);
1463 if (wc == 0 || hc == 0)
1464 return pixCopy(NULL, pixs);
1466 if ((pixt =
pixBlocksum(pixs, pixacc, wc, hc)) == NULL)
1467 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
1472 thresh = (l_int32)(255. * rank);
1473 pixd = pixThresholdToBinary(pixt, thresh);
1474 pixInvert(pixd, pixd);
1518l_int32 w, h, d, wplt, wpld;
1519l_uint32 *datat, *datad;
1523 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1524 pixGetDimensions(pixs, &w, &h, &d);
1526 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
1527 if (wc <= 0 || hc <= 0)
1528 return pixCopy(NULL, pixs);
1529 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
1530 L_WARNING(
"kernel too large: wc = %d, hc = %d, w = %d, h = %d; "
1531 "reducing!\n", __func__, wc, hc, w, h);
1532 wc = L_MIN(wc, (w - 1) / 2);
1533 hc = L_MIN(hc, (h - 1) / 2);
1535 if (wc == 0 || hc == 0)
1536 return pixCopy(NULL, pixs);
1539 if (pixGetDepth(pixacc) != 32)
1540 return (
PIX *)ERROR_PTR(
"pixacc not 32 bpp", __func__, NULL);
1541 pixt = pixClone(pixacc);
1544 return (
PIX *)ERROR_PTR(
"pixt not made", __func__, NULL);
1548 if ((pixd = pixCreate(w, h, 8)) == NULL) {
1550 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
1552 pixCopyResolution(pixd, pixs);
1554 wpld = pixGetWpl(pixd);
1555 wplt = pixGetWpl(pixt);
1556 datad = pixGetData(pixd);
1557 datat = pixGetData(pixt);
1558 blocksumLow(datad, w, h, wpld, datat, wplt, wc, hc);
1607l_int32 i, j, imax, imin, jmax, jmin;
1608l_int32 wn, hn, fwc, fhc, wmwc, hmhc;
1609l_float32 norm, normh, normw;
1611l_uint32 *linemina, *linemaxa, *lined;
1615 if (wmwc <= 0 || hmhc <= 0) {
1616 L_ERROR(
"wc >= w || hc >=h\n", __func__);
1621 norm = 255. / ((l_float32)(fwc) * fhc);
1626 for (i = 0; i < h; i++) {
1627 imin = L_MAX(i - 1 - hc, 0);
1628 imax = L_MIN(i + hc, h - 1);
1629 lined = datad + wpl * i;
1630 linemina = dataa + wpla * imin;
1631 linemaxa = dataa + wpla * imax;
1632 for (j = 0; j < w; j++) {
1633 jmin = L_MAX(j - 1 - wc, 0);
1634 jmax = L_MIN(j + wc, w - 1);
1635 val = linemaxa[jmax] - linemaxa[jmin]
1636 - linemina[jmax] + linemina[jmin];
1637 val = (l_uint8)(norm * val);
1645 for (i = 0; i <= hc; i++) {
1647 normh = (l_float32)fhc / (l_float32)hn;
1648 lined = datad + wpl * i;
1649 for (j = 0; j <= wc; j++) {
1651 normw = (l_float32)fwc / (l_float32)wn;
1653 val = (l_uint8)(val * normh * normw);
1656 for (j = wc + 1; j < wmwc; j++) {
1658 val = (l_uint8)(val * normh);
1661 for (j = wmwc; j < w; j++) {
1663 normw = (l_float32)fwc / (l_float32)wn;
1665 val = (l_uint8)(val * normh * normw);
1670 for (i = hmhc; i < h; i++) {
1672 normh = (l_float32)fhc / (l_float32)hn;
1673 lined = datad + wpl * i;
1674 for (j = 0; j <= wc; j++) {
1676 normw = (l_float32)fwc / (l_float32)wn;
1678 val = (l_uint8)(val * normh * normw);
1681 for (j = wc + 1; j < wmwc; j++) {
1683 val = (l_uint8)(val * normh);
1686 for (j = wmwc; j < w; j++) {
1688 normw = (l_float32)fwc / (l_float32)wn;
1690 val = (l_uint8)(val * normh * normw);
1695 for (i = hc + 1; i < hmhc; i++) {
1696 lined = datad + wpl * i;
1697 for (j = 0; j <= wc; j++) {
1699 normw = (l_float32)fwc / (l_float32)wn;
1701 val = (l_uint8)(val * normw);
1704 for (j = wmwc; j < w; j++) {
1706 normw = (l_float32)fwc / (l_float32)wn;
1708 val = (l_uint8)(val * normw);
1751l_int32 i, j, w, h, wpls, wplv, wpld;
1753l_uint32 *datas, *datav, *datad, *lines, *linev, *lined;
1757 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1758 if (pixGetDepth(pixs) != 8)
1759 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
1761 return (
PIX *)ERROR_PTR(
"halfsize must be >= 1", __func__, NULL);
1766 return (
PIX *)ERROR_PTR(
"pixav not made", __func__, NULL);
1770 pixGetDimensions(pixs, &w, &h, NULL);
1771 if ((pixd = pixCreate(w, h, 1)) == NULL) {
1773 return (
PIX *)ERROR_PTR(
"pixd not made", __func__, NULL);
1775 datas = pixGetData(pixs);
1776 datav = pixGetData(pixav);
1777 datad = pixGetData(pixd);
1778 wpls = pixGetWpl(pixs);
1779 wplv = pixGetWpl(pixav);
1780 wpld = pixGetWpl(pixd);
1781 for (i = 0; i < h; i++) {
1782 lines = datas + i * wpls;
1783 linev = datav + i * wplv;
1784 lined = datad + i * wpld;
1785 for (j = 0; j < w; j++) {
1850l_int32 i, j, id, jd, k, m, w, h, d, wd, hd, sx, sy, cx, cy, wplt, wpld;
1852l_uint32 *datat, *datad, *linet, *lined;
1858 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1859 if (pixGetColormap(pixs))
1860 return (
PIX *)ERROR_PTR(
"pixs has colormap", __func__, NULL);
1861 pixGetDimensions(pixs, &w, &h, &d);
1862 if (d != 8 && d != 16 && d != 32)
1863 return (
PIX *)ERROR_PTR(
"pixs not 8, 16, or 32 bpp", __func__, NULL);
1865 return (
PIX *)ERROR_PTR(
"kel not defined", __func__, NULL);
1869 keli = kernelInvert(kel);
1870 kernelGetParameters(keli, &sy, &sx, &cy, &cx);
1872 keln = kernelNormalize(keli, 1.0);
1874 keln = kernelCopy(keli);
1876 if ((pixt = pixAddMirroredBorder(pixs, cx, sx - cx, cy, sy - cy)) == NULL) {
1877 L_ERROR(
"pixt not made\n", __func__);
1881 wd = (w + ConvolveSamplingFactX - 1) / ConvolveSamplingFactX;
1882 hd = (h + ConvolveSamplingFactY - 1) / ConvolveSamplingFactY;
1883 pixd = pixCreate(wd, hd, outdepth);
1884 datat = pixGetData(pixt);
1885 datad = pixGetData(pixd);
1886 wplt = pixGetWpl(pixt);
1887 wpld = pixGetWpl(pixd);
1888 for (i = 0,
id = 0;
id < hd; i += ConvolveSamplingFactY,
id++) {
1889 lined = datad +
id * wpld;
1890 for (j = 0, jd = 0; jd < wd; j += ConvolveSamplingFactX, jd++) {
1892 for (k = 0; k < sy; k++) {
1893 linet = datat + (i + k) * wplt;
1895 for (m = 0; m < sx; m++) {
1897 sum += val * keln->
data[k][m];
1899 }
else if (d == 16) {
1900 for (m = 0; m < sx; m++) {
1902 sum += val * keln->
data[k][m];
1905 for (m = 0; m < sx; m++) {
1906 val = *(linet + j + m);
1907 sum += val * keln->
data[k][m];
1911 if (sum < 0.0) sum = -sum;
1914 else if (outdepth == 16)
1917 *(lined + jd) = (l_uint32)(sum + 0.5);
1922 kernelDestroy(&keli);
1923 kernelDestroy(&keln);
1979l_int32 d, xfact, yfact;
1984 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1985 d = pixGetDepth(pixs);
1986 if (d != 8 && d != 16 && d != 32)
1987 return (
PIX *)ERROR_PTR(
"pixs not 8, 16, or 32 bpp", __func__, NULL);
1989 return (
PIX *)ERROR_PTR(
"kelx not defined", __func__, NULL);
1991 return (
PIX *)ERROR_PTR(
"kely not defined", __func__, NULL);
1993 xfact = ConvolveSamplingFactX;
1994 yfact = ConvolveSamplingFactY;
1996 kelxn = kernelNormalize(kelx, 1000.0f);
1997 kelyn = kernelNormalize(kely, 0.001f);
2003 kernelDestroy(&kelxn);
2004 kernelDestroy(&kelyn);
2046PIX *pixt, *pixr, *pixg, *pixb, *pixd;
2049 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
2050 if (pixGetDepth(pixs) != 32)
2051 return (
PIX *)ERROR_PTR(
"pixs is not 32 bpp", __func__, NULL);
2053 return (
PIX *)ERROR_PTR(
"kel not defined", __func__, NULL);
2055 pixt = pixGetRGBComponent(pixs,
COLOR_RED);
2064 pixd = pixCreateRGBImage(pixr, pixg, pixb);
2104PIX *pixt, *pixr, *pixg, *pixb, *pixd;
2107 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
2108 if (pixGetDepth(pixs) != 32)
2109 return (
PIX *)ERROR_PTR(
"pixs is not 32 bpp", __func__, NULL);
2111 return (
PIX *)ERROR_PTR(
"kelx, kely not both defined", __func__, NULL);
2113 pixt = pixGetRGBComponent(pixs,
COLOR_RED);
2122 pixd = pixCreateRGBImage(pixr, pixg, pixb);
2164l_int32 i, j, id, jd, k, m, w, h, wd, hd, sx, sy, cx, cy, wplt, wpld;
2166l_float32 *datat, *datad, *linet, *lined;
2172 return (
FPIX *)ERROR_PTR(
"fpixs not defined", __func__, NULL);
2174 return (
FPIX *)ERROR_PTR(
"kel not defined", __func__, NULL);
2178 keli = kernelInvert(kel);
2179 kernelGetParameters(keli, &sy, &sx, &cy, &cx);
2181 keln = kernelNormalize(keli, 1.0);
2183 keln = kernelCopy(keli);
2185 fpixGetDimensions(fpixs, &w, &h);
2186 fpixt = fpixAddMirroredBorder(fpixs, cx, sx - cx, cy, sy - cy);
2188 L_ERROR(
"fpixt not made\n", __func__);
2192 wd = (w + ConvolveSamplingFactX - 1) / ConvolveSamplingFactX;
2193 hd = (h + ConvolveSamplingFactY - 1) / ConvolveSamplingFactY;
2194 fpixd = fpixCreate(wd, hd);
2195 datat = fpixGetData(fpixt);
2196 datad = fpixGetData(fpixd);
2197 wplt = fpixGetWpl(fpixt);
2198 wpld = fpixGetWpl(fpixd);
2199 for (i = 0,
id = 0;
id < hd; i += ConvolveSamplingFactY,
id++) {
2200 lined = datad +
id * wpld;
2201 for (j = 0, jd = 0; jd < wd; j += ConvolveSamplingFactX, jd++) {
2203 for (k = 0; k < sy; k++) {
2204 linet = datat + (i + k) * wplt;
2205 for (m = 0; m < sx; m++) {
2206 val = *(linet + j + m);
2207 sum += val * keln->
data[k][m];
2210 *(lined + jd) = sum;
2215 kernelDestroy(&keli);
2216 kernelDestroy(&keln);
2217 fpixDestroy(&fpixt);
2257l_int32 xfact, yfact;
2262 return (
FPIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
2264 return (
FPIX *)ERROR_PTR(
"kelx not defined", __func__, NULL);
2266 return (
FPIX *)ERROR_PTR(
"kely not defined", __func__, NULL);
2268 xfact = ConvolveSamplingFactX;
2269 yfact = ConvolveSamplingFactY;
2271 kelxn = kernelNormalize(kelx, 1.0);
2272 kelyn = kernelNormalize(kely, 1.0);
2278 kernelDestroy(&kelxn);
2279 kernelDestroy(&kelyn);
2288 fpixDestroy(&fpixt);
2335l_float32 min1, min2, min, minval, maxval, range;
2340 return (
PIX *)ERROR_PTR(
"&bias not defined", __func__, NULL);
2342 if (!pixs || pixGetDepth(pixs) != 8)
2343 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", __func__, NULL);
2344 if (pixGetColormap(pixs))
2345 return (
PIX *)ERROR_PTR(
"pixs has colormap", __func__, NULL);
2347 return (
PIX *)ERROR_PTR(
"kel1 not defined", __func__, NULL);
2350 kernelGetMinMax(kel1, &min1, NULL);
2353 kernelGetMinMax(kel2, &min2, NULL);
2354 min = L_MIN(min1, min2);
2364 fpix1 = pixConvertToFPix(pixs, 1);
2369 fpixDestroy(&fpix1);
2379 fpixGetMin(fpix2, &minval, NULL, NULL);
2380 fpixGetMax(fpix2, &maxval, NULL, NULL);
2381 range = maxval - minval;
2382 *pbias = (minval < 0.0) ? -minval : 0.0;
2383 fpixAddMultConstant(fpix2, *pbias, 1.0);
2384 if (range <= 255 || !force8) {
2385 outdepth = (range > 255) ? 16 : 8;
2387 fpixAddMultConstant(fpix2, 0.0, (255.0 / range));
2393 fpixDestroy(&fpix2);
2419 if (xfact < 1) xfact = 1;
2420 if (yfact < 1) yfact = 1;
2421 ConvolveSamplingFactX = xfact;
2422 ConvolveSamplingFactY = yfact;
2446l_int32 i, j, w, h, d, wpls, wpld, val, rval, gval, bval;
2448l_uint32 *datas, *datad, *lines, *lined;
2452 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
2453 if (pixGetColormap(pixs))
2454 return (
PIX *)ERROR_PTR(
"pixs has colormap", __func__, NULL);
2455 pixGetDimensions(pixs, &w, &h, &d);
2456 if (d != 8 && d != 32)
2457 return (
PIX *)ERROR_PTR(
"pixs not 8 or 32 bpp", __func__, NULL);
2459 pixd = pixCreateTemplate(pixs);
2460 datas = pixGetData(pixs);
2461 datad = pixGetData(pixd);
2462 wpls = pixGetWpl(pixs);
2463 wpld = pixGetWpl(pixd);
2464 for (i = 0; i < h; i++) {
2465 lines = datas + i * wpls;
2466 lined = datad + i * wpld;
2467 for (j = 0; j < w; j++) {
2471 val = L_MIN(255, L_MAX(0, val));
2474 pixel = *(lines + j);
2475 extractRGBValues(pixel, &rval, &gval, &bval);
2477 rval = L_MIN(255, L_MAX(0, rval));
2479 gval = L_MIN(255, L_MAX(0, gval));
2481 bval = L_MIN(255, L_MAX(0, bval));
2482 composeRGBPixel(rval, gval, bval, lined + j);
2508static l_int32 select = 0;
2509static l_float32 saveval;
2510l_float32 frand, xval, yval, rsq, factor;
2514 frand = (l_float32)rand() / (l_float32)RAND_MAX;
2515 xval = 2.0 * frand - 1.0;
2516 frand = (l_float32)rand() / (l_float32)RAND_MAX;
2517 yval = 2.0 * frand - 1.0;
2518 rsq = xval * xval + yval * yval;
2519 if (rsq > 0.0 && rsq < 1.0)
2522 factor = sqrt(-2.0 * log(rsq) / rsq);
2523 saveval = xval * factor;
2525 return yval * factor;
#define GET_DATA_TWO_BYTES(pdata, n)
#define SET_DATA_BIT(pdata, n)
#define SET_DATA_TWO_BYTES(pdata, n, val)
#define GET_DATA_BYTE(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_BIT(pdata, n)
static void blockconvLow(l_uint32 *data, l_int32 w, l_int32 h, l_int32 wpl, l_uint32 *dataa, l_int32 wpla, l_int32 wc, l_int32 hc)
blockconvLow()
PIX * pixBlockconvGrayUnnormalized(PIX *pixs, l_int32 wc, l_int32 hc)
pixBlockconvGrayUnnormalized()
PIX * pixBlockrank(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc, l_float32 rank)
pixBlockrank()
FPIX * fpixConvolve(FPIX *fpixs, L_KERNEL *kel, l_int32 normflag)
fpixConvolve()
DPIX * pixMeanSquareAccum(PIX *pixs)
pixMeanSquareAccum()
PIX * pixBlockconv(PIX *pix, l_int32 wc, l_int32 hc)
pixBlockconv()
static void blocksumLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpl, l_uint32 *dataa, l_int32 wpla, l_int32 wc, l_int32 hc)
blocksumLow()
PIX * pixBlockconvAccum(PIX *pixs)
pixBlockconvAccum()
PIX * pixAddGaussianNoise(PIX *pixs, l_float32 stdev)
pixAddGaussianNoise()
PIX * pixBlockconvGrayTile(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlockconvGrayTile()
PIX * pixBlockconvTiled(PIX *pix, l_int32 wc, l_int32 hc, l_int32 nx, l_int32 ny)
pixBlockconvTiled()
PIX * pixConvolve(PIX *pixs, L_KERNEL *kel, l_int32 outdepth, l_int32 normflag)
pixConvolve()
PIX * pixConvolveWithBias(PIX *pixs, L_KERNEL *kel1, L_KERNEL *kel2, l_int32 force8, l_int32 *pbias)
pixConvolveWithBias()
void l_setConvolveSampling(l_int32 xfact, l_int32 yfact)
l_setConvolveSampling()
PIX * pixConvolveSep(PIX *pixs, L_KERNEL *kelx, L_KERNEL *kely, l_int32 outdepth, l_int32 normflag)
pixConvolveSep()
PIX * pixWindowedMeanSquare(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder)
pixWindowedMeanSquare()
l_ok pixWindowedVariance(PIX *pixm, PIX *pixms, FPIX **pfpixv, FPIX **pfpixrv)
pixWindowedVariance()
PIX * pixConvolveRGB(PIX *pixs, L_KERNEL *kel)
pixConvolveRGB()
PIX * pixBlockconvGray(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlockconvGray()
l_ok pixWindowedStats(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder, PIX **ppixm, PIX **ppixms, FPIX **pfpixv, FPIX **pfpixrv)
pixWindowedStats()
PIX * pixCensusTransform(PIX *pixs, l_int32 halfsize, PIX *pixacc)
pixCensusTransform()
PIX * pixBlocksum(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlocksum()
FPIX * fpixConvolveSep(FPIX *fpixs, L_KERNEL *kelx, L_KERNEL *kely, l_int32 normflag)
fpixConvolveSep()
l_float32 gaussDistribSampling(void)
gaussDistribSampling()
PIX * pixConvolveRGBSep(PIX *pixs, L_KERNEL *kelx, L_KERNEL *kely)
pixConvolveRGBSep()
PIX * pixWindowedMean(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder, l_int32 normflag)
pixWindowedMean()
@ REMOVE_CMAP_BASED_ON_SRC