116 #include "allheaders.h" 120 static const l_float32 ENHANCE_SCALE_FACTOR = 5.;
123 static const l_int32 DEFAULT_HISTO_SAMPLES = 100000;
181 PROCNAME(
"pixGammaTRC");
184 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
185 if (pixd && (pixd !=
pixs))
186 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
188 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
191 if (minval >= maxval)
192 return (
PIX *)ERROR_PTR(
"minval not < maxval", procName, pixd);
193 cmap = pixGetColormap(
pixs);
194 d = pixGetDepth(
pixs);
195 if (!cmap && d != 8 && d != 32)
196 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
198 if (gamma == 1.0 && minval == 0 && maxval == 255)
210 if ((nag =
numaGammaTRC(gamma, minval, maxval)) == NULL)
211 return (
PIX *)ERROR_PTR(
"nag not made", procName, pixd);
249 PROCNAME(
"pixGammaTRCMasked");
255 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
256 if (pixGetColormap(
pixs))
257 return (
PIX *)ERROR_PTR(
"invalid: pixs has a colormap", procName, pixd);
258 if (pixd && (pixd !=
pixs))
259 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
260 d = pixGetDepth(
pixs);
261 if (d != 8 && d != 32)
262 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
263 if (minval >= maxval)
264 return (
PIX *)ERROR_PTR(
"minval not < maxval", procName, pixd);
266 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
270 if (gamma == 1.0 && minval == 0 && maxval == 255)
276 if ((nag =
numaGammaTRC(gamma, minval, maxval)) == NULL)
277 return (
PIX *)ERROR_PTR(
"nag not made", procName, pixd);
312 PROCNAME(
"pixGammaTRCWithAlpha");
314 if (!
pixs || pixGetDepth(
pixs) != 32)
315 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, pixd);
316 if (pixd && (pixd !=
pixs))
317 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
319 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
322 if (minval >= maxval)
323 return (
PIX *)ERROR_PTR(
"minval not < maxval", procName, pixd);
325 if (gamma == 1.0 && minval == 0 && maxval == 255)
331 if ((nag =
numaGammaTRC(gamma, minval, maxval)) == NULL)
332 return (
PIX *)ERROR_PTR(
"nag not made", procName, pixd);
368 l_float32 x, invgamma;
371 PROCNAME(
"numaGammaTRC");
373 if (minval >= maxval)
374 return (
NUMA *)ERROR_PTR(
"minval not < maxval", procName, NULL);
376 L_WARNING(
"gamma must be > 0.0; setting to 1.0\n", procName);
380 invgamma = 1. / gamma;
382 for (i = 0; i < minval; i++)
384 for (i = minval; i <= maxval; i++) {
386 if (i > 255)
continue;
387 x = (l_float32)(i - minval) / (l_float32)(maxval - minval);
388 val = (l_int32)(255. * powf(x, invgamma) + 0.5);
390 val = L_MIN(val, 255);
393 for (i = maxval + 1; i < 256; i++)
441 PROCNAME(
"pixContrastTRC");
444 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
445 if (pixd && (pixd !=
pixs))
446 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
448 L_WARNING(
"factor must be >= 0.0; using 0.0\n", procName);
454 cmap = pixGetColormap(
pixs);
455 d = pixGetDepth(
pixs);
456 if (!cmap && d != 8 && d != 32)
457 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
469 return (
PIX *)ERROR_PTR(
"nac not made", procName, pixd);
503 PROCNAME(
"pixContrastTRCMasked");
509 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
510 if (pixGetColormap(
pixs))
511 return (
PIX *)ERROR_PTR(
"invalid: pixs has a colormap", procName, pixd);
512 if (pixd && (pixd !=
pixs))
513 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
514 d = pixGetDepth(
pixs);
515 if (d != 8 && d != 32)
516 return (
PIX *)ERROR_PTR(
"depth not 8 or 32 bpp", procName, pixd);
519 L_WARNING(
"factor must be >= 0.0; using 0.0\n", procName);
529 return (
PIX *)ERROR_PTR(
"nac not made", procName, pixd);
557 l_float64 x, ymax, ymin, dely, scale;
560 PROCNAME(
"numaContrastTRC");
563 L_WARNING(
"factor must be >= 0.0; using 0.0; no enhancement\n",
570 scale = ENHANCE_SCALE_FACTOR;
571 ymax = atan((l_float64)(1.0 * factor * scale));
572 ymin = atan((l_float64)(-127. * factor * scale / 128.));
575 for (i = 0; i < 256; i++) {
577 val = (l_int32)((255. / dely) *
578 (-ymin + atan((l_float64)(factor * scale * (x - 127.) / 128.))) +
634 PROCNAME(
"pixEqualizeTRC");
637 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
638 if (pixd && (pixd !=
pixs))
639 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
640 cmap = pixGetColormap(
pixs);
641 d = pixGetDepth(
pixs);
642 if (d != 8 && d != 32 && !cmap)
643 return (
PIX *)ERROR_PTR(
"pixs not 8/32 bpp or cmapped", procName, NULL);
644 if (fract < 0.0 || fract > 1.0)
645 return (
PIX *)ERROR_PTR(
"fract not in [0.0 ... 1.0]", procName, NULL);
647 return (
PIX *)ERROR_PTR(
"sampling factor < 1", procName, NULL);
662 d = pixGetDepth(pixd);
715 l_int32 iin, iout, itarg;
717 NUMA *nah, *nasum, *nad;
719 PROCNAME(
"numaEqualizeTRC");
722 return (
NUMA *)ERROR_PTR(
"pix not defined", procName, NULL);
723 if (pixGetDepth(pix) != 8)
724 return (
NUMA *)ERROR_PTR(
"pix not 8 bpp", procName, NULL);
725 if (fract < 0.0 || fract > 1.0)
726 return (
NUMA *)ERROR_PTR(
"fract not in [0.0 ... 1.0]", procName, NULL);
728 return (
NUMA *)ERROR_PTR(
"sampling factor < 1", procName, NULL);
731 L_WARNING(
"fract = 0.0; no equalization requested\n", procName);
734 return (
NUMA *)ERROR_PTR(
"histogram not made", procName, NULL);
739 for (iin = 0; iin < 256; iin++) {
741 itarg = (l_int32)(255. * val / sum + 0.5);
742 iout = iin + (l_int32)(fract * (itarg - iin));
743 iout = L_MIN(iout, 255);
782 l_int32
w,
h, d, wm, hm, wpl, wplm, i, j, sval8, dval8;
784 l_uint32 sval32, dval32;
785 l_uint32 *data, *datam, *line, *linem;
787 PROCNAME(
"pixTRCMap");
790 return ERROR_INT(
"pixs not defined", procName, 1);
791 if (pixGetColormap(
pixs))
792 return ERROR_INT(
"pixs is colormapped", procName, 1);
794 return ERROR_INT(
"na not defined", procName, 1);
796 return ERROR_INT(
"na not of size 256", procName, 1);
798 if (d != 8 && d != 32)
799 return ERROR_INT(
"pixs not 8 or 32 bpp", procName, 1);
801 if (pixGetDepth(pixm) != 1)
802 return ERROR_INT(
"pixm not 1 bpp", procName, 1);
806 wpl = pixGetWpl(
pixs);
810 for (i = 0; i <
h; i++) {
811 line = data + i * wpl;
812 for (j = 0; j <
w; j++) {
819 for (i = 0; i <
h; i++) {
820 line = data + i * wpl;
821 for (j = 0; j <
w; j++) {
822 sval32 = *(line + j);
824 tab[(sval32 >> L_RED_SHIFT) & 0xff] << L_RED_SHIFT |
825 tab[(sval32 >> L_GREEN_SHIFT) & 0xff] << L_GREEN_SHIFT |
826 tab[(sval32 >> L_BLUE_SHIFT) & 0xff] << L_BLUE_SHIFT;
827 *(line + j) = dval32;
833 wplm = pixGetWpl(pixm);
836 for (i = 0; i <
h; i++) {
839 line = data + i * wpl;
840 linem = datam + i * wplm;
841 for (j = 0; j <
w; j++) {
852 for (i = 0; i <
h; i++) {
855 line = data + i * wpl;
856 linem = datam + i * wplm;
857 for (j = 0; j <
w; j++) {
862 sval32 = *(line + j);
864 tab[(sval32 >> L_RED_SHIFT) & 0xff] << L_RED_SHIFT |
865 tab[(sval32 >> L_GREEN_SHIFT) & 0xff] << L_GREEN_SHIFT |
866 tab[(sval32 >> L_BLUE_SHIFT) & 0xff] << L_BLUE_SHIFT;
867 *(line + j) = dval32;
906 PIX *pixt, *pixd, *pixr, *pixrs, *pixg, *pixgs, *pixb, *pixbs;
908 PROCNAME(
"pixUnsharpMasking");
910 if (!
pixs || (pixGetDepth(
pixs) == 1))
911 return (
PIX *)ERROR_PTR(
"pixs not defined or 1 bpp", procName, NULL);
912 if (fract <= 0.0 || halfwidth <= 0) {
913 L_WARNING(
"no sharpening requested; clone returned\n", procName);
917 if (halfwidth == 1 || halfwidth == 2)
922 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
925 d = pixGetDepth(pixt);
942 if (pixGetSpp(
pixs) == 4)
978 PROCNAME(
"pixUnsharpMaskingGray");
981 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
983 if (d != 8 || pixGetColormap(
pixs) != NULL)
984 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
985 if (fract <= 0.0 || halfwidth <= 0) {
986 L_WARNING(
"no sharpening requested; clone returned\n", procName);
989 if (halfwidth == 1 || halfwidth == 2)
994 return (
PIX *)ERROR_PTR(
"pixc not made", procName, NULL);
1073 PIX *pixt, *pixd, *pixr, *pixrs, *pixg, *pixgs, *pixb, *pixbs;
1075 PROCNAME(
"pixUnsharpMaskingFast");
1077 if (!
pixs || (pixGetDepth(
pixs) == 1))
1078 return (
PIX *)ERROR_PTR(
"pixs not defined or 1 bpp", procName, NULL);
1079 if (fract <= 0.0 || halfwidth <= 0) {
1080 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1083 if (halfwidth != 1 && halfwidth != 2)
1084 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1085 if (direction != L_HORIZ && direction != L_VERT &&
1086 direction != L_BOTH_DIRECTIONS)
1087 return (
PIX *)ERROR_PTR(
"invalid direction", procName, NULL);
1091 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
1094 d = pixGetDepth(pixt);
1108 if (pixGetSpp(
pixs) == 4)
1145 PROCNAME(
"pixUnsharpMaskingGrayFast");
1148 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1149 if (pixGetDepth(
pixs) != 8 || pixGetColormap(
pixs) != NULL)
1150 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
1151 if (fract <= 0.0 || halfwidth <= 0) {
1152 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1155 if (halfwidth != 1 && halfwidth != 2)
1156 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1157 if (direction != L_HORIZ && direction != L_VERT &&
1158 direction != L_BOTH_DIRECTIONS)
1159 return (
PIX *)ERROR_PTR(
"invalid direction", procName, NULL);
1161 if (direction != L_BOTH_DIRECTIONS)
1192 l_int32
w,
h, d, wpls, wpld, i, j, ival;
1193 l_uint32 *datas, *datad;
1194 l_uint32 *lines, *lines0, *lines1, *lines2, *lines3, *lines4, *lined;
1195 l_float32 val, a[5];
1198 PROCNAME(
"pixUnsharpMaskingGray1D");
1201 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1203 if (d != 8 || pixGetColormap(
pixs) != NULL)
1204 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
1205 if (fract <= 0.0 || halfwidth <= 0) {
1206 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1209 if (halfwidth != 1 && halfwidth != 2)
1210 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1215 halfwidth, halfwidth);
1218 wpls = pixGetWpl(
pixs);
1219 wpld = pixGetWpl(pixd);
1221 if (halfwidth == 1) {
1222 a[0] = -fract / 3.0;
1223 a[1] = 1.0 + fract * 2.0 / 3.0;
1226 a[0] = -fract / 5.0;
1228 a[2] = 1.0 + fract * 4.0 / 5.0;
1233 if (direction == L_HORIZ) {
1234 for (i = 0; i <
h; i++) {
1235 lines = datas + i * wpls;
1236 lined = datad + i * wpld;
1237 if (halfwidth == 1) {
1238 for (j = 1; j <
w - 1; j++) {
1242 ival = (l_int32)val;
1243 ival = L_MAX(0, ival);
1244 ival = L_MIN(255, ival);
1248 for (j = 2; j <
w - 2; j++) {
1254 ival = (l_int32)val;
1255 ival = L_MAX(0, ival);
1256 ival = L_MIN(255, ival);
1262 if (halfwidth == 1) {
1263 for (i = 1; i <
h - 1; i++) {
1264 lines0 = datas + (i - 1) * wpls;
1265 lines1 = datas + i * wpls;
1266 lines2 = datas + (i + 1) * wpls;
1267 lined = datad + i * wpld;
1268 for (j = 0; j <
w; j++) {
1272 ival = (l_int32)val;
1273 ival = L_MAX(0, ival);
1274 ival = L_MIN(255, ival);
1279 for (i = 2; i <
h - 2; i++) {
1280 lines0 = datas + (i - 2) * wpls;
1281 lines1 = datas + (i - 1) * wpls;
1282 lines2 = datas + i * wpls;
1283 lines3 = datas + (i + 1) * wpls;
1284 lines4 = datas + (i + 2) * wpls;
1285 lined = datad + i * wpld;
1286 for (j = 0; j <
w; j++) {
1292 ival = (l_int32)val;
1293 ival = L_MAX(0, ival);
1294 ival = L_MIN(255, ival);
1325 l_int32
w,
h, d, wpls, wpld, wplf, i, j, ival, sval;
1326 l_uint32 *datas, *datad, *lines, *lined;
1327 l_float32 val, norm;
1328 l_float32 *dataf, *linef, *linef0, *linef1, *linef2, *linef3, *linef4;
1332 PROCNAME(
"pixUnsharpMaskingGray2D");
1335 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1337 if (d != 8 || pixGetColormap(
pixs) != NULL)
1338 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp or has cmap", procName, NULL);
1339 if (fract <= 0.0 || halfwidth <= 0) {
1340 L_WARNING(
"no sharpening requested; clone returned\n", procName);
1343 if (halfwidth != 1 && halfwidth != 2)
1344 return (
PIX *)ERROR_PTR(
"halfwidth must be 1 or 2", procName, NULL);
1347 halfwidth, halfwidth)) == NULL)
1348 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1350 wpld = pixGetWpl(pixd);
1352 wpls = pixGetWpl(
pixs);
1358 return (
PIX *)ERROR_PTR(
"fpix not made", procName, NULL);
1362 if (halfwidth == 1) {
1363 for (i = 0; i <
h; i++) {
1364 lines = datas + i * wpls;
1365 linef = dataf + i * wplf;
1366 for (j = 1; j <
w - 1; j++) {
1374 for (i = 0; i <
h; i++) {
1375 lines = datas + i * wpls;
1376 linef = dataf + i * wplf;
1377 for (j = 2; j <
w - 2; j++) {
1395 if (halfwidth == 1) {
1396 for (i = 1; i <
h - 1; i++) {
1397 linef0 = dataf + (i - 1) * wplf;
1398 linef1 = dataf + i * wplf;
1399 linef2 = dataf + (i + 1) * wplf;
1400 lined = datad + i * wpld;
1401 lines = datas + i * wpls;
1403 for (j = 1; j <
w - 1; j++) {
1404 val = norm * (linef0[j] + linef1[j] +
1407 ival = (l_int32)(sval + fract * (sval - val) + 0.5);
1408 ival = L_MAX(0, ival);
1409 ival = L_MIN(255, ival);
1414 for (i = 2; i <
h - 2; i++) {
1415 linef0 = dataf + (i - 2) * wplf;
1416 linef1 = dataf + (i - 1) * wplf;
1417 linef2 = dataf + i * wplf;
1418 linef3 = dataf + (i + 1) * wplf;
1419 linef4 = dataf + (i + 2) * wplf;
1420 lined = datad + i * wpld;
1421 lines = datas + i * wpls;
1423 for (j = 2; j <
w - 2; j++) {
1424 val = norm * (linef0[j] + linef1[j] + linef2[j] + linef3[j] +
1427 ival = (l_int32)(sval + fract * (sval - val) + 0.5);
1428 ival = L_MAX(0, ival);
1429 ival = L_MIN(255, ival);
1470 l_int32
w,
h, d, i, j, wpl, delhue;
1471 l_int32 rval, gval, bval, hval, sval, vval;
1472 l_uint32 *data, *line;
1474 PROCNAME(
"pixModifyHue");
1477 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1478 if (pixGetColormap(
pixs) != NULL)
1479 return (
PIX *)ERROR_PTR(
"pixs colormapped", procName, NULL);
1480 if (pixd && (pixd !=
pixs))
1481 return (
PIX *)ERROR_PTR(
"pixd not null or pixs", procName, pixd);
1484 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1485 if (L_ABS(fract) > 1.0)
1486 return (
PIX *)ERROR_PTR(
"fract not in [-1.0 ... 1.0]", procName, NULL);
1490 delhue = (l_int32)(240 * fract);
1491 if (delhue == 0 || delhue == 240 || delhue == -240) {
1492 L_WARNING(
"no change requested in hue\n", procName);
1499 wpl = pixGetWpl(pixd);
1500 for (i = 0; i <
h; i++) {
1501 line = data + i * wpl;
1502 for (j = 0; j <
w; j++) {
1505 hval = (hval + delhue) % 240;
1510 if (pixGetSpp(
pixs) == 4)
1543 l_int32
w,
h, d, i, j, wpl;
1544 l_int32 rval, gval, bval, hval, sval, vval;
1545 l_uint32 *data, *line;
1547 PROCNAME(
"pixModifySaturation");
1550 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1553 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1554 if (L_ABS(fract) > 1.0)
1555 return (
PIX *)ERROR_PTR(
"fract not in [-1.0 ... 1.0]", procName, NULL);
1559 L_WARNING(
"no change requested in saturation\n", procName);
1564 wpl = pixGetWpl(pixd);
1565 for (i = 0; i <
h; i++) {
1566 line = data + i * wpl;
1567 for (j = 0; j <
w; j++) {
1571 sval = (l_int32)(sval * (1.0 + fract));
1573 sval = (l_int32)(sval + fract * (255 - sval));
1578 if (pixGetSpp(
pixs) == 4)
1598 l_int32
w,
h, d, i, j, wpl, sum, count;
1599 l_int32 rval, gval, bval, hval, sval, vval;
1600 l_uint32 *data, *line;
1602 PROCNAME(
"pixMeasureSaturation");
1605 return ERROR_INT(
"pixs not defined", procName, 1);
1608 return ERROR_INT(
"pixs not defined", procName, 1);
1611 return ERROR_INT(
"pixs not 32 bpp", procName, 1);
1613 return ERROR_INT(
"subsampling factor < 1", procName, 1);
1616 wpl = pixGetWpl(
pixs);
1617 for (i = 0, sum = 0, count = 0; i <
h; i += factor) {
1618 line = data + i * wpl;
1619 for (j = 0; j <
w; j += factor) {
1628 *psat = (l_float32)sum / (l_float32)count;
1659 l_int32
w,
h, d, i, j, wpl;
1660 l_int32 rval, gval, bval, hval, sval, vval;
1661 l_uint32 *data, *line;
1663 PROCNAME(
"pixModifyBrightness");
1666 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1669 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1670 if (L_ABS(fract) > 1.0)
1671 return (
PIX *)ERROR_PTR(
"fract not in [-1.0 ... 1.0]", procName, NULL);
1675 L_WARNING(
"no change requested in brightness\n", procName);
1680 wpl = pixGetWpl(pixd);
1681 for (i = 0; i <
h; i++) {
1682 line = data + i * wpl;
1683 for (j = 0; j <
w; j++) {
1687 vval = (l_int32)(vval + fract * (255.0 - vval));
1689 vval = (l_int32)(vval * (1.0 + fract));
1694 if (pixGetSpp(
pixs) == 4)
1745 PIX *pix1, *pix2, *pix3;
1748 PROCNAME(
"pixMosaicColorShiftRGB");
1750 if (!
pixs || pixGetDepth(
pixs) != 32)
1751 return (
PIX *)ERROR_PTR(
"pixs undefined or not rgb", procName, NULL);
1752 if (roff < -1.0 || roff > 1.0)
1753 return (
PIX *)ERROR_PTR(
"roff not in [-1.0, 1.0]", procName, NULL);
1754 if (goff < -1.0 || goff > 1.0)
1755 return (
PIX *)ERROR_PTR(
"goff not in [-1.0, 1.0]", procName, NULL);
1756 if (boff < -1.0 || boff > 1.0)
1757 return (
PIX *)ERROR_PTR(
"boff not in [-1.0, 1.0]", procName, NULL);
1758 if (delta < 0.0 || delta > 0.1)
1759 return (
PIX *)ERROR_PTR(
"delta not in [0.0, 0.1]", procName, NULL);
1760 if (delta == 0.0) delta = 0.04;
1761 if (nincr < 0 || nincr > 6)
1762 return (
PIX *)ERROR_PTR(
"nincr not in [0, 6]", procName, NULL);
1763 if (nincr == 0) nincr = 2;
1768 for (i = 0, del = - nincr * delta; i < 2 * nincr + 1; i++, del += delta) {
1770 snprintf(buf,
sizeof(buf),
"%4.2f, %4.2f, %4.2f",
1771 roff + del, goff, boff);
1777 for (i = 0, del = - nincr * delta; i < 2 * nincr + 1; i++, del += delta) {
1779 snprintf(buf,
sizeof(buf),
"%4.2f, %4.2f, %4.2f",
1780 roff, goff + del, boff);
1786 for (i = 0, del = - nincr * delta; i < 2 * nincr + 1; i++, del += delta) {
1788 snprintf(buf,
sizeof(buf),
"%4.2f, %4.2f, %4.2f",
1789 roff, goff, boff + del);
1835 l_int32
w,
h, i, j, wpls, wpld, rval, gval, bval;
1836 l_int32 *rlut, *glut, *blut;
1837 l_uint32 *datas, *datad, *lines, *lined;
1841 PROCNAME(
"pixColorShiftRGB");
1844 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1845 if (pixGetDepth(
pixs) != 32)
1846 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1847 if (rfract < -1.0 || rfract > 1.0)
1848 return (
PIX *)ERROR_PTR(
"rfract not in [-1.0, 1.0]", procName, NULL);
1849 if (gfract < -1.0 || gfract > 1.0)
1850 return (
PIX *)ERROR_PTR(
"gfract not in [-1.0, 1.0]", procName, NULL);
1851 if (bfract < -1.0 || bfract > 1.0)
1852 return (
PIX *)ERROR_PTR(
"bfract not in [-1.0, 1.0]", procName, NULL);
1853 if (rfract == 0.0 && gfract == 0.0 && bfract == 0.0)
1856 rlut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1857 glut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1858 blut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
1859 for (i = 0; i < 256; i++) {
1862 rlut[i] = (l_int32)(fi + (255.0 - fi) * rfract);
1864 rlut[i] = (l_int32)(fi * (1.0 + rfract));
1867 glut[i] = (l_int32)(fi + (255.0 - fi) * gfract);
1869 glut[i] = (l_int32)(fi * (1.0 + gfract));
1872 blut[i] = (l_int32)(fi + (255.0 - fi) * bfract);
1874 blut[i] = (l_int32)(fi * (1.0 + bfract));
1880 wpls = pixGetWpl(
pixs);
1883 wpld = pixGetWpl(pixd);
1884 for (i = 0; i <
h; i++) {
1885 lines = datas + i * wpls;
1886 lined = datad + i * wpld;
1887 for (j = 0; j <
w; j++) {
1927 l_int32 i, j,
w,
h, d, wpls, wpld;
1928 l_int32 ncolors, rval, gval, bval, nrval, ngval, nbval;
1930 l_uint32 *datas, *datad, *lines, *lined;
1934 PROCNAME(
"pixMultConstantColor");
1937 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1939 cmap = pixGetColormap(
pixs);
1940 if (!cmap && d != 32)
1941 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, NULL);
1942 rfact = L_MAX(0.0, rfact);
1943 gfact = L_MAX(0.0, gfact);
1944 bfact = L_MAX(0.0, bfact);
1948 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1949 cmap = pixGetColormap(pixd);
1951 for (i = 0; i < ncolors; i++) {
1953 nrval = (l_int32)(rfact * rval);
1954 ngval = (l_int32)(gfact * gval);
1955 nbval = (l_int32)(bfact * bval);
1956 nrval = L_MIN(255, nrval);
1957 ngval = L_MIN(255, ngval);
1958 nbval = L_MIN(255, nbval);
1965 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1968 wpls = pixGetWpl(
pixs);
1969 wpld = pixGetWpl(pixd);
1970 for (i = 0; i <
h; i++) {
1971 lines = datas + i * wpls;
1972 lined = datad + i * wpld;
1973 for (j = 0; j <
w; j++) {
1975 nrval = (l_int32)(rfact * rval);
1976 ngval = (l_int32)(gfact * gval);
1977 nbval = (l_int32)(bfact * bval);
1978 nrval = L_MIN(255, nrval);
1979 ngval = L_MIN(255, ngval);
1980 nbval = L_MIN(255, nbval);
1982 *(lined + j) = nval;
2027 l_int32 i, j, index, kw, kh,
w,
h, d, wpls, wpld;
2028 l_int32 ncolors, rval, gval, bval, nrval, ngval, nbval;
2030 l_uint32 *datas, *datad, *lines, *lined;
2035 PROCNAME(
"pixMultMatrixColor");
2038 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2040 return (
PIX *)ERROR_PTR(
"kel not defined", procName, NULL);
2042 if (kw != 3 || kh != 3)
2043 return (
PIX *)ERROR_PTR(
"matrix not 3x3", procName, NULL);
2045 cmap = pixGetColormap(
pixs);
2046 if (!cmap && d != 32)
2047 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, NULL);
2049 for (i = 0, index = 0; i < 3; i++)
2050 for (j = 0; j < 3; j++, index++)
2055 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2056 cmap = pixGetColormap(pixd);
2058 for (i = 0; i < ncolors; i++) {
2060 nrval = (l_int32)(v[0] * rval + v[1] * gval + v[2] * bval);
2061 ngval = (l_int32)(v[3] * rval + v[4] * gval + v[5] * bval);
2062 nbval = (l_int32)(v[6] * rval + v[7] * gval + v[8] * bval);
2063 nrval = L_MAX(0, L_MIN(255, nrval));
2064 ngval = L_MAX(0, L_MIN(255, ngval));
2065 nbval = L_MAX(0, L_MIN(255, nbval));
2072 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2075 wpls = pixGetWpl(
pixs);
2076 wpld = pixGetWpl(pixd);
2077 for (i = 0; i <
h; i++) {
2078 lines = datas + i * wpls;
2079 lined = datad + i * wpld;
2080 for (j = 0; j <
w; j++) {
2082 nrval = (l_int32)(v[0] * rval + v[1] * gval + v[2] * bval);
2083 ngval = (l_int32)(v[3] * rval + v[4] * gval + v[5] * bval);
2084 nbval = (l_int32)(v[6] * rval + v[7] * gval + v[8] * bval);
2085 nrval = L_MAX(0, L_MIN(255, nrval));
2086 ngval = L_MAX(0, L_MIN(255, ngval));
2087 nbval = L_MAX(0, L_MIN(255, nbval));
2089 *(lined + j) = nval;
2140 PIX *pixg, *pixacc, *pixc1, *pixc2;
2142 PROCNAME(
"pixHalfEdgeByBandpass");
2145 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2146 if (sm1h == sm2h && sm1v == sm2v)
2147 return (
PIX *)ERROR_PTR(
"sm2 = sm1", procName, NULL);
2148 d = pixGetDepth(
pixs);
2149 if (d != 8 && d != 32)
2150 return (
PIX *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
2159 return (
PIX *)ERROR_PTR(
"pixacc not made", procName, NULL);
2164 return (
PIX *)ERROR_PTR(
"pixc1 not made", procName, NULL);
2171 return (
PIX *)ERROR_PTR(
"pixc2 not made", procName, NULL);
PIX * pixConvertRGBToLuminance(PIX *pixs)
pixConvertRGBToLuminance()
NUMA * pixGetGrayHistogram(PIX *pixs, l_int32 factor)
pixGetGrayHistogram()
void bmfDestroy(L_BMF **pbmf)
bmfDestroy()
PIX * pixContrastTRCMasked(PIX *pixd, PIX *pixs, PIX *pixm, l_float32 factor)
pixContrastTRCMasked()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
l_int32 pixaccAdd(PIXACC *pixacc, PIX *pix)
pixaccAdd()
PIX * pixUnsharpMaskingGray2D(PIX *pixs, l_int32 halfwidth, l_float32 fract)
pixUnsharpMaskingGray2D()
l_int32 numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
PIX * pixContrastTRC(PIX *pixd, PIX *pixs, l_float32 factor)
pixContrastTRC()
PIX * pixBlockconvAccum(PIX *pixs)
pixBlockconvAccum()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
l_int32 pixSetRGBComponent(PIX *pixd, PIX *pixs, l_int32 comp)
pixSetRGBComponent()
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 numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
l_int32 pixTRCMap(PIX *pixs, PIX *pixm, NUMA *na)
pixTRCMap()
l_int32 pixaccMultConst(PIXACC *pixacc, l_float32 factor)
pixaccMultConst()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_int32 numaGetSum(NUMA *na, l_float32 *psum)
numaGetSum()
l_int32 kernelGetElement(L_KERNEL *kel, l_int32 row, l_int32 col, l_float32 *pval)
kernelGetElement()
l_int32 pixcmapGetColor(PIXCMAP *cmap, l_int32 index, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
pixcmapGetColor()
NUMA * numaGetPartialSums(NUMA *na)
numaGetPartialSums()
#define GET_DATA_BIT(pdata, n)
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()
l_int32 convertRGBToHSV(l_int32 rval, l_int32 gval, l_int32 bval, l_int32 *phval, l_int32 *psval, l_int32 *pvval)
convertRGBToHSV()
PIX * pixSubtractGray(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixSubtractGray()
PIX * pixModifyHue(PIX *pixd, PIX *pixs, l_float32 fract)
pixModifyHue()
static const l_int32 L_INSERT
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_int32 pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
l_int32 convertHSVToRGB(l_int32 hval, l_int32 sval, l_int32 vval, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
convertHSVToRGB()
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_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()
PIX * pixHalfEdgeByBandpass(PIX *pixs, l_int32 sm1h, l_int32 sm1v, l_int32 sm2h, l_int32 sm2v)
pixHalfEdgeByBandpass()
l_int32 pixcmapContrastTRC(PIXCMAP *cmap, l_float32 factor)
pixcmapContrastTRC()
l_int32 pixScaleAndTransferAlpha(PIX *pixd, PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleAndTransferAlpha()
FPIX * fpixCreate(l_int32 width, l_int32 height)
fpixCreate()
l_int32 pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
l_int32 pixaccSubtract(PIXACC *pixacc, PIX *pix)
pixaccSubtract()
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 composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
l_int32 kernelGetParameters(L_KERNEL *kel, l_int32 *psy, l_int32 *psx, l_int32 *pcy, l_int32 *pcx)
kernelGetParameters()
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
l_int32 pixcmapGammaTRC(PIXCMAP *cmap, l_float32 gamma, l_int32 minval, l_int32 maxval)
pixcmapGammaTRC()
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_int32 pixGetDimensions(PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixUnsharpMaskingGray1D(PIX *pixs, l_int32 halfwidth, l_float32 fract, l_int32 direction)
pixUnsharpMaskingGray1D()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
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()
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()