88 #include "allheaders.h" 93 LEPT_DLL l_int32 ConvolveSamplingFactX = 1;
94 LEPT_DLL l_int32 ConvolveSamplingFactY = 1;
97 static void blockconvLow(l_uint32 *data, l_int32 w, l_int32 h, l_int32 wpl,
98 l_uint32 *dataa, l_int32 wpla, l_int32 wc,
100 static void blockconvAccumLow(l_uint32 *datad, l_int32 w, l_int32 h,
101 l_int32 wpld, l_uint32 *datas, l_int32 d,
103 static void blocksumLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpl,
104 l_uint32 *dataa, l_int32 wpla, l_int32 wc, l_int32 hc);
132 PIX *pixs, *pixd, *pixr, *pixrc, *pixg, *pixgc, *pixb, *pixbc;
134 PROCNAME(
"pixBlockconv");
137 return (
PIX *)ERROR_PTR(
"pix not defined", procName, NULL);
141 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
142 wc = L_MIN(wc, (w - 1) / 2);
143 hc = L_MIN(hc, (h - 1) / 2);
144 L_WARNING(
"kernel too large; reducing!\n", procName);
145 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
147 if (wc == 0 && hc == 0)
151 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
152 L_WARNING(
"pix has colormap; removing\n", procName);
154 d = pixGetDepth(pixs);
159 if (d != 8 && d != 32) {
161 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, NULL);
215 l_int32 w, h, d, wpl, wpla;
216 l_uint32 *datad, *dataa;
219 PROCNAME(
"pixBlockconvGray");
222 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
225 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
228 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
229 wc = L_MIN(wc, (w - 1) / 2);
230 hc = L_MIN(hc, (h - 1) / 2);
231 L_WARNING(
"kernel too large; reducing!\n", procName);
232 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
234 if (wc == 0 && hc == 0)
238 if (pixGetDepth(pixacc) == 32) {
241 L_WARNING(
"pixacc not 32 bpp; making new one\n", procName);
243 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
247 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
252 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
255 wpl = pixGetWpl(pixs);
256 wpla = pixGetWpl(pixt);
323 l_int32 i, j, imax, imin, jmax, jmin;
324 l_int32 wn, hn, fwc, fhc, wmwc, hmhc;
325 l_float32 norm, normh, normw;
327 l_uint32 *linemina, *linemaxa, *line;
329 PROCNAME(
"blockconvLow");
333 if (wmwc <= 0 || hmhc <= 0) {
334 L_ERROR(
"wc >= w || hc >=h\n", procName);
339 norm = 1.0 / ((l_float32)(fwc) * fhc);
344 for (i = 0; i < h; i++) {
345 imin = L_MAX(i - 1 - hc, 0);
346 imax = L_MIN(i + hc, h - 1);
347 line = data + wpl * i;
348 linemina = dataa + wpla * imin;
349 linemaxa = dataa + wpla * imax;
350 for (j = 0; j < w; j++) {
351 jmin = L_MAX(j - 1 - wc, 0);
352 jmax = L_MIN(j + wc, w - 1);
353 val = linemaxa[jmax] - linemaxa[jmin]
354 + linemina[jmin] - linemina[jmax];
355 val = (l_uint8)(norm * val + 0.5);
363 for (i = 0; i <= hc; i++) {
365 normh = (l_float32)fhc / (l_float32)hn;
366 line = data + wpl * i;
367 for (j = 0; j <= wc; j++) {
369 normw = (l_float32)fwc / (l_float32)wn;
371 val = (l_uint8)L_MIN(val * normh * normw, 255);
374 for (j = wc + 1; j < wmwc; j++) {
376 val = (l_uint8)L_MIN(val * normh, 255);
379 for (j = wmwc; j < w; j++) {
381 normw = (l_float32)fwc / (l_float32)wn;
383 val = (l_uint8)L_MIN(val * normh * normw, 255);
388 for (i = hmhc; i < h; i++) {
390 normh = (l_float32)fhc / (l_float32)hn;
391 line = data + wpl * i;
392 for (j = 0; j <= wc; j++) {
394 normw = (l_float32)fwc / (l_float32)wn;
396 val = (l_uint8)L_MIN(val * normh * normw, 255);
399 for (j = wc + 1; j < wmwc; j++) {
401 val = (l_uint8)L_MIN(val * normh, 255);
404 for (j = wmwc; j < w; j++) {
406 normw = (l_float32)fwc / (l_float32)wn;
408 val = (l_uint8)L_MIN(val * normh * normw, 255);
413 for (i = hc + 1; i < hmhc; i++) {
414 line = data + wpl * i;
415 for (j = 0; j <= wc; j++) {
417 normw = (l_float32)fwc / (l_float32)wn;
419 val = (l_uint8)L_MIN(val * normw, 255);
422 for (j = wmwc; j < w; j++) {
424 normw = (l_float32)fwc / (l_float32)wn;
426 val = (l_uint8)L_MIN(val * normw, 255);
457 l_int32 w, h, d, wpls, wpld;
458 l_uint32 *datas, *datad;
461 PROCNAME(
"pixBlockconvAccum");
464 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
467 if (d != 1 && d != 8 && d != 32)
468 return (
PIX *)ERROR_PTR(
"pixs not 1, 8 or 32 bpp", procName, NULL);
469 if ((pixd =
pixCreate(w, h, 32)) == NULL)
470 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
474 wpls = pixGetWpl(pixs);
475 wpld = pixGetWpl(pixd);
476 blockconvAccumLow(datad, w, h, wpld, datas, d, wpls);
501 blockconvAccumLow(l_uint32 *datad,
512 l_uint32 *lines, *lined, *linedp;
514 PROCNAME(
"blockconvAccumLow");
521 for (j = 0; j < w; j++) {
526 lined[j] = lined[j - 1] + val;
530 for (i = 1; i < h; i++) {
531 lines = datas + i * wpls;
532 lined = datad + i * wpld;
533 linedp = lined - wpld;
534 for (j = 0; j < w; j++) {
537 lined[0] = val + linedp[0];
539 lined[j] = val + lined[j - 1] + linedp[j] - linedp[j - 1];
544 for (j = 0; j < w; j++) {
549 lined[j] = lined[j - 1] + val;
553 for (i = 1; i < h; i++) {
554 lines = datas + i * wpls;
555 lined = datad + i * wpld;
556 linedp = lined - wpld;
557 for (j = 0; j < w; j++) {
560 lined[0] = val + linedp[0];
562 lined[j] = val + lined[j - 1] + linedp[j] - linedp[j - 1];
565 }
else if (d == 32) {
567 for (j = 0; j < w; j++) {
572 lined[j] = lined[j - 1] + val32;
576 for (i = 1; i < h; i++) {
577 lines = datas + i * wpls;
578 lined = datad + i * wpld;
579 linedp = lined - wpld;
580 for (j = 0; j < w; j++) {
583 lined[0] = val32 + linedp[0];
585 lined[j] = val32 + lined[j - 1] + linedp[j] - linedp[j - 1];
589 L_ERROR(
"depth not 1, 8 or 32 bpp\n", procName);
640 l_int32 i, j, w, h, d, wpla, wpld, jmax;
641 l_uint32 *linemina, *linemaxa, *lined, *dataa, *datad;
642 PIX *pixsb, *pixacc, *pixd;
644 PROCNAME(
"pixBlockconvGrayUnnormalized");
647 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
650 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
653 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
654 wc = L_MIN(wc, (w - 1) / 2);
655 hc = L_MIN(hc, (h - 1) / 2);
656 L_WARNING(
"kernel too large; reducing!\n", procName);
657 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
659 if (wc == 0 && hc == 0)
663 return (
PIX *)ERROR_PTR(
"pixsb not made", procName, NULL);
667 return (
PIX *)ERROR_PTR(
"pixacc not made", procName, NULL);
668 if ((pixd =
pixCreate(w, h, 32)) == NULL) {
670 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
673 wpla = pixGetWpl(pixacc);
674 wpld = pixGetWpl(pixd);
677 for (i = 0; i < h; i++) {
678 lined = datad + i * wpld;
679 linemina = dataa + i * wpla;
680 linemaxa = dataa + (i + 2 * hc + 1) * wpla;
681 for (j = 0; j < w; j++) {
682 jmax = j + 2 * wc + 1;
683 lined[j] = linemaxa[jmax] - linemaxa[j] -
684 linemina[jmax] + linemina[j];
733 l_int32 i, j, w, h, d, xrat, yrat;
734 PIX *pixs, *pixd, *pixc, *pixt;
735 PIX *pixr, *pixrc, *pixg, *pixgc, *pixb, *pixbc;
738 PROCNAME(
"pixBlockconvTiled");
741 return (
PIX *)ERROR_PTR(
"pix not defined", procName, NULL);
745 if (w < 2 * wc + 3 || h < 2 * hc + 3) {
746 wc = L_MAX(0, L_MIN(wc, (w - 3) / 2));
747 hc = L_MAX(0, L_MIN(hc, (h - 3) / 2));
748 L_WARNING(
"kernel too large; reducing!\n", procName);
749 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
751 if (wc == 0 && hc == 0)
753 if (nx <= 1 && ny <= 1)
763 L_WARNING(
"tile width too small; nx reduced to %d\n", procName, nx);
767 L_WARNING(
"tile height too small; ny reduced to %d\n", procName, ny);
771 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
772 L_WARNING(
"pix has colormap; removing\n", procName);
774 d = pixGetDepth(pixs);
779 if (d != 8 && d != 32) {
781 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, NULL);
793 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
796 for (i = 0; i < ny; i++) {
797 for (j = 0; j < nx; j++) {
858 l_int32 w, h, d, wd, hd, i, j, imin, imax, jmin, jmax, wplt, wpld;
861 l_uint32 *datat, *datad, *lined, *linemint, *linemaxt;
864 PROCNAME(
"pixBlockconvGrayTile");
867 return (
PIX *)ERROR_PTR(
"pix not defined", procName, NULL);
870 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
873 if (w < 2 * wc + 3 || h < 2 * hc + 3) {
874 wc = L_MAX(0, L_MIN(wc, (w - 3) / 2));
875 hc = L_MAX(0, L_MIN(hc, (h - 3) / 2));
876 L_WARNING(
"kernel too large; reducing!\n", procName);
877 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
879 if (wc == 0 && hc == 0)
885 if (pixGetDepth(pixacc) == 32) {
888 L_WARNING(
"pixacc not 32 bpp; making new one\n", procName);
890 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
894 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
899 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
902 wplt = pixGetWpl(pixt);
904 wpld = pixGetWpl(pixd);
905 norm = 1. / (l_float32)((2 * wc + 1) * (2 * hc + 1));
916 for (i = hc; i < hc + hd - 2; i++) {
917 imin = L_MAX(i - hc - 1, 0);
918 imax = L_MIN(i + hc, h - 1);
919 lined = datad + i * wpld;
920 linemint = datat + imin * wplt;
921 linemaxt = datat + imax * wplt;
922 for (j = wc; j < wc + wd - 2; j++) {
923 jmin = L_MAX(j - wc - 1, 0);
924 jmax = L_MIN(j + wc, w - 1);
925 val = linemaxt[jmax] - linemaxt[jmin]
926 + linemint[jmin] - linemint[jmax];
927 val = (l_uint8)(norm * val + 0.5);
989 PIX *pixb, *pixm, *pixms;
991 PROCNAME(
"pixWindowedStats");
993 if (!ppixm && !ppixms && !pfpixv && !pfpixrv)
994 return ERROR_INT(
"no output requested", procName, 1);
995 if (ppixm) *ppixm = NULL;
996 if (ppixms) *ppixms = NULL;
997 if (pfpixv) *pfpixv = NULL;
998 if (pfpixrv) *pfpixrv = NULL;
999 if (!pixs || pixGetDepth(pixs) != 8)
1000 return ERROR_INT(
"pixs not defined or not 8 bpp", procName, 1);
1001 if (wc < 2 || hc < 2)
1002 return ERROR_INT(
"wc and hc not >= 2", procName, 1);
1010 if (!pfpixv && !pfpixrv) {
1071 l_int32 i, j, w, h, d, wd, hd, wplc, wpld, wincr, hincr;
1073 l_uint32 *datac, *datad, *linec1, *linec2, *lined;
1075 PIX *pixb, *pixc, *pixd;
1077 PROCNAME(
"pixWindowedMean");
1080 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1081 d = pixGetDepth(pixs);
1082 if (d != 8 && d != 32)
1083 return (
PIX *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
1084 if (wc < 2 || hc < 2)
1085 return (
PIX *)ERROR_PTR(
"wc and hc not >= 2", procName, NULL);
1087 pixb = pixc = pixd = NULL;
1097 L_ERROR(
"pixc not made\n", procName);
1100 wplc = pixGetWpl(pixc);
1106 wd = w - 2 * (wc + 1);
1107 hd = h - 2 * (hc + 1);
1108 if (wd < 2 || hd < 2) {
1109 L_ERROR(
"w or h is too small for the kernel\n", procName);
1112 if ((pixd =
pixCreate(wd, hd, d)) == NULL) {
1113 L_ERROR(
"pixd not made\n", procName);
1116 wpld = pixGetWpl(pixd);
1123 norm = 1.0 / ((l_float32)(wincr) * hincr);
1124 for (i = 0; i < hd; i++) {
1125 linec1 = datac + i * wplc;
1126 linec2 = datac + (i + hincr) * wplc;
1127 lined = datad + i * wpld;
1128 for (j = 0; j < wd; j++) {
1129 val = linec2[j + wincr] - linec2[j] - linec1[j + wincr] + linec1[j];
1131 val = (l_uint8)(norm * val);
1134 val = (l_uint32)(norm * val);
1187 l_int32 i, j, w, h, wd, hd, wpl, wpld, wincr, hincr;
1189 l_uint32 *datad, *lined;
1192 l_float64 *data, *line1, *line2;
1196 PROCNAME(
"pixWindowedMeanSquare");
1198 if (!pixs || (pixGetDepth(pixs) != 8))
1199 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", procName, NULL);
1200 if (wc < 2 || hc < 2)
1201 return (
PIX *)ERROR_PTR(
"wc and hc not >= 2", procName, NULL);
1212 L_ERROR(
"dpix not made\n", procName);
1221 wd = w - 2 * (wc + 1);
1222 hd = h - 2 * (hc + 1);
1223 if (wd < 2 || hd < 2) {
1224 L_ERROR(
"w or h too small for kernel\n", procName);
1227 if ((pixd =
pixCreate(wd, hd, 32)) == NULL) {
1228 L_ERROR(
"pixd not made\n", procName);
1231 wpld = pixGetWpl(pixd);
1236 norm = 1.0 / ((l_float32)(wincr) * hincr);
1237 for (i = 0; i < hd; i++) {
1238 line1 = data + i * wpl;
1239 line2 = data + (i + hincr) * wpl;
1240 lined = datad + i * wpld;
1241 for (j = 0; j < wd; j++) {
1242 val = line2[j + wincr] - line2[j] - line1[j + wincr] + line1[j];
1243 ival = (l_uint32)(norm * val);
1285 l_int32 i, j, w, h, ws, hs, ds, wplm, wplms, wplv, wplrv, valm, valms;
1287 l_uint32 *linem, *linems, *datam, *datams;
1288 l_float32 *linev, *linerv, *datav, *datarv;
1289 FPIX *fpixv, *fpixrv;
1291 PROCNAME(
"pixWindowedVariance");
1293 if (!pfpixv && !pfpixrv)
1294 return ERROR_INT(
"no output requested", procName, 1);
1295 if (pfpixv) *pfpixv = NULL;
1296 if (pfpixrv) *pfpixrv = NULL;
1297 if (!pixm || pixGetDepth(pixm) != 8)
1298 return ERROR_INT(
"pixm undefined or not 8 bpp", procName, 1);
1299 if (!pixms || pixGetDepth(pixms) != 32)
1300 return ERROR_INT(
"pixms undefined or not 32 bpp", procName, 1);
1303 if (w != ws || h != hs)
1304 return ERROR_INT(
"pixm and pixms sizes differ", procName, 1);
1319 wplm = pixGetWpl(pixm);
1320 wplms = pixGetWpl(pixms);
1323 for (i = 0; i < h; i++) {
1324 linem = datam + i * wplm;
1325 linems = datams + i * wplms;
1327 linev = datav + i * wplv;
1329 linerv = datarv + i * wplrv;
1330 for (j = 0; j < w; j++) {
1335 valms = (l_int32)linems[j];
1336 var = (l_float32)valms - (l_float32)valm * valm;
1340 linerv[j] = (l_float32)sqrt(var);
1371 l_int32 i, j, w, h, wpl, wpls, val;
1372 l_uint32 *datas, *lines;
1373 l_float64 *data, *line, *linep;
1376 PROCNAME(
"pixMeanSquareAccum");
1379 if (!pixs || (pixGetDepth(pixs) != 8))
1380 return (
DPIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", procName, NULL);
1383 return (
DPIX *)ERROR_PTR(
"dpix not made", procName, NULL);
1386 wpls = pixGetWpl(pixs);
1392 for (j = 0; j < w; j++) {
1395 line[0] = (l_float64)(val) * val;
1397 line[j] = line[j - 1] + (l_float64)(val) * val;
1401 for (i = 1; i < h; i++) {
1402 lines = datas + i * wpls;
1403 line = data + i * wpl;
1404 linep = line - wpl;;
1405 for (j = 0; j < w; j++) {
1408 line[0] = linep[0] + (l_float64)(val) * val;
1410 line[j] = line[j - 1] + linep[j] - linep[j - 1]
1411 + (l_float64)(val) * val;
1456 l_int32 w, h, d, thresh;
1459 PROCNAME(
"pixBlockrank");
1462 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1465 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
1466 if (rank < 0.0 || rank > 1.0)
1467 return (
PIX *)ERROR_PTR(
"rank must be in [0.0, 1.0]", procName, NULL);
1477 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
1478 wc = L_MIN(wc, (w - 1) / 2);
1479 hc = L_MIN(hc, (h - 1) / 2);
1480 L_WARNING(
"kernel too large; reducing!\n", procName);
1481 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
1483 if (wc == 0 && hc == 0)
1486 if ((pixt =
pixBlocksum(pixs, pixacc, wc, hc)) == NULL)
1487 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
1492 thresh = (l_int32)(255. * rank);
1537 l_int32 w, h, d, wplt, wpld;
1538 l_uint32 *datat, *datad;
1541 PROCNAME(
"pixBlocksum");
1544 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1547 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
1550 if (w < 2 * wc + 1 || h < 2 * hc + 1) {
1551 wc = L_MIN(wc, (w - 1) / 2);
1552 hc = L_MIN(hc, (h - 1) / 2);
1553 L_WARNING(
"kernel too large; reducing!\n", procName);
1554 L_INFO(
"wc = %d, hc = %d\n", procName, wc, hc);
1556 if (wc == 0 && hc == 0)
1560 if (pixGetDepth(pixacc) != 32)
1561 return (
PIX *)ERROR_PTR(
"pixacc not 32 bpp", procName, NULL);
1565 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
1569 if ((pixd =
pixCreate(w, h, 8)) == NULL) {
1571 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1573 pixCopyResolution(pixd, pixs);
1575 wpld = pixGetWpl(pixd);
1576 wplt = pixGetWpl(pixt);
1579 blocksumLow(datad, w, h, wpld, datat, wplt, wc, hc);
1628 l_int32 i, j, imax, imin, jmax, jmin;
1629 l_int32 wn, hn, fwc, fhc, wmwc, hmhc;
1630 l_float32 norm, normh, normw;
1632 l_uint32 *linemina, *linemaxa, *lined;
1634 PROCNAME(
"blocksumLow");
1638 if (wmwc <= 0 || hmhc <= 0) {
1639 L_ERROR(
"wc >= w || hc >=h\n", procName);
1644 norm = 255. / ((l_float32)(fwc) * fhc);
1649 for (i = 0; i < h; i++) {
1650 imin = L_MAX(i - 1 - hc, 0);
1651 imax = L_MIN(i + hc, h - 1);
1652 lined = datad + wpl * i;
1653 linemina = dataa + wpla * imin;
1654 linemaxa = dataa + wpla * imax;
1655 for (j = 0; j < w; j++) {
1656 jmin = L_MAX(j - 1 - wc, 0);
1657 jmax = L_MIN(j + wc, w - 1);
1658 val = linemaxa[jmax] - linemaxa[jmin]
1659 - linemina[jmax] + linemina[jmin];
1660 val = (l_uint8)(norm * val);
1668 for (i = 0; i <= hc; i++) {
1670 normh = (l_float32)fhc / (l_float32)hn;
1671 lined = datad + wpl * i;
1672 for (j = 0; j <= wc; j++) {
1674 normw = (l_float32)fwc / (l_float32)wn;
1676 val = (l_uint8)(val * normh * normw);
1679 for (j = wc + 1; j < wmwc; j++) {
1681 val = (l_uint8)(val * normh);
1684 for (j = wmwc; j < w; j++) {
1686 normw = (l_float32)fwc / (l_float32)wn;
1688 val = (l_uint8)(val * normh * normw);
1693 for (i = hmhc; i < h; i++) {
1695 normh = (l_float32)fhc / (l_float32)hn;
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 * normh * normw);
1704 for (j = wc + 1; j < wmwc; j++) {
1706 val = (l_uint8)(val * normh);
1709 for (j = wmwc; j < w; j++) {
1711 normw = (l_float32)fwc / (l_float32)wn;
1713 val = (l_uint8)(val * normh * normw);
1718 for (i = hc + 1; i < hmhc; i++) {
1719 lined = datad + wpl * i;
1720 for (j = 0; j <= wc; j++) {
1722 normw = (l_float32)fwc / (l_float32)wn;
1724 val = (l_uint8)(val * normw);
1727 for (j = wmwc; j < w; j++) {
1729 normw = (l_float32)fwc / (l_float32)wn;
1731 val = (l_uint8)(val * normw);
1776 l_int32 i, j, w, h, wpls, wplv, wpld;
1778 l_uint32 *datas, *datav, *datad, *lines, *linev, *lined;
1781 PROCNAME(
"pixCensusTransform");
1784 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1785 if (pixGetDepth(pixs) != 8)
1786 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1788 return (
PIX *)ERROR_PTR(
"halfsize must be >= 1", procName, NULL);
1793 return (
PIX *)ERROR_PTR(
"pixav not made", procName, NULL);
1798 if ((pixd =
pixCreate(w, h, 1)) == NULL) {
1800 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1805 wpls = pixGetWpl(pixs);
1806 wplv = pixGetWpl(pixav);
1807 wpld = pixGetWpl(pixd);
1808 for (i = 0; i < h; i++) {
1809 lines = datas + i * wpls;
1810 linev = datav + i * wplv;
1811 lined = datad + i * wpld;
1812 for (j = 0; j < w; j++) {
1877 l_int32 i, j, id, jd, k, m, w, h, d, wd, hd, sx, sy, cx, cy, wplt, wpld;
1879 l_uint32 *datat, *datad, *linet, *lined;
1884 PROCNAME(
"pixConvolve");
1887 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1888 if (pixGetColormap(pixs))
1889 return (
PIX *)ERROR_PTR(
"pixs has colormap", procName, NULL);
1891 if (d != 8 && d != 16 && d != 32)
1892 return (
PIX *)ERROR_PTR(
"pixs not 8, 16, or 32 bpp", procName, NULL);
1894 return (
PIX *)ERROR_PTR(
"kel not defined", procName, NULL);
1906 L_ERROR(
"pixt not made\n", procName);
1910 wd = (w + ConvolveSamplingFactX - 1) / ConvolveSamplingFactX;
1911 hd = (h + ConvolveSamplingFactY - 1) / ConvolveSamplingFactY;
1915 wplt = pixGetWpl(pixt);
1916 wpld = pixGetWpl(pixd);
1917 for (i = 0,
id = 0;
id < hd; i += ConvolveSamplingFactY,
id++) {
1918 lined = datad +
id * wpld;
1919 for (j = 0, jd = 0; jd < wd; j += ConvolveSamplingFactX, jd++) {
1921 for (k = 0; k < sy; k++) {
1922 linet = datat + (i + k) * wplt;
1924 for (m = 0; m < sx; m++) {
1926 sum += val * keln->
data[k][m];
1928 }
else if (d == 16) {
1929 for (m = 0; m < sx; m++) {
1931 sum += val * keln->
data[k][m];
1934 for (m = 0; m < sx; m++) {
1935 val = *(linet + j + m);
1936 sum += val * keln->
data[k][m];
1940 if (sum < 0.0) sum = -sum;
1943 else if (outdepth == 16)
1946 *(lined + jd) = (l_uint32)(sum + 0.5);
2008 l_int32 d, xfact, yfact;
2012 PROCNAME(
"pixConvolveSep");
2015 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2016 d = pixGetDepth(pixs);
2017 if (d != 8 && d != 16 && d != 32)
2018 return (
PIX *)ERROR_PTR(
"pixs not 8, 16, or 32 bpp", procName, NULL);
2020 return (
PIX *)ERROR_PTR(
"kelx not defined", procName, NULL);
2022 return (
PIX *)ERROR_PTR(
"kely not defined", procName, NULL);
2024 xfact = ConvolveSamplingFactX;
2025 yfact = ConvolveSamplingFactY;
2077 PIX *pixt, *pixr, *pixg, *pixb, *pixd;
2079 PROCNAME(
"pixConvolveRGB");
2082 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2083 if (pixGetDepth(pixs) != 32)
2084 return (
PIX *)ERROR_PTR(
"pixs is not 32 bpp", procName, NULL);
2086 return (
PIX *)ERROR_PTR(
"kel not defined", procName, NULL);
2137 PIX *pixt, *pixr, *pixg, *pixb, *pixd;
2139 PROCNAME(
"pixConvolveRGBSep");
2142 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2143 if (pixGetDepth(pixs) != 32)
2144 return (
PIX *)ERROR_PTR(
"pixs is not 32 bpp", procName, NULL);
2146 return (
PIX *)ERROR_PTR(
"kelx, kely not both defined", procName, NULL);
2199 l_int32 i, j, id, jd, k, m, w, h, wd, hd, sx, sy, cx, cy, wplt, wpld;
2201 l_float32 *datat, *datad, *linet, *lined;
2204 FPIX *fpixt, *fpixd;
2206 PROCNAME(
"fpixConvolve");
2209 return (
FPIX *)ERROR_PTR(
"fpixs not defined", procName, NULL);
2211 return (
FPIX *)ERROR_PTR(
"kel not defined", procName, NULL);
2225 L_ERROR(
"fpixt not made\n", procName);
2229 wd = (w + ConvolveSamplingFactX - 1) / ConvolveSamplingFactX;
2230 hd = (h + ConvolveSamplingFactY - 1) / ConvolveSamplingFactY;
2236 for (i = 0,
id = 0;
id < hd; i += ConvolveSamplingFactY,
id++) {
2237 lined = datad +
id * wpld;
2238 for (j = 0, jd = 0; jd < wd; j += ConvolveSamplingFactX, jd++) {
2240 for (k = 0; k < sy; k++) {
2241 linet = datat + (i + k) * wplt;
2242 for (m = 0; m < sx; m++) {
2243 val = *(linet + j + m);
2244 sum += val * keln->
data[k][m];
2247 *(lined + jd) = sum;
2294 l_int32 xfact, yfact;
2296 FPIX *fpixt, *fpixd;
2298 PROCNAME(
"fpixConvolveSep");
2301 return (
FPIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2303 return (
FPIX *)ERROR_PTR(
"kelx not defined", procName, NULL);
2305 return (
FPIX *)ERROR_PTR(
"kely not defined", procName, NULL);
2307 xfact = ConvolveSamplingFactX;
2308 yfact = ConvolveSamplingFactY;
2374 l_float32 min1, min2, min, minval, maxval, range;
2375 FPIX *fpix1, *fpix2;
2378 PROCNAME(
"pixConvolveWithBias");
2381 return (
PIX *)ERROR_PTR(
"&bias not defined", procName, NULL);
2383 if (!pixs || pixGetDepth(pixs) != 8)
2384 return (
PIX *)ERROR_PTR(
"pixs undefined or not 8 bpp", procName, NULL);
2385 if (pixGetColormap(pixs))
2386 return (
PIX *)ERROR_PTR(
"pixs has colormap", procName, NULL);
2388 return (
PIX *)ERROR_PTR(
"kel1 not defined", procName, NULL);
2395 min = L_MIN(min1, min2);
2422 range = maxval - minval;
2423 *pbias = (minval < 0.0) ? -minval : 0.0;
2425 if (range <= 255 || !force8) {
2426 outdepth = (range > 255) ? 16 : 8;
2460 if (xfact < 1) xfact = 1;
2461 if (yfact < 1) yfact = 1;
2462 ConvolveSamplingFactX = xfact;
2463 ConvolveSamplingFactY = yfact;
2487 l_int32 i, j, w, h, d, wpls, wpld, val, rval, gval, bval;
2489 l_uint32 *datas, *datad, *lines, *lined;
2492 PROCNAME(
"pixAddGaussianNoise");
2495 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2496 if (pixGetColormap(pixs))
2497 return (
PIX *)ERROR_PTR(
"pixs has colormap", procName, NULL);
2499 if (d != 8 && d != 32)
2500 return (
PIX *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
2505 wpls = pixGetWpl(pixs);
2506 wpld = pixGetWpl(pixd);
2507 for (i = 0; i < h; i++) {
2508 lines = datas + i * wpls;
2509 lined = datad + i * wpld;
2510 for (j = 0; j < w; j++) {
2514 val = L_MIN(255, L_MAX(0, val));
2517 pixel = *(lines + j);
2520 rval = L_MIN(255, L_MAX(0, rval));
2522 gval = L_MIN(255, L_MAX(0, gval));
2524 bval = L_MIN(255, L_MAX(0, bval));
2549 static l_int32 select = 0;
2550 static l_float32 saveval;
2551 l_float32 frand, xval, yval, rsq, factor;
2555 frand = (l_float32)rand() / (l_float32)RAND_MAX;
2556 xval = 2.0 * frand - 1.0;
2557 frand = (l_float32)rand() / (l_float32)RAND_MAX;
2558 yval = 2.0 * frand - 1.0;
2559 rsq = xval * xval + yval * yval;
2560 if (rsq > 0.0 && rsq < 1.0)
2563 factor = sqrt(-2.0 * log(rsq) / rsq);
2564 saveval = xval * factor;
2566 return yval * factor;
l_ok fpixGetMax(FPIX *fpix, l_float32 *pmaxval, l_int32 *pxmaxloc, l_int32 *pymaxloc)
fpixGetMax()
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 * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
void dpixDestroy(DPIX **pdpix)
dpixDestroy()
PIX * pixBlockconvGrayTile(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlockconvGrayTile()
PIX * pixConvolveRGB(PIX *pixs, L_KERNEL *kel)
pixConvolveRGB()
l_ok kernelGetParameters(L_KERNEL *kel, l_int32 *psy, l_int32 *psx, l_int32 *pcy, l_int32 *pcx)
kernelGetParameters()
DPIX * dpixCreate(l_int32 width, l_int32 height)
dpixCreate()
PIX * pixBlockconvAccum(PIX *pixs)
pixBlockconvAccum()
PIX * pixWindowedMean(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder, l_int32 normflag)
pixWindowedMean()
PIX * pixCensusTransform(PIX *pixs, l_int32 halfsize, PIX *pixacc)
pixCensusTransform()
l_float64 * dpixGetData(DPIX *dpix)
dpixGetData()
l_float32 gaussDistribSampling()
gaussDistribSampling()
FPIX * fpixAddMirroredBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixAddMirroredBorder()
FPIX * fpixConvolveSep(FPIX *fpixs, L_KERNEL *kelx, L_KERNEL *kely, l_int32 normflag)
fpixConvolveSep()
l_int32 dpixGetWpl(DPIX *dpix)
dpixGetWpl()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
PIX * pixConvolveRGBSep(PIX *pixs, L_KERNEL *kelx, L_KERNEL *kely)
pixConvolveRGBSep()
l_ok pixSetAll(PIX *pix)
pixSetAll()
l_ok fpixAddMultConstant(FPIX *fpix, l_float32 addc, l_float32 multc)
fpixAddMultConstant()
PIX * pixInvert(PIX *pixd, PIX *pixs)
pixInvert()
l_ok fpixGetDimensions(FPIX *fpix, l_int32 *pw, l_int32 *ph)
fpixGetDimensions()
PIX * pixAddMirroredBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixAddMirroredBorder()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_ok pixTilingPaintTile(PIX *pixd, l_int32 i, l_int32 j, PIX *pixs, PIXTILING *pt)
pixTilingPaintTile()
PIX * fpixConvertToPix(FPIX *fpixs, l_int32 outdepth, l_int32 negvals, l_int32 errorflag)
fpixConvertToPix()
PIX * pixAddGaussianNoise(PIX *pixs, l_float32 stdev)
pixAddGaussianNoise()
PIX * pixThresholdToBinary(PIX *pixs, l_int32 thresh)
pixThresholdToBinary()
PIX * pixConvolve(PIX *pixs, L_KERNEL *kel, l_int32 outdepth, l_int32 normflag)
pixConvolve()
#define GET_DATA_BIT(pdata, n)
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
PIXTILING * pixTilingCreate(PIX *pixs, l_int32 nx, l_int32 ny, l_int32 w, l_int32 h, l_int32 xoverlap, l_int32 yoverlap)
pixTilingCreate()
PIX * pixCreateTemplateNoInit(PIX *pixs)
pixCreateTemplateNoInit()
void pixTilingDestroy(PIXTILING **ppt)
pixTilingDestroy()
PIX * pixGetRGBComponent(PIX *pixs, l_int32 comp)
pixGetRGBComponent()
l_ok fpixGetMin(FPIX *fpix, l_float32 *pminval, l_int32 *pxminloc, l_int32 *pyminloc)
fpixGetMin()
l_ok pixWindowedVariance(PIX *pixm, PIX *pixms, FPIX **pfpixv, FPIX **pfpixrv)
pixWindowedVariance()
PIX * pixBlockconvGrayUnnormalized(PIX *pixs, l_int32 wc, l_int32 hc)
pixBlockconvGrayUnnormalized()
L_KERNEL * kernelCopy(L_KERNEL *kels)
kernelCopy()
PIX * pixWindowedMeanSquare(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder)
pixWindowedMeanSquare()
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_BYTE(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()
l_int32 fpixGetWpl(FPIX *fpix)
fpixGetWpl()
void l_setConvolveSampling(l_int32 xfact, l_int32 yfact)
l_setConvolveSampling()
PIX * pixTilingGetTile(PIXTILING *pt, l_int32 i, l_int32 j)
pixTilingGetTile()
PIX * pixCreateRGBImage(PIX *pixr, PIX *pixg, PIX *pixb)
pixCreateRGBImage()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixConvolveWithBias(PIX *pixs, L_KERNEL *kel1, L_KERNEL *kel2, l_int32 force8, l_int32 *pbias)
pixConvolveWithBias()
PIX * pixBlockconvGray(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlockconvGray()
void pixDestroy(PIX **ppix)
pixDestroy()
L_KERNEL * kernelNormalize(L_KERNEL *kels, l_float32 normsum)
kernelNormalize()
l_float32 * fpixGetData(FPIX *fpix)
fpixGetData()
PIX * pixConvolveSep(PIX *pixs, L_KERNEL *kelx, L_KERNEL *kely, l_int32 outdepth, l_int32 normflag)
pixConvolveSep()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
L_KERNEL * kernelInvert(L_KERNEL *kels)
kernelInvert()
void kernelDestroy(L_KERNEL **pkel)
kernelDestroy()
PIX * pixBlockconvTiled(PIX *pix, l_int32 wc, l_int32 hc, l_int32 nx, l_int32 ny)
pixBlockconvTiled()
FPIX * pixConvertToFPix(PIX *pixs, l_int32 ncomps)
pixConvertToFPix()
FPIX * fpixCreate(l_int32 width, l_int32 height)
fpixCreate()
#define GET_DATA_TWO_BYTES(pdata, n)
DPIX * pixMeanSquareAccum(PIX *pixs)
pixMeanSquareAccum()
l_ok kernelGetMinMax(L_KERNEL *kel, l_float32 *pmin, l_float32 *pmax)
kernelGetMinMax()
PIX * pixBlockrank(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc, l_float32 rank)
pixBlockrank()
l_ok pixWindowedStats(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder, PIX **ppixm, PIX **ppixms, FPIX **pfpixv, FPIX **pfpixrv)
pixWindowedStats()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixBlockconv(PIX *pix, l_int32 wc, l_int32 hc)
pixBlockconv()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
#define SET_DATA_TWO_BYTES(pdata, n, val)
PIX * pixBlocksum(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlocksum()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
#define SET_DATA_BIT(pdata, n)
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()
FPIX * fpixConvolve(FPIX *fpixs, L_KERNEL *kel, l_int32 normflag)
fpixConvolve()