119 #include "allheaders.h" 123 static const l_float32 ENHANCE_SCALE_FACTOR = 5.;
126 static const l_int32 DEFAULT_HISTO_SAMPLES = 100000;
184 PROCNAME(
"pixGammaTRC");
187 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
188 if (pixd && (pixd !=
pixs))
189 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
191 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
194 if (minval >= maxval)
195 return (
PIX *)ERROR_PTR(
"minval not < maxval", procName, pixd);
196 cmap = pixGetColormap(
pixs);
197 d = pixGetDepth(
pixs);
198 if (!cmap && d != 8 && d != 32)
199 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
201 if (gamma == 1.0 && minval == 0 && maxval == 255)
213 if ((nag =
numaGammaTRC(gamma, minval, maxval)) == NULL)
214 return (
PIX *)ERROR_PTR(
"nag not made", procName, pixd);
252 PROCNAME(
"pixGammaTRCMasked");
258 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
259 if (pixGetColormap(
pixs))
260 return (
PIX *)ERROR_PTR(
"invalid: pixs has a colormap", procName, pixd);
261 if (pixd && (pixd !=
pixs))
262 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
263 d = pixGetDepth(
pixs);
264 if (d != 8 && d != 32)
265 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
266 if (minval >= maxval)
267 return (
PIX *)ERROR_PTR(
"minval not < maxval", procName, pixd);
269 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
273 if (gamma == 1.0 && minval == 0 && maxval == 255)
279 if ((nag =
numaGammaTRC(gamma, minval, maxval)) == NULL)
280 return (
PIX *)ERROR_PTR(
"nag not made", procName, pixd);
315 PROCNAME(
"pixGammaTRCWithAlpha");
317 if (!
pixs || pixGetDepth(
pixs) != 32)
318 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, pixd);
319 if (pixd && (pixd !=
pixs))
320 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
322 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
325 if (minval >= maxval)
326 return (
PIX *)ERROR_PTR(
"minval not < maxval", procName, pixd);
328 if (gamma == 1.0 && minval == 0 && maxval == 255)
334 if ((nag =
numaGammaTRC(gamma, minval, maxval)) == NULL)
335 return (
PIX *)ERROR_PTR(
"nag not made", procName, pixd);
371 l_float32 x, invgamma;
374 PROCNAME(
"numaGammaTRC");
376 if (minval >= maxval)
377 return (
NUMA *)ERROR_PTR(
"minval not < maxval", procName, NULL);
379 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
383 invgamma = 1. / gamma;
385 for (i = 0; i < minval; i++)
387 for (i = minval; i <= maxval; i++) {
389 if (i > 255)
continue;
390 x = (l_float32)(i - minval) / (l_float32)(maxval - minval);
391 val = (l_int32)(255. * powf(x, invgamma) + 0.5);
393 val = L_MIN(val, 255);
396 for (i = maxval + 1; i < 256; i++)
444 PROCNAME(
"pixContrastTRC");
447 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
448 if (pixd && (pixd !=
pixs))
449 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
451 L_WARNING(
"factor must be >= 0.0; using 0.0\n", procName);
457 cmap = pixGetColormap(
pixs);
458 d = pixGetDepth(
pixs);
459 if (!cmap && d != 8 && d != 32)
460 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
472 return (
PIX *)ERROR_PTR(
"nac not made", procName, pixd);
506 PROCNAME(
"pixContrastTRCMasked");
512 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
513 if (pixGetColormap(
pixs))
514 return (
PIX *)ERROR_PTR(
"invalid: pixs has a colormap", procName, pixd);
515 if (pixd && (pixd !=
pixs))
516 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
517 d = pixGetDepth(
pixs);
518 if (d != 8 && d != 32)
519 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
522 L_WARNING(
"factor must be >= 0.0; using 0.0\n", procName);
532 return (
PIX *)ERROR_PTR(
"nac not made", procName, pixd);
560 l_float64 x, ymax, ymin, dely, scale;
563 PROCNAME(
"numaContrastTRC");
566 L_WARNING(
"factor must be >= 0.0; using 0.0; no enhancement\n",
573 scale = ENHANCE_SCALE_FACTOR;
574 ymax = atan((l_float64)(1.0 * factor * scale));
575 ymin = atan((l_float64)(-127. * factor * scale / 128.));
578 for (i = 0; i < 256; i++) {
580 val = (l_int32)((255. / dely) *
581 (-ymin + atan((l_float64)(factor * scale * (x - 127.) / 128.))) +
637 PROCNAME(
"pixEqualizeTRC");
640 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
641 if (pixd && (pixd !=
pixs))
642 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
643 cmap = pixGetColormap(
pixs);
644 d = pixGetDepth(
pixs);
645 if (d != 8 && d != 32 && !cmap)
646 return (
PIX *)ERROR_PTR(
"pixs not 8/32 bpp or cmapped", procName, NULL);
647 if (fract < 0.0 || fract > 1.0)
648 return (
PIX *)ERROR_PTR(
"fract not in [0.0 ... 1.0]", procName, NULL);
650 return (
PIX *)ERROR_PTR(
"sampling factor < 1", procName, NULL);
665 d = pixGetDepth(pixd);
718 l_int32 iin, iout, itarg;
720 NUMA *nah, *nasum, *nad;
722 PROCNAME(
"numaEqualizeTRC");
725 return (
NUMA *)ERROR_PTR(
"pix not defined", procName, NULL);
726 if (pixGetDepth(pix) != 8)
727 return (
NUMA *)ERROR_PTR(
"pix not 8 bpp", procName, NULL);
728 if (fract < 0.0 || fract > 1.0)
729 return (
NUMA *)ERROR_PTR(
"fract not in [0.0 ... 1.0]", procName, NULL);
731 return (
NUMA *)ERROR_PTR(
"sampling factor < 1", procName, NULL);
734 L_WARNING(
"fract = 0.0; no equalization requested\n", procName);
737 return (
NUMA *)ERROR_PTR(
"histogram not made", procName, NULL);
742 for (iin = 0; iin < 256; iin++) {
744 itarg = (l_int32)(255. * val / sum + 0.5);
745 iout = iin + (l_int32)(fract * (itarg - iin));
746 iout = L_MIN(iout, 255);
785 l_int32
w,
h, d, wm, hm, wpl, wplm, i, j, sval8, dval8;
786 l_uint32 sval32, dval32;
787 l_uint32 *data, *datam, *line, *linem, *tab;
789 PROCNAME(
"pixTRCMap");
792 return ERROR_INT(
"pixs not defined", procName, 1);
793 if (pixGetColormap(
pixs))
794 return ERROR_INT(
"pixs is colormapped", procName, 1);
796 return ERROR_INT(
"na not defined", procName, 1);
798 return ERROR_INT(
"na not of size 256", procName, 1);
800 if (d != 8 && d != 32)
801 return ERROR_INT(
"pixs not 8 or 32 bpp", procName, 1);
803 if (pixGetDepth(pixm) != 1)
804 return ERROR_INT(
"pixm not 1 bpp", procName, 1);
808 wpl = pixGetWpl(
pixs);
812 for (i = 0; i <
h; i++) {
813 line = data + i * wpl;
814 for (j = 0; j <
w; j++) {
821 for (i = 0; i <
h; i++) {
822 line = data + i * wpl;
823 for (j = 0; j <
w; j++) {
824 sval32 = *(line + j);
826 tab[(sval32 >> L_RED_SHIFT) & 0xff] << L_RED_SHIFT |
827 tab[(sval32 >> L_GREEN_SHIFT) & 0xff] << L_GREEN_SHIFT |
828 tab[(sval32 >> L_BLUE_SHIFT) & 0xff] << L_BLUE_SHIFT;
829 *(line + j) = dval32;
835 wplm = pixGetWpl(pixm);
838 for (i = 0; i <
h; i++) {
841 line = data + i * wpl;
842 linem = datam + i * wplm;
843 for (j = 0; j <
w; j++) {
854 for (i = 0; i <
h; i++) {
857 line = data + i * wpl;
858 linem = datam + i * wplm;
859 for (j = 0; j <
w; j++) {
864 sval32 = *(line + j);
866 tab[(sval32 >> L_RED_SHIFT) & 0xff] << L_RED_SHIFT |
867 tab[(sval32 >> L_GREEN_SHIFT) & 0xff] << L_GREEN_SHIFT |
868 tab[(sval32 >> L_BLUE_SHIFT) & 0xff] << L_BLUE_SHIFT;
869 *(line + j) = dval32;
908 PIX *pixt, *pixd, *pixr, *pixrs, *pixg, *pixgs, *pixb, *pixbs;
910 PROCNAME(
"pixUnsharpMasking");
912 if (!
pixs || (pixGetDepth(
pixs) == 1))
913 return (
PIX *)ERROR_PTR(
"pixs not defined or 1 bpp", procName, NULL);
914 if (fract <= 0.0 || halfwidth <= 0) {
915 L_WARNING(
"no sharpening requested; clone returned\n", procName);
919 if (halfwidth == 1 || halfwidth == 2)
924 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
927 d = pixGetDepth(pixt);
944 if (pixGetSpp(
pixs) == 4)
980 PROCNAME(
"pixUnsharpMaskingGray");
983 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
985 if (d != 8 || pixGetColormap(
pixs) != NULL)
986 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
987 if (fract <= 0.0 || halfwidth <= 0) {
988 L_WARNING(
"no sharpening requested; clone returned\n", procName);
991 if (halfwidth == 1 || halfwidth == 2)
996 return (
PIX *)ERROR_PTR(
"pixc not made", procName, NULL);
1075 PIX *pixt, *pixd, *pixr, *pixrs, *pixg, *pixgs, *pixb, *pixbs;
1077 PROCNAME(
"pixUnsharpMaskingFast");
1079 if (!
pixs || (pixGetDepth(
pixs) == 1))
1080 return (
PIX *)ERROR_PTR(
"pixs not defined or 1 bpp", procName, NULL);
1081 if (fract <= 0.0 || halfwidth <= 0) {
1082 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1085 if (halfwidth != 1 && halfwidth != 2)
1086 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1087 if (direction != L_HORIZ && direction != L_VERT &&
1088 direction != L_BOTH_DIRECTIONS)
1089 return (
PIX *)ERROR_PTR(
"invalid direction", procName, NULL);
1093 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
1096 d = pixGetDepth(pixt);
1110 if (pixGetSpp(
pixs) == 4)
1147 PROCNAME(
"pixUnsharpMaskingGrayFast");
1150 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1151 if (pixGetDepth(
pixs) != 8 || pixGetColormap(
pixs) != NULL)
1152 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
1153 if (fract <= 0.0 || halfwidth <= 0) {
1154 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1157 if (halfwidth != 1 && halfwidth != 2)
1158 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1159 if (direction != L_HORIZ && direction != L_VERT &&
1160 direction != L_BOTH_DIRECTIONS)
1161 return (
PIX *)ERROR_PTR(
"invalid direction", procName, NULL);
1163 if (direction != L_BOTH_DIRECTIONS)
1194 l_int32
w,
h, d, wpls, wpld, i, j, ival;
1195 l_uint32 *datas, *datad;
1196 l_uint32 *lines, *lines0, *lines1, *lines2, *lines3, *lines4, *lined;
1197 l_float32 val, a[5];
1200 PROCNAME(
"pixUnsharpMaskingGray1D");
1203 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1205 if (d != 8 || pixGetColormap(
pixs) != NULL)
1206 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
1207 if (fract <= 0.0 || halfwidth <= 0) {
1208 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1211 if (halfwidth != 1 && halfwidth != 2)
1212 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1217 halfwidth, halfwidth);
1220 wpls = pixGetWpl(
pixs);
1221 wpld = pixGetWpl(pixd);
1223 if (halfwidth == 1) {
1224 a[0] = -fract / 3.0;
1225 a[1] = 1.0 + fract * 2.0 / 3.0;
1228 a[0] = -fract / 5.0;
1230 a[2] = 1.0 + fract * 4.0 / 5.0;
1235 if (direction == L_HORIZ) {
1236 for (i = 0; i <
h; i++) {
1237 lines = datas + i * wpls;
1238 lined = datad + i * wpld;
1239 if (halfwidth == 1) {
1240 for (j = 1; j <
w - 1; j++) {
1244 ival = (l_int32)val;
1245 ival = L_MAX(0, ival);
1246 ival = L_MIN(255, ival);
1250 for (j = 2; j <
w - 2; j++) {
1256 ival = (l_int32)val;
1257 ival = L_MAX(0, ival);
1258 ival = L_MIN(255, ival);
1264 if (halfwidth == 1) {
1265 for (i = 1; i <
h - 1; i++) {
1266 lines0 = datas + (i - 1) * wpls;
1267 lines1 = datas + i * wpls;
1268 lines2 = datas + (i + 1) * wpls;
1269 lined = datad + i * wpld;
1270 for (j = 0; j <
w; j++) {
1274 ival = (l_int32)val;
1275 ival = L_MAX(0, ival);
1276 ival = L_MIN(255, ival);
1281 for (i = 2; i <
h - 2; i++) {
1282 lines0 = datas + (i - 2) * wpls;
1283 lines1 = datas + (i - 1) * wpls;
1284 lines2 = datas + i * wpls;
1285 lines3 = datas + (i + 1) * wpls;
1286 lines4 = datas + (i + 2) * wpls;
1287 lined = datad + i * wpld;
1288 for (j = 0; j <
w; j++) {
1294 ival = (l_int32)val;
1295 ival = L_MAX(0, ival);
1296 ival = L_MIN(255, ival);
1327 l_int32
w,
h, d, wpls, wpld, wplf, i, j, ival, sval;
1328 l_uint32 *datas, *datad, *lines, *lined;
1329 l_float32 val, norm;
1330 l_float32 *dataf, *linef, *linef0, *linef1, *linef2, *linef3, *linef4;
1334 PROCNAME(
"pixUnsharpMaskingGray2D");
1337 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1339 if (d != 8 || pixGetColormap(
pixs) != NULL)
1340 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
1341 if (fract <= 0.0 || halfwidth <= 0) {
1342 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1345 if (halfwidth != 1 && halfwidth != 2)
1346 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1349 halfwidth, halfwidth)) == NULL)
1350 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1352 wpld = pixGetWpl(pixd);
1354 wpls = pixGetWpl(
pixs);
1360 return (
PIX *)ERROR_PTR(
"fpix not made", procName, NULL);
1364 if (halfwidth == 1) {
1365 for (i = 0; i <
h; i++) {
1366 lines = datas + i * wpls;
1367 linef = dataf + i * wplf;
1368 for (j = 1; j <
w - 1; j++) {
1376 for (i = 0; i <
h; i++) {
1377 lines = datas + i * wpls;
1378 linef = dataf + i * wplf;
1379 for (j = 2; j <
w - 2; j++) {
1397 if (halfwidth == 1) {
1398 for (i = 1; i <
h - 1; i++) {
1399 linef0 = dataf + (i - 1) * wplf;
1400 linef1 = dataf + i * wplf;
1401 linef2 = dataf + (i + 1) * wplf;
1402 lined = datad + i * wpld;
1403 lines = datas + i * wpls;
1405 for (j = 1; j <
w - 1; j++) {
1406 val = norm * (linef0[j] + linef1[j] +
1409 ival = (l_int32)(sval + fract * (sval - val) + 0.5);
1410 ival = L_MAX(0, ival);
1411 ival = L_MIN(255, ival);
1416 for (i = 2; i <
h - 2; i++) {
1417 linef0 = dataf + (i - 2) * wplf;
1418 linef1 = dataf + (i - 1) * wplf;
1419 linef2 = dataf + i * wplf;
1420 linef3 = dataf + (i + 1) * wplf;
1421 linef4 = dataf + (i + 2) * wplf;
1422 lined = datad + i * wpld;
1423 lines = datas + i * wpls;
1425 for (j = 2; j <
w - 2; j++) {
1426 val = norm * (linef0[j] + linef1[j] + linef2[j] + linef3[j] +
1429 ival = (l_int32)(sval + fract * (sval - val) + 0.5);
1430 ival = L_MAX(0, ival);
1431 ival = L_MIN(255, ival);
1472 l_int32
w,
h, d, i, j, wpl, delhue;
1473 l_int32 rval, gval, bval, hval, sval, vval;
1474 l_uint32 *data, *line;
1476 PROCNAME(
"pixModifyHue");
1479 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1480 if (pixGetColormap(
pixs) != NULL)
1481 return (
PIX *)ERROR_PTR(
"pixs colormapped", procName, NULL);
1482 if (pixd && (pixd !=
pixs))
1483 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
1486 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1487 if (L_ABS(fract) > 1.0)
1488 return (
PIX *)ERROR_PTR(
"fract not in [-1.0 ... 1.0]", procName, NULL);
1492 delhue = (l_int32)(240 * fract);
1493 if (delhue == 0 || delhue == 240 || delhue == -240) {
1494 L_WARNING(
"no change requested in hue\n", procName);
1501 wpl = pixGetWpl(pixd);
1502 for (i = 0; i <
h; i++) {
1503 line = data + i * wpl;
1504 for (j = 0; j <
w; j++) {
1507 hval = (hval + delhue) % 240;
1512 if (pixGetSpp(
pixs) == 4)
1545 l_int32
w,
h, d, i, j, wpl;
1546 l_int32 rval, gval, bval, hval, sval, vval;
1547 l_uint32 *data, *line;
1549 PROCNAME(
"pixModifySaturation");
1552 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1555 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1556 if (L_ABS(fract) > 1.0)
1557 return (
PIX *)ERROR_PTR(
"fract not in [-1.0 ... 1.0]", procName, NULL);
1561 L_WARNING(
"no change requested in saturation\n", procName);
1566 wpl = pixGetWpl(pixd);
1567 for (i = 0; i <
h; i++) {
1568 line = data + i * wpl;
1569 for (j = 0; j <
w; j++) {
1573 sval = (l_int32)(sval * (1.0 + fract));
1575 sval = (l_int32)(sval + fract * (255 - sval));
1580 if (pixGetSpp(
pixs) == 4)
1600 l_int32
w,
h, d, i, j, wpl, sum, count;
1601 l_int32 rval, gval, bval, hval, sval, vval;
1602 l_uint32 *data, *line;
1604 PROCNAME(
"pixMeasureSaturation");
1607 return ERROR_INT(
"pixs not defined", procName, 1);
1610 return ERROR_INT(
"pixs not defined", procName, 1);
1613 return ERROR_INT(
"pixs not 32 bpp", procName, 1);
1615 return ERROR_INT(
"subsampling factor < 1", procName, 1);
1618 wpl = pixGetWpl(
pixs);
1619 for (i = 0, sum = 0, count = 0; i <
h; i += factor) {
1620 line = data + i * wpl;
1621 for (j = 0; j <
w; j += factor) {
1630 *psat = (l_float32)sum / (l_float32)count;
1661 l_int32
w,
h, d, i, j, wpl;
1662 l_int32 rval, gval, bval, hval, sval, vval;
1663 l_uint32 *data, *line;
1665 PROCNAME(
"pixModifyBrightness");
1668 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1671 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1672 if (L_ABS(fract) > 1.0)
1673 return (
PIX *)ERROR_PTR(
"fract not in [-1.0 ... 1.0]", procName, NULL);
1677 L_WARNING(
"no change requested in brightness\n", procName);
1682 wpl = pixGetWpl(pixd);
1683 for (i = 0; i <
h; i++) {
1684 line = data + i * wpl;
1685 for (j = 0; j <
w; j++) {
1689 vval = (l_int32)(vval + fract * (255.0 - vval));
1691 vval = (l_int32)(vval * (1.0 + fract));
1696 if (pixGetSpp(
pixs) == 4)
1747 PIX *pix1, *pix2, *pix3;
1750 PROCNAME(
"pixMosaicColorShiftRGB");
1752 if (!
pixs || pixGetDepth(
pixs) != 32)
1753 return (
PIX *)ERROR_PTR(
"pixs undefined or not rgb", procName, NULL);
1754 if (roff < -1.0 || roff > 1.0)
1755 return (
PIX *)ERROR_PTR(
"roff not in [-1.0, 1.0]", procName, NULL);
1756 if (goff < -1.0 || goff > 1.0)
1757 return (
PIX *)ERROR_PTR(
"goff not in [-1.0, 1.0]", procName, NULL);
1758 if (boff < -1.0 || boff > 1.0)
1759 return (
PIX *)ERROR_PTR(
"boff not in [-1.0, 1.0]", procName, NULL);
1760 if (delta < 0.0 || delta > 0.1)
1761 return (
PIX *)ERROR_PTR(
"delta not in [0.0, 0.1]", procName, NULL);
1762 if (delta == 0.0) delta = 0.04;
1763 if (nincr < 0 || nincr > 6)
1764 return (
PIX *)ERROR_PTR(
"nincr not in [0, 6]", procName, NULL);
1765 if (nincr == 0) nincr = 2;
1770 for (i = 0, del = - nincr * delta; i < 2 * nincr + 1; i++, del += delta) {
1772 snprintf(buf,
sizeof(buf),
"%4.2f, %4.2f, %4.2f",
1773 roff + del, goff, boff);
1779 for (i = 0, del = - nincr * delta; i < 2 * nincr + 1; i++, del += delta) {
1781 snprintf(buf,
sizeof(buf),
"%4.2f, %4.2f, %4.2f",
1782 roff, goff + del, boff);
1788 for (i = 0, del = - nincr * delta; i < 2 * nincr + 1; i++, del += delta) {
1790 snprintf(buf,
sizeof(buf),
"%4.2f, %4.2f, %4.2f",
1791 roff, goff, boff + del);
1837 l_int32
w,
h, i, j, wpls, wpld, rval, gval, bval;
1838 l_int32 *rlut, *glut, *blut;
1839 l_uint32 *datas, *datad, *lines, *lined;
1843 PROCNAME(
"pixColorShiftRGB");
1846 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1847 if (pixGetDepth(
pixs) != 32)
1848 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1849 if (rfract < -1.0 || rfract > 1.0)
1850 return (
PIX *)ERROR_PTR(
"rfract not in [-1.0, 1.0]", procName, NULL);
1851 if (gfract < -1.0 || gfract > 1.0)
1852 return (
PIX *)ERROR_PTR(
"gfract not in [-1.0, 1.0]", procName, NULL);
1853 if (bfract < -1.0 || bfract > 1.0)
1854 return (
PIX *)ERROR_PTR(
"bfract not in [-1.0, 1.0]", procName, NULL);
1855 if (rfract == 0.0 && gfract == 0.0 && bfract == 0.0)
1858 rlut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1859 glut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1860 blut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1861 for (i = 0; i < 256; i++) {
1864 rlut[i] = (l_int32)(fi + (255.0 - fi) * rfract);
1866 rlut[i] = (l_int32)(fi * (1.0 + rfract));
1869 glut[i] = (l_int32)(fi + (255.0 - fi) * gfract);
1871 glut[i] = (l_int32)(fi * (1.0 + gfract));
1874 blut[i] = (l_int32)(fi + (255.0 - fi) * bfract);
1876 blut[i] = (l_int32)(fi * (1.0 + bfract));
1882 wpls = pixGetWpl(
pixs);
1885 wpld = pixGetWpl(pixd);
1886 for (i = 0; i <
h; i++) {
1887 lines = datas + i * wpls;
1888 lined = datad + i * wpld;
1889 for (j = 0; j <
w; j++) {
1934 l_int32
w,
h, i, j, wpls, wpld;
1935 l_int32 rval, gval, bval, minrg, min, maxrg, max, sat;
1936 l_uint32 *datas, *datad, *lines, *lined;
1939 PROCNAME(
"pixDarkenGray");
1941 if (!
pixs || pixGetDepth(
pixs) != 32)
1942 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
1943 if (thresh < 0 || thresh > 255)
1944 return (
PIX *)ERROR_PTR(
"invalid thresh", procName, NULL);
1946 return (
PIX *)ERROR_PTR(
"invalid satlimit", procName, NULL);
1947 if (pixd && (
pixs != pixd))
1948 return (
PIX *)ERROR_PTR(
"not new or in-place", procName, NULL);
1952 wpls = pixGetWpl(
pixs);
1954 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1956 wpld = pixGetWpl(pixd);
1958 for (i = 0; i <
h; i++) {
1959 lines = datas + i * wpls;
1960 lined = datad + i * wpld;
1961 for (j = 0; j <
w; j++) {
1963 minrg = L_MIN(rval, gval);
1964 min = L_MIN(minrg, bval);
1965 maxrg = L_MAX(rval, gval);
1966 max = L_MAX(maxrg, bval);
1968 if (max >= thresh || sat >= satlimit)
1970 ratio = (l_float32)sat / (l_float32)satlimit;
1972 (l_int32)(ratio * bval), &lined[j]);
2006 l_int32 i, j,
w,
h, d, wpls, wpld;
2007 l_int32 ncolors, rval, gval, bval, nrval, ngval, nbval;
2009 l_uint32 *datas, *datad, *lines, *lined;
2013 PROCNAME(
"pixMultConstantColor");
2016 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2018 cmap = pixGetColormap(
pixs);
2019 if (!cmap && d != 32)
2020 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, NULL);
2021 rfact = L_MAX(0.0, rfact);
2022 gfact = L_MAX(0.0, gfact);
2023 bfact = L_MAX(0.0, bfact);
2027 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2028 cmap = pixGetColormap(pixd);
2030 for (i = 0; i < ncolors; i++) {
2032 nrval = (l_int32)(rfact * rval);
2033 ngval = (l_int32)(gfact * gval);
2034 nbval = (l_int32)(bfact * bval);
2035 nrval = L_MIN(255, nrval);
2036 ngval = L_MIN(255, ngval);
2037 nbval = L_MIN(255, nbval);
2044 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2047 wpls = pixGetWpl(
pixs);
2048 wpld = pixGetWpl(pixd);
2049 for (i = 0; i <
h; i++) {
2050 lines = datas + i * wpls;
2051 lined = datad + i * wpld;
2052 for (j = 0; j <
w; j++) {
2054 nrval = (l_int32)(rfact * rval);
2055 ngval = (l_int32)(gfact * gval);
2056 nbval = (l_int32)(bfact * bval);
2057 nrval = L_MIN(255, nrval);
2058 ngval = L_MIN(255, ngval);
2059 nbval = L_MIN(255, nbval);
2061 *(lined + j) = nval;
2106 l_int32 i, j, index, kw, kh,
w,
h, d, wpls, wpld;
2107 l_int32 ncolors, rval, gval, bval, nrval, ngval, nbval;
2109 l_uint32 *datas, *datad, *lines, *lined;
2114 PROCNAME(
"pixMultMatrixColor");
2117 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2119 return (
PIX *)ERROR_PTR(
"kel not defined", procName, NULL);
2121 if (kw != 3 || kh != 3)
2122 return (
PIX *)ERROR_PTR(
"matrix not 3x3", procName, NULL);
2124 cmap = pixGetColormap(
pixs);
2125 if (!cmap && d != 32)
2126 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, NULL);
2128 for (i = 0, index = 0; i < 3; i++)
2129 for (j = 0; j < 3; j++, index++)
2134 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2135 cmap = pixGetColormap(pixd);
2137 for (i = 0; i < ncolors; i++) {
2139 nrval = (l_int32)(v[0] * rval + v[1] * gval + v[2] * bval);
2140 ngval = (l_int32)(v[3] * rval + v[4] * gval + v[5] * bval);
2141 nbval = (l_int32)(v[6] * rval + v[7] * gval + v[8] * bval);
2142 nrval = L_MAX(0, L_MIN(255, nrval));
2143 ngval = L_MAX(0, L_MIN(255, ngval));
2144 nbval = L_MAX(0, L_MIN(255, nbval));
2151 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2154 wpls = pixGetWpl(
pixs);
2155 wpld = pixGetWpl(pixd);
2156 for (i = 0; i <
h; i++) {
2157 lines = datas + i * wpls;
2158 lined = datad + i * wpld;
2159 for (j = 0; j <
w; j++) {
2161 nrval = (l_int32)(v[0] * rval + v[1] * gval + v[2] * bval);
2162 ngval = (l_int32)(v[3] * rval + v[4] * gval + v[5] * bval);
2163 nbval = (l_int32)(v[6] * rval + v[7] * gval + v[8] * bval);
2164 nrval = L_MAX(0, L_MIN(255, nrval));
2165 ngval = L_MAX(0, L_MIN(255, ngval));
2166 nbval = L_MAX(0, L_MIN(255, nbval));
2168 *(lined + j) = nval;
2219 PIX *pixg, *pixacc, *pixc1, *pixc2;
2221 PROCNAME(
"pixHalfEdgeByBandpass");
2224 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2225 if (sm1h == sm2h && sm1v == sm2v)
2226 return (
PIX *)ERROR_PTR(
"sm2 = sm1", procName, NULL);
2227 d = pixGetDepth(
pixs);
2228 if (d != 8 && d != 32)
2229 return (
PIX *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
2238 return (
PIX *)ERROR_PTR(
"pixacc not made", procName, NULL);
2243 return (
PIX *)ERROR_PTR(
"pixc1 not made", procName, NULL);
2250 return (
PIX *)ERROR_PTR(
"pixc2 not made", procName, NULL);
l_ok numaGetSum(NUMA *na, l_float32 *psum)
numaGetSum()
PIX * pixConvertRGBToLuminance(PIX *pixs)
pixConvertRGBToLuminance()
NUMA * pixGetGrayHistogram(PIX *pixs, l_int32 factor)
pixGetGrayHistogram()
void bmfDestroy(L_BMF **pbmf)
bmfDestroy()
l_ok numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
PIX * pixContrastTRCMasked(PIX *pixd, PIX *pixs, PIX *pixm, l_float32 factor)
pixContrastTRCMasked()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
l_ok pixSetRGBComponent(PIX *pixd, PIX *pixs, l_int32 comp)
pixSetRGBComponent()
PIX * pixUnsharpMaskingGray2D(PIX *pixs, l_int32 halfwidth, l_float32 fract)
pixUnsharpMaskingGray2D()
l_ok kernelGetParameters(L_KERNEL *kel, l_int32 *psy, l_int32 *psx, l_int32 *pcy, l_int32 *pcx)
kernelGetParameters()
PIX * pixContrastTRC(PIX *pixd, PIX *pixs, l_float32 factor)
pixContrastTRC()
PIX * pixBlockconvAccum(PIX *pixs)
pixBlockconvAccum()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
PIX * pixUnsharpMaskingGrayFast(PIX *pixs, l_int32 halfwidth, l_float32 fract, l_int32 direction)
pixUnsharpMaskingGrayFast()
NUMA * numaGammaTRC(l_float32 gamma, l_int32 minval, l_int32 maxval)
numaGammaTRC()
PIX * pixModifyBrightness(PIX *pixd, PIX *pixs, l_float32 fract)
pixModifyBrightness()
PIX * pixGammaTRCWithAlpha(PIX *pixd, PIX *pixs, l_float32 gamma, l_int32 minval, l_int32 maxval)
pixGammaTRCWithAlpha()
l_int32 pixTRCMap(PIX *pixs, PIX *pixm, NUMA *na)
pixTRCMap()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
NUMA * numaGetPartialSums(NUMA *na)
numaGetPartialSums()
#define GET_DATA_BIT(pdata, n)
l_ok pixaccMultConst(PIXACC *pixacc, l_float32 factor)
pixaccMultConst()
PIX * pixCreateTemplateNoInit(PIX *pixs)
pixCreateTemplateNoInit()
PIX * pixGetRGBComponent(PIX *pixs, l_int32 comp)
pixGetRGBComponent()
PIX * pixMultConstantColor(PIX *pixs, l_float32 rfact, l_float32 gfact, l_float32 bfact)
pixMultConstantColor()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
void pixaccDestroy(PIXACC **ppixacc)
pixaccDestroy()
PIX * pixSubtractGray(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixSubtractGray()
PIX * pixModifyHue(PIX *pixd, PIX *pixs, l_float32 fract)
pixModifyHue()
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
PIX * pixUnsharpMaskingGray(PIX *pixs, l_int32 halfwidth, l_float32 fract)
pixUnsharpMaskingGray()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
PIX * pixEqualizeTRC(PIX *pixd, PIX *pixs, l_float32 fract, l_int32 factor)
pixEqualizeTRC()
l_ok convertHSVToRGB(l_int32 hval, l_int32 sval, l_int32 vval, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
convertHSVToRGB()
l_ok pixcmapContrastTRC(PIXCMAP *cmap, l_float32 factor)
pixcmapContrastTRC()
l_ok pixcmapGetColor(PIXCMAP *cmap, l_int32 index, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
pixcmapGetColor()
l_int32 pixMeasureSaturation(PIX *pixs, l_int32 factor, l_float32 *psat)
pixMeasureSaturation()
#define SET_DATA_BYTE(pdata, n, val)
PIX * pixColorShiftRGB(PIX *pixs, l_float32 rfract, l_float32 gfract, l_float32 bfract)
pixColorShiftRGB()
#define GET_DATA_BYTE(pdata, n)
l_int32 fpixGetWpl(FPIX *fpix)
fpixGetWpl()
PIX * pixGammaTRCMasked(PIX *pixd, PIX *pixs, PIX *pixm, l_float32 gamma, l_int32 minval, l_int32 maxval)
pixGammaTRCMasked()
PIX * pixCreateRGBImage(PIX *pixr, PIX *pixg, PIX *pixb)
pixCreateRGBImage()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixaDisplayTiledAndScaled(PIXA *pixa, l_int32 outdepth, l_int32 tilewidth, l_int32 ncols, l_int32 background, l_int32 spacing, l_int32 border)
pixaDisplayTiledAndScaled()
PIX * pixModifySaturation(PIX *pixd, PIX *pixs, l_float32 fract)
pixModifySaturation()
PIX * pixScaleToSize(PIX *pixs, l_int32 wd, l_int32 hd)
pixScaleToSize()
PIX * pixBlockconvGray(PIX *pixs, PIX *pixacc, l_int32 wc, l_int32 hc)
pixBlockconvGray()
void pixDestroy(PIX **ppix)
pixDestroy()
NUMA * numaMakeSequence(l_float32 startval, l_float32 increment, l_int32 size)
numaMakeSequence()
NUMA * numaContrastTRC(l_float32 factor)
numaContrastTRC()
l_ok convertRGBToHSV(l_int32 rval, l_int32 gval, l_int32 bval, l_int32 *phval, l_int32 *psval, l_int32 *pvval)
convertRGBToHSV()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
l_float32 * fpixGetData(FPIX *fpix)
fpixGetData()
PIX * pixaccFinal(PIXACC *pixacc, l_int32 outdepth)
pixaccFinal()
PIX * pixMosaicColorShiftRGB(PIX *pixs, l_float32 roff, l_float32 goff, l_float32 boff, l_float32 delta, l_int32 nincr)
pixMosaicColorShiftRGB()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixHalfEdgeByBandpass(PIX *pixs, l_int32 sm1h, l_int32 sm1v, l_int32 sm2h, l_int32 sm2v)
pixHalfEdgeByBandpass()
FPIX * fpixCreate(l_int32 width, l_int32 height)
fpixCreate()
l_ok kernelGetElement(L_KERNEL *kel, l_int32 row, l_int32 col, l_float32 *pval)
kernelGetElement()
PIX * pixUnsharpMasking(PIX *pixs, l_int32 halfwidth, l_float32 fract)
pixUnsharpMasking()
PIXACC * pixaccCreate(l_int32 w, l_int32 h, l_int32 negflag)
pixaccCreate()
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
l_ok pixaccSubtract(PIXACC *pixacc, PIX *pix)
pixaccSubtract()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixGammaTRC(PIX *pixd, PIX *pixs, l_float32 gamma, l_int32 minval, l_int32 maxval)
pixGammaTRC()
PIX * pixUnsharpMaskingFast(PIX *pixs, l_int32 halfwidth, l_float32 fract, l_int32 direction)
pixUnsharpMaskingFast()
NUMA * numaEqualizeTRC(PIX *pix, l_float32 fract, l_int32 factor)
numaEqualizeTRC()
l_ok pixaccAdd(PIXACC *pixacc, PIX *pix)
pixaccAdd()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
PIX * pixUnsharpMaskingGray1D(PIX *pixs, l_int32 halfwidth, l_float32 fract, l_int32 direction)
pixUnsharpMaskingGray1D()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
l_ok pixScaleAndTransferAlpha(PIX *pixd, PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleAndTransferAlpha()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
PIX * pixCopyBorder(PIX *pixd, PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixCopyBorder()
PIX * pixAddSingleTextblock(PIX *pixs, L_BMF *bmf, const char *textstr, l_uint32 val, l_int32 location, l_int32 *poverflow)
pixAddSingleTextblock()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
l_ok pixcmapGammaTRC(PIXCMAP *cmap, l_float32 gamma, l_int32 minval, l_int32 maxval)
pixcmapGammaTRC()
PIX * pixDarkenGray(PIX *pixd, PIX *pixs, l_int32 thresh, l_int32 satlimit)
pixDarkenGray()
PIX * pixConvertTo8Or32(PIX *pixs, l_int32 copyflag, l_int32 warnflag)
pixConvertTo8Or32()
PIX * pixMultMatrixColor(PIX *pixs, L_KERNEL *kel)
pixMultMatrixColor()
L_BMF * bmfCreate(const char *dir, l_int32 fontsize)
bmfCreate()