84 #include "allheaders.h" 88 #define SLOW_CUBE_ROOT 0 92 static l_float32 lab_forward(l_float32 v);
93 static l_float32 lab_reverse(l_float32 v);
137 l_int32 w, h, d, wpl, i, j, rval, gval, bval, hval, sval, vval;
138 l_uint32 *line, *data;
141 PROCNAME(
"pixConvertRGBToHSV");
144 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
145 if (pixd && pixd != pixs)
146 return (
PIX *)ERROR_PTR(
"pixd defined and not inplace", procName, pixd);
148 d = pixGetDepth(pixs);
149 cmap = pixGetColormap(pixs);
150 if (!cmap && d != 32)
151 return (
PIX *)ERROR_PTR(
"not cmapped or rgb", procName, pixd);
156 cmap = pixGetColormap(pixd);
164 wpl = pixGetWpl(pixd);
166 for (i = 0; i < h; i++) {
167 line = data + i * wpl;
168 for (j = 0; j < w; j++) {
171 line[j] = (hval << 24) | (sval << 16) | (vval << 8);
201 l_int32 w, h, d, wpl, i, j, rval, gval, bval, hval, sval, vval;
203 l_uint32 *line, *data;
206 PROCNAME(
"pixConvertHSVToRGB");
209 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
210 if (pixd && pixd != pixs)
211 return (
PIX *)ERROR_PTR(
"pixd defined and not inplace", procName, pixd);
213 d = pixGetDepth(pixs);
214 cmap = pixGetColormap(pixs);
215 if (!cmap && d != 32)
216 return (
PIX *)ERROR_PTR(
"not cmapped or hsv", procName, pixd);
221 cmap = pixGetColormap(pixd);
229 wpl = pixGetWpl(pixd);
231 for (i = 0; i < h; i++) {
232 line = data + i * wpl;
233 for (j = 0; j < w; j++) {
236 sval = (pixel >> 16) & 0xff;
237 vval = (pixel >> 8) & 0xff;
280 l_int32 minrg, maxrg, min, max, delta;
283 PROCNAME(
"convertRGBToHSV");
285 if (phval) *phval = 0;
286 if (psval) *psval = 0;
287 if (pvval) *pvval = 0;
288 if (!phval || !psval || !pvval)
289 return ERROR_INT(
"&hval, &sval, &vval not all defined", procName, 1);
291 minrg = L_MIN(rval, gval);
292 min = L_MIN(minrg, bval);
293 maxrg = L_MAX(rval, gval);
294 max = L_MAX(maxrg, bval);
302 *psval = (l_int32)(255. * (l_float32)delta / (l_float32)max + 0.5);
304 h = (l_float32)(gval - bval) / (l_float32)delta;
305 else if (gval == max)
306 h = 2. + (l_float32)(bval - rval) / (l_float32)delta;
308 h = 4. + (l_float32)(rval - gval) / (l_float32)delta;
314 *phval = (l_int32)(h + 0.5);
345 PROCNAME(
"convertHSVToRGB");
347 if (prval) *prval = 0;
348 if (pgval) *pgval = 0;
349 if (pbval) *pbval = 0;
350 if (!prval || !pgval || !pbval)
351 return ERROR_INT(
"&rval, &gval, &bval not all defined", procName, 1);
358 if (hval < 0 || hval > 240)
359 return ERROR_INT(
"invalid hval", procName, 1);
362 h = (l_float32)hval / 40.;
365 s = (l_float32)sval / 255.;
366 x = (l_int32)(vval * (1. - s) + 0.5);
367 y = (l_int32)(vval * (1. - s * f) + 0.5);
368 z = (l_int32)(vval * (1. - s * (1. - f)) + 0.5);
426 l_int32 i, ncolors, rval, gval, bval, hval, sval, vval;
428 PROCNAME(
"pixcmapConvertRGBToHSV");
431 return ERROR_INT(
"cmap not defined", procName, 1);
434 for (i = 0; i < ncolors; i++) {
459 l_int32 i, ncolors, rval, gval, bval, hval, sval, vval;
461 PROCNAME(
"pixcmapConvertHSVToRGB");
464 return ERROR_INT(
"cmap not defined", procName, 1);
467 for (i = 0; i < ncolors; i++) {
494 l_int32 w, h, d, wplt, wpld;
495 l_int32 i, j, rval, gval, bval, hval, minrg, min, maxrg, max, delta;
498 l_uint32 *linet, *lined, *datat, *datad;
501 PROCNAME(
"pixConvertRGBToHue");
504 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
507 if (d != 32 && !pixGetColormap(pixs))
508 return (
PIX *)ERROR_PTR(
"not cmapped or rgb", procName, NULL);
513 pixCopyResolution(pixd, pixs);
514 wplt = pixGetWpl(pixt);
516 wpld = pixGetWpl(pixd);
518 for (i = 0; i < h; i++) {
519 linet = datat + i * wplt;
520 lined = datad + i * wpld;
521 for (j = 0; j < w; j++) {
524 minrg = L_MIN(rval, gval);
525 min = L_MIN(minrg, bval);
526 maxrg = L_MAX(rval, gval);
527 max = L_MAX(maxrg, bval);
533 fh = (l_float32)(gval - bval) / (l_float32)delta;
534 else if (gval == max)
535 fh = 2. + (l_float32)(bval - rval) / (l_float32)delta;
537 fh = 4. + (l_float32)(rval - gval) / (l_float32)delta;
541 hval = (l_int32)(fh + 0.5);
570 l_int32 w, h, d, wplt, wpld;
571 l_int32 i, j, rval, gval, bval, sval, minrg, min, maxrg, max, delta;
573 l_uint32 *linet, *lined, *datat, *datad;
576 PROCNAME(
"pixConvertRGBToSaturation");
579 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
582 if (d != 32 && !pixGetColormap(pixs))
583 return (
PIX *)ERROR_PTR(
"not cmapped or rgb", procName, NULL);
588 pixCopyResolution(pixd, pixs);
589 wplt = pixGetWpl(pixt);
591 wpld = pixGetWpl(pixd);
593 for (i = 0; i < h; i++) {
594 linet = datat + i * wplt;
595 lined = datad + i * wpld;
596 for (j = 0; j < w; j++) {
599 minrg = L_MIN(rval, gval);
600 min = L_MIN(minrg, bval);
601 maxrg = L_MAX(rval, gval);
602 max = L_MAX(maxrg, bval);
607 sval = (l_int32)(255. *
608 (l_float32)delta / (l_float32)max + 0.5);
635 l_int32 w, h, d, wplt, wpld;
636 l_int32 i, j, rval, gval, bval, maxrg, max;
638 l_uint32 *linet, *lined, *datat, *datad;
641 PROCNAME(
"pixConvertRGBToValue");
644 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
647 if (d != 32 && !pixGetColormap(pixs))
648 return (
PIX *)ERROR_PTR(
"not cmapped or rgb", procName, NULL);
653 pixCopyResolution(pixd, pixs);
654 wplt = pixGetWpl(pixt);
656 wpld = pixGetWpl(pixd);
658 for (i = 0; i < h; i++) {
659 linet = datat + i * wplt;
660 lined = datad + i * wpld;
661 for (j = 0; j < w; j++) {
664 maxrg = L_MAX(rval, gval);
665 max = L_MAX(maxrg, bval);
709 l_int32 i, j, w, h, wplt, wpld, hstart, hend, sstart, send, hval, sval;
710 l_int32 *hlut, *slut;
712 l_uint32 *datat, *datad, *linet, *lined;
715 PROCNAME(
"pixMakeRangeMaskHS");
717 if (!pixs || pixGetDepth(pixs) != 32)
718 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
720 return (
PIX *)ERROR_PTR(
"invalid regionflag", procName, NULL);
724 hlut = (l_int32 *)LEPT_CALLOC(240,
sizeof(l_int32));
725 slut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
726 sstart = L_MAX(0, satcenter - sathw);
727 send = L_MIN(255, satcenter + sathw);
728 for (i = sstart; i <= send; i++)
730 hstart = (huecenter - huehw + 240) % 240;
731 hend = (huecenter + huehw + 240) % 240;
733 for (i = hstart; i <= hend; i++)
736 for (i = hstart; i < 240; i++)
738 for (i = 0; i <= hend; i++)
752 wplt = pixGetWpl(pixt);
753 wpld = pixGetWpl(pixd);
754 for (i = 0; i < h; i++) {
755 linet = datat + i * wplt;
756 lined = datad + i * wpld;
757 for (j = 0; j < w; j++) {
759 hval = (pixel >> L_RED_SHIFT) & 0xff;
760 sval = (pixel >> L_GREEN_SHIFT) & 0xff;
761 if (hlut[hval] == 1 && slut[sval] == 1) {
808 l_int32 i, j, w, h, wplt, wpld, hstart, hend, vstart, vend, hval, vval;
809 l_int32 *hlut, *vlut;
811 l_uint32 *datat, *datad, *linet, *lined;
814 PROCNAME(
"pixMakeRangeMaskHV");
816 if (!pixs || pixGetDepth(pixs) != 32)
817 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
819 return (
PIX *)ERROR_PTR(
"invalid regionflag", procName, NULL);
823 hlut = (l_int32 *)LEPT_CALLOC(240,
sizeof(l_int32));
824 vlut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
825 vstart = L_MAX(0, valcenter - valhw);
826 vend = L_MIN(255, valcenter + valhw);
827 for (i = vstart; i <= vend; i++)
829 hstart = (huecenter - huehw + 240) % 240;
830 hend = (huecenter + huehw + 240) % 240;
832 for (i = hstart; i <= hend; i++)
835 for (i = hstart; i < 240; i++)
837 for (i = 0; i <= hend; i++)
851 wplt = pixGetWpl(pixt);
852 wpld = pixGetWpl(pixd);
853 for (i = 0; i < h; i++) {
854 linet = datat + i * wplt;
855 lined = datad + i * wpld;
856 for (j = 0; j < w; j++) {
858 hval = (pixel >> L_RED_SHIFT) & 0xff;
859 vval = (pixel >> L_BLUE_SHIFT) & 0xff;
860 if (hlut[hval] == 1 && vlut[vval] == 1) {
906 l_int32 i, j, w, h, wplt, wpld, sval, vval, sstart, send, vstart, vend;
907 l_int32 *slut, *vlut;
909 l_uint32 *datat, *datad, *linet, *lined;
912 PROCNAME(
"pixMakeRangeMaskSV");
914 if (!pixs || pixGetDepth(pixs) != 32)
915 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
917 return (
PIX *)ERROR_PTR(
"invalid regionflag", procName, NULL);
922 slut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
923 vlut = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
924 sstart = L_MAX(0, satcenter - sathw);
925 send = L_MIN(255, satcenter + sathw);
926 vstart = L_MAX(0, valcenter - valhw);
927 vend = L_MIN(255, valcenter + valhw);
928 for (i = sstart; i <= send; i++)
930 for (i = vstart; i <= vend; i++)
943 wplt = pixGetWpl(pixt);
944 wpld = pixGetWpl(pixd);
945 for (i = 0; i < h; i++) {
946 linet = datat + i * wplt;
947 lined = datad + i * wpld;
948 for (j = 0; j < w; j++) {
950 sval = (pixel >> L_GREEN_SHIFT) & 0xff;
951 vval = (pixel >> L_BLUE_SHIFT) & 0xff;
952 if (slut[sval] == 1 && vlut[vval] == 1) {
993 l_int32 i, j, w, h, wplt, hval, sval, nd;
995 l_uint32 *datat, *linet;
1000 PROCNAME(
"pixMakeHistoHS");
1002 if (pnahue) *pnahue = NULL;
1003 if (pnasat) *pnasat = NULL;
1004 if (!pixs || pixGetDepth(pixs) != 32)
1005 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
1022 1.0 / (l_float32)factor);
1029 wplt = pixGetWpl(pixt);
1030 for (i = 0; i < h; i++) {
1031 linet = datat + i * wplt;
1032 for (j = 0; j < w; j++) {
1034 hval = (pixel >> L_RED_SHIFT) & 0xff;
1038 fprintf(stderr,
"hval = %d for (%d,%d)\n", hval, i, j);
1043 sval = (pixel >> L_GREEN_SHIFT) & 0xff;
1084 l_int32 i, j, w, h, wplt, hval, vval, nd;
1086 l_uint32 *datat, *linet;
1088 NUMA *nahue, *naval;
1091 PROCNAME(
"pixMakeHistoHV");
1093 if (pnahue) *pnahue = NULL;
1094 if (pnaval) *pnaval = NULL;
1095 if (!pixs || pixGetDepth(pixs) != 32)
1096 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
1113 1.0 / (l_float32)factor);
1120 wplt = pixGetWpl(pixt);
1121 for (i = 0; i < h; i++) {
1122 linet = datat + i * wplt;
1123 for (j = 0; j < w; j++) {
1125 hval = (pixel >> L_RED_SHIFT) & 0xff;
1126 vval = (pixel >> L_BLUE_SHIFT) & 0xff;
1167 l_int32 i, j, w, h, wplt, sval, vval, nd;
1169 l_uint32 *datat, *linet;
1171 NUMA *nasat, *naval;
1174 PROCNAME(
"pixMakeHistoSV");
1176 if (pnasat) *pnasat = NULL;
1177 if (pnaval) *pnaval = NULL;
1178 if (!pixs || pixGetDepth(pixs) != 32)
1179 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
1196 1.0 / (l_float32)factor);
1203 wplt = pixGetWpl(pixt);
1204 for (i = 0; i < h; i++) {
1205 linet = datat + i * wplt;
1206 for (j = 0; j < w; j++) {
1208 sval = (pixel >> L_GREEN_SHIFT) & 0xff;
1209 vval = (pixel >> L_BLUE_SHIFT) & 0xff;
1258 l_float32 erasefactor,
1263 l_int32 i, xmax, ymax, ewidth, eheight;
1267 PIX *pixh, *pixw, *pix1, *pix2, *pix3;
1270 PROCNAME(
"pixFindHistoPeaksHSV");
1272 if (ppixa) *ppixa = NULL;
1273 if (ppta) *ppta = NULL;
1274 if (pnatot) *pnatot = NULL;
1275 if (!pixs || pixGetDepth(pixs) != 32)
1276 return ERROR_INT(
"pixs undefined or not 32 bpp", procName, 1);
1277 if (!ppta || !pnatot)
1278 return ERROR_INT(
"&pta and &natot not both defined", procName, 1);
1280 return ERROR_INT(
"invalid HSV histo type", procName, 1);
1283 return ERROR_INT(
"pta not made", procName, 1);
1286 return ERROR_INT(
"natot not made", procName, 1);
1308 for (i = 0; i < npeaks; i++) {
1310 if (maxval == 0)
break;
1313 ewidth = (l_int32)(width * erasefactor);
1314 eheight = (l_int32)(height * erasefactor);
1315 box =
boxCreate(xmax - ewidth, ymax - eheight, 2 * ewidth + 1,
1337 if (ymax - eheight < 0) {
1338 box =
boxCreate(xmax - ewidth, 240 + ymax - eheight,
1339 2 * ewidth + 1, eheight - ymax);
1340 }
else if (ymax + eheight > 239) {
1341 box =
boxCreate(xmax - ewidth, 0, 2 * ewidth + 1,
1342 ymax + eheight - 239);
1386 l_int32 i, j, w, huedelta, satdelta, hue, sat, rval, gval, bval;
1389 PROCNAME(
"displayHSVColorRange");
1391 if (hval < 0 || hval > 240)
1392 return (
PIX *)ERROR_PTR(
"invalid hval", procName, NULL);
1393 if (huehw < 5 || huehw > 120)
1394 return (
PIX *)ERROR_PTR(
"invalid huehw", procName, NULL);
1395 if (sval - sathw < 0 || sval + sathw > 255)
1396 return (
PIX *)ERROR_PTR(
"invalid sval/sathw", procName, NULL);
1397 if (nsamp < 1 || factor < 3)
1398 return (
PIX *)ERROR_PTR(
"invalid nsamp or rep. factor", procName, NULL);
1399 if (vval < 0 || vval > 255)
1400 return (
PIX *)ERROR_PTR(
"invalid vval", procName, NULL);
1402 w = (2 * nsamp + 1);
1403 huedelta = (l_int32)((l_float32)huehw / (l_float32)nsamp);
1404 satdelta = (l_int32)((l_float32)sathw / (l_float32)nsamp);
1406 for (i = 0; i < w; i++) {
1407 hue = hval + huedelta * (i - nsamp);
1408 if (hue < 0) hue += 240;
1409 if (hue >= 240) hue -= 240;
1410 for (j = 0; j < w; j++) {
1411 sat = sval + satdelta * (j - nsamp);
1457 l_int32 w, h, d, wpl, i, j, rval, gval, bval, yval, uval, vval;
1458 l_uint32 *line, *data;
1461 PROCNAME(
"pixConvertRGBToYUV");
1464 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1465 if (pixd && pixd != pixs)
1466 return (
PIX *)ERROR_PTR(
"pixd defined and not inplace", procName, pixd);
1468 d = pixGetDepth(pixs);
1469 cmap = pixGetColormap(pixs);
1470 if (!cmap && d != 32)
1471 return (
PIX *)ERROR_PTR(
"not cmapped or rgb", procName, pixd);
1476 cmap = pixGetColormap(pixd);
1484 wpl = pixGetWpl(pixd);
1486 for (i = 0; i < h; i++) {
1487 line = data + i * wpl;
1488 for (j = 0; j < w; j++) {
1491 line[j] = (yval << 24) | (uval << 16) | (vval << 8);
1520 l_int32 w, h, d, wpl, i, j, rval, gval, bval, yval, uval, vval;
1522 l_uint32 *line, *data;
1525 PROCNAME(
"pixConvertYUVToRGB");
1528 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
1529 if (pixd && pixd != pixs)
1530 return (
PIX *)ERROR_PTR(
"pixd defined and not inplace", procName, pixd);
1532 d = pixGetDepth(pixs);
1533 cmap = pixGetColormap(pixs);
1534 if (!cmap && d != 32)
1535 return (
PIX *)ERROR_PTR(
"not cmapped or hsv", procName, pixd);
1540 cmap = pixGetColormap(pixd);
1548 wpl = pixGetWpl(pixd);
1550 for (i = 0; i < h; i++) {
1551 line = data + i * wpl;
1552 for (j = 0; j < w; j++) {
1555 uval = (pixel >> 16) & 0xff;
1556 vval = (pixel >> 8) & 0xff;
1591 PROCNAME(
"convertRGBToYUV");
1593 if (pyval) *pyval = 0;
1594 if (puval) *puval = 0;
1595 if (pvval) *pvval = 0;
1596 if (!pyval || !puval || !pvval)
1597 return ERROR_INT(
"&yval, &uval, &vval not all defined", procName, 1);
1600 *pyval = (l_int32)(16.0 +
1601 norm * (65.738 * rval + 129.057 * gval + 25.064 * bval) + 0.5);
1602 *puval = (l_int32)(128.0 +
1603 norm * (-37.945 * rval -74.494 * gval + 112.439 * bval) + 0.5);
1604 *pvval = (l_int32)(128.0 +
1605 norm * (112.439 * rval - 94.154 * gval - 18.285 * bval) + 0.5);
1637 l_int32 rval, gval, bval;
1638 l_float32 norm, ym, um, vm;
1640 PROCNAME(
"convertYUVToRGB");
1642 if (prval) *prval = 0;
1643 if (pgval) *pgval = 0;
1644 if (pbval) *pbval = 0;
1645 if (!prval || !pgval || !pbval)
1646 return ERROR_INT(
"&rval, &gval, &bval not all defined", procName, 1);
1652 rval = (l_int32)(norm * (298.082 * ym + 408.583 * vm) + 0.5);
1653 gval = (l_int32)(norm * (298.082 * ym - 100.291 * um - 208.120 * vm) +
1655 bval = (l_int32)(norm * (298.082 * ym + 516.411 * um) + 0.5);
1656 *prval = L_MIN(255, L_MAX(0, rval));
1657 *pgval = L_MIN(255, L_MAX(0, gval));
1658 *pbval = L_MIN(255, L_MAX(0, bval));
1680 l_int32 i, ncolors, rval, gval, bval, yval, uval, vval;
1682 PROCNAME(
"pixcmapConvertRGBToYUV");
1685 return ERROR_INT(
"cmap not defined", procName, 1);
1688 for (i = 0; i < ncolors; i++) {
1713 l_int32 i, ncolors, rval, gval, bval, yval, uval, vval;
1715 PROCNAME(
"pixcmapConvertYUVToRGB");
1718 return ERROR_INT(
"cmap not defined", procName, 1);
1721 for (i = 0; i < ncolors; i++) {
1764 l_int32 w, h, wpls, wpld, i, j, rval, gval, bval;
1765 l_uint32 *lines, *datas;
1766 l_float32 fxval, fyval, fzval;
1767 l_float32 *linex, *liney, *linez, *datax, *datay, *dataz;
1771 PROCNAME(
"pixConvertRGBToXYZ");
1773 if (!pixs || pixGetDepth(pixs) != 32)
1774 return (
FPIXA *)ERROR_PTR(
"pixs undefined or not rgb", procName, NULL);
1779 for (i = 0; i < 3; i++) {
1783 wpls = pixGetWpl(pixs);
1789 for (i = 0; i < h; i++) {
1790 lines = datas + i * wpls;
1791 linex = datax + i * wpld;
1792 liney = datay + i * wpld;
1793 linez = dataz + i * wpld;
1794 for (j = 0; j < w; j++) {
1797 *(linex + j) = fxval;
1798 *(liney + j) = fyval;
1799 *(linez + j) = fzval;
1823 l_int32 w, h, wpls, wpld, i, j, rval, gval, bval;
1824 l_float32 fxval, fyval, fzval;
1825 l_float32 *linex, *liney, *linez, *datax, *datay, *dataz;
1826 l_uint32 *lined, *datad;
1830 PROCNAME(
"fpixaConvertXYZToRGB");
1833 return (
PIX *)ERROR_PTR(
"fpixa undefined or invalid", procName, NULL);
1837 return (
PIX *)ERROR_PTR(
"fpixa dimensions not found", procName, NULL);
1839 wpld = pixGetWpl(pixd);
1847 for (i = 0; i < h; i++) {
1848 linex = datax + i * wpls;
1849 liney = datay + i * wpls;
1850 linez = dataz + i * wpls;
1851 lined = datad + i * wpld;
1852 for (j = 0; j < w; j++) {
1886 PROCNAME(
"convertRGBToXYZ");
1888 if (pfxval) *pfxval = 0.0;
1889 if (pfyval) *pfyval = 0.0;
1890 if (pfzval) *pfzval = 0.0;
1891 if (!pfxval || !pfyval || !pfzval)
1892 return ERROR_INT(
"&xval, &yval, &zval not all defined", procName, 1);
1894 *pfxval = 0.4125 * rval + 0.3576 * gval + 0.1804 * bval;
1895 *pfyval = 0.2127 * rval + 0.7152 * gval + 0.0722 * bval;
1896 *pfzval = 0.0193 * rval + 0.1192 * gval + 0.9502 * bval;
1929 l_int32 rval, gval, bval;
1931 PROCNAME(
"convertXYZToRGB");
1933 if (prval) *prval = 0;
1934 if (pgval) *pgval = 0;
1935 if (pbval) *pbval = 0;
1936 if (!prval || !pgval ||!pbval)
1937 return ERROR_INT(
"&rval, &gval, &bval not all defined", procName, 1);
1938 *prval = *pgval = *pbval = 0;
1940 rval = (l_int32)(3.2405 * fxval - 1.5372 * fyval - 0.4985 * fzval + 0.5);
1941 gval = (l_int32)(-0.9693 * fxval + 1.8760 * fyval + 0.0416 * fzval + 0.5);
1942 bval = (l_int32)(0.0556 * fxval - 0.2040 * fyval + 1.0573 * fzval + 0.5);
1943 if (blackout == 0) {
1944 *prval = L_MAX(0, L_MIN(rval, 255));
1945 *pgval = L_MAX(0, L_MIN(gval, 255));
1946 *pbval = L_MAX(0, L_MIN(bval, 255));
1948 if (rval >= 0 && rval < 256 && gval >= 0 && gval < 256 &&
1949 bval >= 0 && bval < 256) {
1984 l_int32 w, h, wpl, i, j;
1985 l_float32 fxval, fyval, fzval, flval, faval, fbval;
1986 l_float32 *linex, *liney, *linez, *datax, *datay, *dataz;
1987 l_float32 *linel, *linea, *lineb, *datal, *dataa, *datab;
1991 PROCNAME(
"fpixaConvertXYZToLAB");
1994 return (
FPIXA *)ERROR_PTR(
"fpixas undefined/invalid", procName, NULL);
1998 return (
FPIXA *)ERROR_PTR(
"fpixas sizes not found", procName, NULL);
2000 for (i = 0; i < 3; i++) {
2013 for (i = 0; i < h; i++) {
2014 linex = datax + i * wpl;
2015 liney = datay + i * wpl;
2016 linez = dataz + i * wpl;
2017 linel = datal + i * wpl;
2018 linea = dataa + i * wpl;
2019 lineb = datab + i * wpl;
2020 for (j = 0; j < w; j++) {
2021 fxval = *(linex + j);
2022 fyval = *(liney + j);
2023 fzval = *(linez + j);
2025 *(linel + j) = flval;
2026 *(linea + j) = faval;
2027 *(lineb + j) = fbval;
2050 l_int32 w, h, wpl, i, j;
2051 l_float32 fxval, fyval, fzval, flval, faval, fbval;
2052 l_float32 *linel, *linea, *lineb, *datal, *dataa, *datab;
2053 l_float32 *linex, *liney, *linez, *datax, *datay, *dataz;
2057 PROCNAME(
"fpixaConvertLABToXYZ");
2060 return (
FPIXA *)ERROR_PTR(
"fpixas undefined/invalid", procName, NULL);
2064 return (
FPIXA *)ERROR_PTR(
"fpixas sizes not found", procName, NULL);
2066 for (i = 0; i < 3; i++) {
2079 for (i = 0; i < h; i++) {
2080 linel = datal + i * wpl;
2081 linea = dataa + i * wpl;
2082 lineb = datab + i * wpl;
2083 linex = datax + i * wpl;
2084 liney = datay + i * wpl;
2085 linez = dataz + i * wpl;
2086 for (j = 0; j < w; j++) {
2087 flval = *(linel + j);
2088 faval = *(linea + j);
2089 fbval = *(lineb + j);
2091 *(linex + j) = fxval;
2092 *(liney + j) = fyval;
2093 *(linez + j) = fzval;
2116 l_float32 xn, yn, zn, fx, fy, fz;
2118 PROCNAME(
"convertXYZToLAB");
2120 if (plval) *plval = 0.0;
2121 if (paval) *paval = 0.0;
2122 if (pbval) *pbval = 0.0;
2123 if (!plval || !paval || !pbval)
2124 return ERROR_INT(
"&lval, &aval, &bval not all defined", procName, 1);
2127 xn = 0.0041259 * xval;
2128 yn = 0.0039216 * yval;
2129 zn = 0.0036012 * zval;
2131 fx = lab_forward(xn);
2132 fy = lab_forward(yn);
2133 fz = lab_forward(zn);
2134 *plval = 116.0 * fy - 16.0;
2135 *paval = 500.0 * (fx - fy);
2136 *pbval = 200.0 * (fy - fz);
2156 l_float32 fx, fy, fz;
2157 l_float32 xw = 242.37;
2158 l_float32 yw = 255.0;
2159 l_float32 zw = 277.69;
2161 PROCNAME(
"convertLABToXYZ");
2163 if (pxval) *pxval = 0.0;
2164 if (pyval) *pyval = 0.0;
2165 if (pzval) *pzval = 0.0;
2166 if (!pxval || !pyval || !pzval)
2167 return ERROR_INT(
"&xval, &yval, &zval not all defined", procName, 1);
2169 fy = 0.0086207 * (16.0 + lval);
2170 fx = fy + 0.002 * aval;
2171 fz = fy - 0.005 * bval;
2172 *pxval = xw * lab_reverse(fx);
2173 *pyval = yw * lab_reverse(fy);
2174 *pzval = zw * lab_reverse(fz);
2187 lab_forward(l_float32 v)
2189 const l_float32 f_thresh = 0.008856;
2190 const l_float32 f_factor = 7.787;
2191 const l_float32 f_offset = 0.13793;
2195 return powf(v, 0.333333);
2198 num = 4.37089e-04 + v * (9.52695e-02 + v * (1.25201 + v * 1.30273));
2199 den = 3.91236e-03 + v * (2.95408e-01 + v * (1.71714 + v * 6.34341e-01));
2203 return f_factor * v + f_offset;
2213 lab_reverse(l_float32 v)
2215 const l_float32 r_thresh = 0.20690;
2216 const l_float32 r_factor = 0.12842;
2217 const l_float32 r_offset = 0.13793;
2222 return r_factor * (v - r_offset);
2245 l_int32 w, h, wpls, wpld, i, j, rval, gval, bval;
2246 l_uint32 *lines, *datas;
2247 l_float32 flval, faval, fbval;
2248 l_float32 *linel, *linea, *lineb, *datal, *dataa, *datab;
2252 PROCNAME(
"pixConvertRGBToLAB");
2254 if (!pixs || pixGetDepth(pixs) != 32)
2255 return (
FPIXA *)ERROR_PTR(
"pixs undefined or not rgb", procName, NULL);
2260 for (i = 0; i < 3; i++) {
2264 wpls = pixGetWpl(pixs);
2270 for (i = 0; i < h; i++) {
2271 lines = datas + i * wpls;
2272 linel = datal + i * wpld;
2273 linea = dataa + i * wpld;
2274 lineb = datab + i * wpld;
2275 for (j = 0; j < w; j++) {
2278 *(linel + j) = flval;
2279 *(linea + j) = faval;
2280 *(lineb + j) = fbval;
2302 l_int32 w, h, wpls, wpld, i, j, rval, gval, bval;
2303 l_float32 flval, faval, fbval;
2304 l_float32 *linel, *linea, *lineb, *datal, *dataa, *datab;
2305 l_uint32 *lined, *datad;
2309 PROCNAME(
"fpixaConvertLABToRGB");
2312 return (
PIX *)ERROR_PTR(
"fpixa undefined or invalid", procName, NULL);
2316 return (
PIX *)ERROR_PTR(
"fpixa dimensions not found", procName, NULL);
2318 wpld = pixGetWpl(pixd);
2326 for (i = 0; i < h; i++) {
2327 linel = datal + i * wpls;
2328 linea = dataa + i * wpls;
2329 lineb = datab + i * wpls;
2330 lined = datad + i * wpld;
2331 for (j = 0; j < w; j++) {
2365 l_float32 fxval, fyval, fzval;
2367 PROCNAME(
"convertRGBToLAB");
2369 if (pflval) *pflval = 0.0;
2370 if (pfaval) *pfaval = 0.0;
2371 if (pfbval) *pfbval = 0.0;
2372 if (!pflval || !pfaval || !pfbval)
2373 return ERROR_INT(
"&flval, &faval, &fbval not all defined", procName, 1);
2402 l_float32 fxval, fyval, fzval;
2404 PROCNAME(
"convertLABToRGB");
2406 if (prval) *prval = 0;
2407 if (pgval) *pgval = 0;
2408 if (pbval) *pbval = 0;
2409 if (!prval || !pgval || !pbval)
2410 return ERROR_INT(
"&rval, &gval, &bval not all defined", procName, 1);
l_ok pixSetRGBPixel(PIX *pix, l_int32 x, l_int32 y, l_int32 rval, l_int32 gval, l_int32 bval)
pixSetRGBPixel()
PIX * pixAddMixedBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixAddMixedBorder()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
l_ok convertLABToXYZ(l_float32 lval, l_float32 aval, l_float32 bval, l_float32 *pxval, l_float32 *pyval, l_float32 *pzval)
convertLABToXYZ()
l_ok convertRGBToYUV(l_int32 rval, l_int32 gval, l_int32 bval, l_int32 *pyval, l_int32 *puval, l_int32 *pvval)
convertRGBToYUV()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
PIX * pixMakeRangeMaskSV(PIX *pixs, l_int32 satcenter, l_int32 sathw, l_int32 valcenter, l_int32 valhw, l_int32 regionflag)
pixMakeRangeMaskSV()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
PIX * pixWindowedMean(PIX *pixs, l_int32 wc, l_int32 hc, l_int32 hasborder, l_int32 normflag)
pixWindowedMean()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
PIX * pixConvertRGBToHue(PIX *pixs)
pixConvertRGBToHue()
l_int32 fpixaGetCount(FPIXA *fpixa)
fpixaGetCount()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
PIX * pixMaxDynamicRange(PIX *pixs, l_int32 type)
pixMaxDynamicRange()
PIX * pixConvertYUVToRGB(PIX *pixd, PIX *pixs)
pixConvertYUVToRGB()
FPIXA * fpixaConvertLABToXYZ(FPIXA *fpixas)
fpixaConvertLABToXYZ()
PTA * ptaCreate(l_int32 n)
ptaCreate()
void ** pixGetLinePtrs(PIX *pix, l_int32 *psize)
pixGetLinePtrs()
#define GET_DATA_FOUR_BYTES(pdata, n)
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_ok pixSetAll(PIX *pix)
pixSetAll()
PIX * pixAddMirroredBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixAddMirroredBorder()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_ok convertRGBToXYZ(l_int32 rval, l_int32 gval, l_int32 bval, l_float32 *pfxval, l_float32 *pfyval, l_float32 *pfzval)
convertRGBToXYZ()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_ok numaSetCount(NUMA *na, l_int32 newcount)
numaSetCount()
PIX * pixScaleBySampling(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleBySampling()
FPIXA * fpixaCreate(l_int32 n)
fpixaCreate()
PIX * fpixaConvertLABToRGB(FPIXA *fpixa)
fpixaConvertLABToRGB()
l_ok pixClearInRect(PIX *pix, BOX *box)
pixClearInRect()
PIX * pixMakeHistoSV(PIX *pixs, l_int32 factor, NUMA **pnasat, NUMA **pnaval)
pixMakeHistoSV()
l_ok convertLABToRGB(l_float32 flval, l_float32 faval, l_float32 fbval, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
convertLABToRGB()
l_ok fpixaGetFPixDimensions(FPIXA *fpixa, l_int32 index, l_int32 *pw, l_int32 *ph)
fpixaGetFPixDimensions()
#define CLEAR_DATA_BIT(pdata, n)
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
l_ok convertXYZToLAB(l_float32 xval, l_float32 yval, l_float32 zval, l_float32 *plval, l_float32 *paval, l_float32 *pbval)
convertXYZToLAB()
FPIXA * pixConvertRGBToXYZ(PIX *pixs)
pixConvertRGBToXYZ()
l_ok convertHSVToRGB(l_int32 hval, l_int32 sval, l_int32 vval, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
convertHSVToRGB()
l_ok pixClearAll(PIX *pix)
pixClearAll()
l_ok pixcmapGetColor(PIXCMAP *cmap, l_int32 index, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
pixcmapGetColor()
#define SET_DATA_BYTE(pdata, n, val)
l_ok pixFindHistoPeaksHSV(PIX *pixs, l_int32 type, l_int32 width, l_int32 height, l_int32 npeaks, l_float32 erasefactor, PTA **ppta, NUMA **pnatot, PIXA **ppixa)
pixFindHistoPeaksHSV()
l_int32 fpixGetWpl(FPIX *fpix)
fpixGetWpl()
FPIXA * pixConvertRGBToLAB(PIX *pixs)
pixConvertRGBToLAB()
l_float32 * fpixaGetData(FPIXA *fpixa, l_int32 index)
fpixaGetData()
PIX * pixCreateNoInit(l_int32 width, l_int32 height, l_int32 depth)
pixCreateNoInit()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixMakeRangeMaskHV(PIX *pixs, l_int32 huecenter, l_int32 huehw, l_int32 valcenter, l_int32 valhw, l_int32 regionflag)
pixMakeRangeMaskHV()
PIX * pixMakeHistoHV(PIX *pixs, l_int32 factor, NUMA **pnahue, NUMA **pnaval)
pixMakeHistoHV()
PIX * pixConvertHSVToRGB(PIX *pixd, PIX *pixs)
pixConvertHSVToRGB()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok convertYUVToRGB(l_int32 yval, l_int32 uval, l_int32 vval, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
convertYUVToRGB()
PIX * pixMakeHistoHS(PIX *pixs, l_int32 factor, NUMA **pnahue, NUMA **pnasat)
pixMakeHistoHS()
PIX * displayHSVColorRange(l_int32 hval, l_int32 sval, l_int32 vval, l_int32 huehw, l_int32 sathw, l_int32 nsamp, l_int32 factor)
displayHSVColorRange()
l_ok convertRGBToHSV(l_int32 rval, l_int32 gval, l_int32 bval, l_int32 *phval, l_int32 *psval, l_int32 *pvval)
convertRGBToHSV()
l_ok numaShiftValue(NUMA *na, l_int32 index, l_float32 diff)
numaShiftValue()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
PIX * pixConvertRGBToYUV(PIX *pixd, PIX *pixs)
pixConvertRGBToYUV()
l_ok convertXYZToRGB(l_float32 fxval, l_float32 fyval, l_float32 fzval, l_int32 blackout, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
convertXYZToRGB()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixMakeRangeMaskHS(PIX *pixs, l_int32 huecenter, l_int32 huehw, l_int32 satcenter, l_int32 sathw, l_int32 regionflag)
pixMakeRangeMaskHS()
PIX * pixConvertGrayToFalseColor(PIX *pixs, l_float32 gamma)
pixConvertGrayToFalseColor()
l_ok pixcmapConvertHSVToRGB(PIXCMAP *cmap)
pixcmapConvertHSVToRGB()
#define SET_DATA_FOUR_BYTES(pdata, n, val)
l_ok pixRenderHashBoxArb(PIX *pix, BOX *box, l_int32 spacing, l_int32 width, l_int32 orient, l_int32 outline, l_int32 rval, l_int32 gval, l_int32 bval)
pixRenderHashBoxArb()
PIX * pixExpandReplicate(PIX *pixs, l_int32 factor)
pixExpandReplicate()
FPIX * fpixCreate(l_int32 width, l_int32 height)
fpixCreate()
PIX * pixConvertRGBToSaturation(PIX *pixs)
pixConvertRGBToSaturation()
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
l_ok pixGetMaxValueInRect(PIX *pixs, BOX *box, l_uint32 *pmaxval, l_int32 *pxmax, l_int32 *pymax)
pixGetMaxValueInRect()
l_ok pixcmapConvertRGBToYUV(PIXCMAP *cmap)
pixcmapConvertRGBToYUV()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixConvertRGBToValue(PIX *pixs)
pixConvertRGBToValue()
void boxDestroy(BOX **pbox)
boxDestroy()
FPIXA * fpixaConvertXYZToLAB(FPIXA *fpixas)
fpixaConvertXYZToLAB()
l_ok convertRGBToLAB(l_int32 rval, l_int32 gval, l_int32 bval, l_float32 *pflval, l_float32 *pfaval, l_float32 *pfbval)
convertRGBToLAB()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
l_ok pixcmapConvertRGBToHSV(PIXCMAP *cmap)
pixcmapConvertRGBToHSV()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
#define SET_DATA_BIT(pdata, n)
PIX * fpixaConvertXYZToRGB(FPIXA *fpixa)
fpixaConvertXYZToRGB()
FPIX * fpixaGetFPix(FPIXA *fpixa, l_int32 index, l_int32 accesstype)
fpixaGetFPix()
l_ok fpixaAddFPix(FPIXA *fpixa, FPIX *fpix, l_int32 copyflag)
fpixaAddFPix()
PIX * pixConvertRGBToHSV(PIX *pixd, PIX *pixs)
pixConvertRGBToHSV()
l_ok pixcmapConvertYUVToRGB(PIXCMAP *cmap)
pixcmapConvertYUVToRGB()