139l_int32 i, n, ncolors, ngray;
144 if (!pixs || pixGetDepth(pixs) == 1)
145 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", __func__, NULL);
147 return (
PIX *)ERROR_PTR(
"boxa not defined", __func__, NULL);
149 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
153 cmap = pixGetColormap(pixs);
155 ncolors = pixcmapGetCount(cmap);
156 pixcmapCountGrayColors(cmap, &ngray);
157 if (ncolors + ngray < 255) {
158 pixd = pixConvertTo8(pixs, 1);
159 pixColorGrayRegionsCmap(pixd, boxa, type, rval, gval, bval);
167 return (
PIX *)ERROR_PTR(
"thresh must be < 255", __func__, NULL);
169 L_WARNING(
"threshold set very high\n", __func__);
172 return (
PIX *)ERROR_PTR(
"thresh must be > 0", __func__, NULL);
174 L_WARNING(
"threshold set very low\n", __func__);
177 pixd = pixConvertTo32(pixs);
178 n = boxaGetCount(boxa);
179 for (i = 0; i < n; i++) {
180 box = boxaGetBox(boxa, i,
L_CLONE);
181 pixColorGray(pixd, box, type, thresh, rval, gval, bval);
238l_int32 i, j, w, h, d, wpl, x1, x2, y1, y2, bw, bh;
239l_int32 nrval, ngval, nbval, aveval;
242l_uint32 *line, *data;
247 return ERROR_INT(
"pixs not defined", __func__, 1);
249 return ERROR_INT(
"invalid type", __func__, 1);
251 cmap = pixGetColormap(pixs);
252 pixGetDimensions(pixs, &w, &h, &d);
253 if (!cmap && d != 8 && d != 32)
254 return ERROR_INT(
"pixs not cmapped, 8 bpp or rgb", __func__, 1);
256 return pixColorGrayCmap(pixs, box, type, rval, gval, bval);
261 return ERROR_INT(
"thresh must be < 255; else this is a no-op",
264 L_WARNING(
"threshold set very high\n", __func__);
267 return ERROR_INT(
"thresh must be > 0; else this is a no-op",
270 L_WARNING(
"threshold set very low\n", __func__);
275 pixt = pixConvertTo32(pixs);
276 pixTransferAllData(pixs, &pixt, 1, 0);
284 boxGetGeometry(box, &x1, &y1, &bw, &bh);
289 data = pixGetData(pixs);
290 wpl = pixGetWpl(pixs);
291 factor = 1.f / 255.f;
292 for (i = y1; i <= y2; i++) {
295 line = data + i * wpl;
296 for (j = x1; j <= x2; j++) {
300 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
301 ((val32 >> 8) & 0xff)) / 3;
305 nrval = (l_int32)(rval * aveval * factor);
306 ngval = (l_int32)(gval * aveval * factor);
307 nbval = (l_int32)(bval * aveval * factor);
311 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
312 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
313 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
315 composeRGBPixel(nrval, ngval, nbval, &val32);
362l_int32 i, j, w, h, d, wm, hm, wmin, hmin, wpl, wplm;
363l_int32 nrval, ngval, nbval, aveval;
366l_uint32 *line, *data, *linem, *datam;
371 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
372 if (!pixm || pixGetDepth(pixm) != 1)
373 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", __func__, NULL);
375 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
377 cmap = pixGetColormap(pixs);
378 pixGetDimensions(pixs, &w, &h, &d);
379 if (!cmap && d != 8 && d != 32)
380 return (
PIX *)ERROR_PTR(
"pixs not cmapped, 8 bpp gray or 32 bpp",
383 pixd = pixCopy(NULL, pixs);
384 pixColorGrayMaskedCmap(pixd, pixm, type, rval, gval, bval);
391 return (
PIX *)ERROR_PTR(
392 "thresh must be < 255; else this is a no-op", __func__, NULL);
394 L_WARNING(
"threshold set very high\n", __func__);
397 return (
PIX *)ERROR_PTR(
398 "thresh must be > 0; else this is a no-op", __func__, NULL);
400 L_WARNING(
"threshold set very low\n", __func__);
403 pixGetDimensions(pixm, &wm, &hm, NULL);
405 L_WARNING(
"wm = %d differs from w = %d\n", __func__, wm, w);
407 L_WARNING(
"hm = %d differs from h = %d\n", __func__, hm, h);
411 pixd = pixConvertTo32(pixs);
413 pixd = pixCopy(NULL, pixs);
415 data = pixGetData(pixd);
416 wpl = pixGetWpl(pixd);
417 datam = pixGetData(pixm);
418 wplm = pixGetWpl(pixm);
419 factor = 1.f / 255.f;
420 for (i = 0; i < hmin; i++) {
421 line = data + i * wpl;
422 linem = datam + i * wplm;
423 for (j = 0; j < wmin; j++) {
427 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
428 ((val32 >> 8) & 0xff)) / 3;
432 nrval = (l_int32)(rval * aveval * factor);
433 ngval = (l_int32)(gval * aveval * factor);
434 nbval = (l_int32)(bval * aveval * factor);
438 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
439 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
440 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
442 composeRGBPixel(nrval, ngval, nbval, &val32);
483l_int32 val, sval, dval;
484l_int32 rval, gval, bval, rsval, gsval, bsval;
485l_int32 i, j, w, h, d, wpl;
487l_uint32 *line, *data;
490 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
491 if (pixd && (pixd != pixs))
492 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
494 if (pixGetColormap(pixs))
499 if (pixGetDepth(pixs) < 8)
500 return (
PIX *)ERROR_PTR(
"pixs is < 8 bpp", __func__, pixd);
504 pixd = pixCopy(NULL, pixs);
506 pixGetDimensions(pixd, &w, &h, &d);
507 data = pixGetData(pixd);
508 wpl = pixGetWpl(pixd);
510 sval = srcval & 0xff;
511 dval = dstval & 0xff;
512 for (i = 0; i < h; i++) {
513 line = data + i * wpl;
514 for (j = 0; j < w; j++) {
516 if (L_ABS(val - sval) <= diff)
521 extractRGBValues(srcval, &rsval, &gsval, &bsval);
522 for (i = 0; i < h; i++) {
523 line = data + i * wpl;
524 for (j = 0; j < w; j++) {
526 extractRGBValues(pixel, &rval, &gval, &bval);
527 if ((L_ABS(rval - rsval) <= diff) &&
528 (L_ABS(gval - gsval) <= diff) &&
529 (L_ABS(bval - bsval) <= diff))
530 *(line + j) = dstval;
568l_int32 i, ncolors, index, found;
569l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
575 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
576 if (!pixGetColormap(pixs))
577 return (
PIX *)ERROR_PTR(
"cmap not found", __func__, pixd);
578 if (pixd && (pixd != pixs))
579 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
582 pixd = pixCopy(NULL, pixs);
586 cmap = pixGetColormap(pixd);
587 ncolors = pixcmapGetCount(cmap);
588 extractRGBValues(srcval, &rsval, &gsval, &bsval);
589 extractRGBValues(dstval, &rdval, &gdval, &bdval);
591 if (pixcmapGetFreeCount(cmap) == 0) {
592 for (i = 0; i < ncolors; i++) {
593 pixcmapGetColor(cmap, i, &rval, &gval, &bval);
594 if ((L_ABS(rval - rsval) <= diff) &&
595 (L_ABS(gval - gsval) <= diff) &&
596 (L_ABS(bval - bsval) <= diff)) {
598 pixcmapResetColor(cmap, index, rdval, gdval, bdval);
604 pixcmapAddColor(cmap, rdval, gdval, bdval);
605 ncolors = pixcmapGetCount(cmap);
611 L_INFO(
"nothing to do\n", __func__);
619 tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
620 for (i = 0; i < ncolors; i++) {
621 pixcmapGetColor(cmap, i, &rval, &gval, &bval);
622 if ((L_ABS(rval - rsval) <= diff) &&
623 (L_ABS(gval - gsval) <= diff) &&
624 (L_ABS(bval - bsval) <= diff))
627 pixm = pixMakeMaskFromLUT(pixd, tab);
632 pixSetMasked(pixd, pixm, dstval);
636 pixRemoveUnusedColors(pixd);
682l_int32 i, j, w, h, wpl;
683l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
684l_int32 *rtab, *gtab, *btab;
686l_uint32 *line, *data;
688 if (!pixs || pixGetDepth(pixs) != 32)
689 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", __func__, pixd);
690 if (pixd && (pixd != pixs))
691 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
695 pixd = pixCopy(NULL, pixs);
697 extractRGBValues(srcval, &rsval, &gsval, &bsval);
698 extractRGBValues(dstval, &rdval, &gdval, &bdval);
699 rsval = L_MIN(254, L_MAX(1, rsval));
700 gsval = L_MIN(254, L_MAX(1, gsval));
701 bsval = L_MIN(254, L_MAX(1, bsval));
702 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
703 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
704 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
705 if (!rtab || !gtab || !btab)
706 return (
PIX *)ERROR_PTR(
"calloc fail for tab", __func__, pixd);
707 for (i = 0; i < 256; i++) {
709 rtab[i] = (i * rdval) / rsval;
711 rtab[i] = rdval + ((255 - rdval) * (i - rsval)) / (255 - rsval);
713 gtab[i] = (i * gdval) / gsval;
715 gtab[i] = gdval + ((255 - gdval) * (i - gsval)) / (255 - gsval);
717 btab[i] = (i * bdval) / bsval;
719 btab[i] = bdval + ((255 - bdval) * (i - bsval)) / (255 - bsval);
721 pixGetDimensions(pixd, &w, &h, NULL);
722 data = pixGetData(pixd);
723 wpl = pixGetWpl(pixd);
724 for (i = 0; i < h; i++) {
725 line = data + i * wpl;
726 for (j = 0; j < w; j++) {
728 extractRGBValues(pixel, &rval, &gval, &bval);
729 composeRGBPixel(rtab[rval], gtab[gval], btab[bval], &pixel);
775l_int32 srval, sgval, sbval, drval, dgval, dbval;
776l_int32 srmap, sgmap, sbmap, drmap, dgmap, dbmap;
779 return ERROR_INT(
"&dcolor not defined", __func__, 1);
782 extractRGBValues(scolor, &srval, &sgval, &sbval);
783 extractRGBValues(srcmap, &srmap, &sgmap, &sbmap);
784 extractRGBValues(dstmap, &drmap, &dgmap, &dbmap);
785 srmap = L_MIN(254, L_MAX(1, srmap));
786 sgmap = L_MIN(254, L_MAX(1, sgmap));
787 sbmap = L_MIN(254, L_MAX(1, sbmap));
790 drval = (srval * drmap) / srmap;
792 drval = drmap + ((255 - drmap) * (srval - srmap)) / (255 - srmap);
794 dgval = (sgval * dgmap) / sgmap;
796 dgval = dgmap + ((255 - dgmap) * (sgval - sgmap)) / (255 - sgmap);
798 dbval = (sbval * dbmap) / sbmap;
800 dbval = dbmap + ((255 - dbmap) * (sbval - sbmap)) / (255 - sbmap);
802 composeRGBPixel(drval, dgval, dbval, pdcolor);
858l_int32 i, j, w, h, wpl;
859l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
860l_int32 *rtab, *gtab, *btab;
862l_uint32 *line, *data;
866 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
867 if (pixd && (pixd != pixs))
868 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
869 if (pixGetDepth(pixs) != 32 && !pixGetColormap(pixs))
870 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", __func__, pixd);
874 pixd = pixCopy(NULL, pixs);
877 if ((cmap = pixGetColormap(pixd)) != NULL) {
878 pixcmapShiftByComponent(cmap, srcval, dstval);
882 extractRGBValues(srcval, &rsval, &gsval, &bsval);
883 extractRGBValues(dstval, &rdval, &gdval, &bdval);
884 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
885 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
886 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
887 if (!rtab || !gtab || !btab) {
888 L_ERROR(
"calloc fail for tab\n", __func__);
891 for (i = 0; i < 256; i++) {
894 else if (rdval < rsval)
895 rtab[i] = (i * rdval) / rsval;
897 rtab[i] = 255 - (255 - rdval) * (255 - i) / (255 - rsval);
900 else if (gdval < gsval)
901 gtab[i] = (i * gdval) / gsval;
903 gtab[i] = 255 - (255 - gdval) * (255 - i) / (255 - gsval);
906 else if (bdval < bsval)
907 btab[i] = (i * bdval) / bsval;
909 btab[i] = 255 - (255 - bdval) * (255 - i) / (255 - bsval);
911 pixGetDimensions(pixd, &w, &h, NULL);
912 data = pixGetData(pixd);
913 wpl = pixGetWpl(pixd);
914 for (i = 0; i < h; i++) {
915 line = data + i * wpl;
916 for (j = 0; j < w; j++) {
918 extractRGBValues(pixel, &rval, &gval, &bval);
919 composeRGBPixel(rtab[rval], gtab[gval], btab[bval], &pixel);
959l_int32 rsval, rdval, gsval, gdval, bsval, bdval, rs, gs, bs;
962 return ERROR_INT(
"&pixel defined", __func__, 1);
964 extractRGBValues(srcval, &rsval, &gsval, &bsval);
965 extractRGBValues(dstval, &rdval, &gdval, &bdval);
968 else if (rdval < rsval)
969 rs = (rval * rdval) / rsval;
971 rs = 255 - (255 - rdval) * (255 - rval) / (255 - rsval);
974 else if (gdval < gsval)
975 gs = (gval * gdval) / gsval;
977 gs = 255 - (255 - gdval) * (255 - gval) / (255 - gsval);
980 else if (bdval < bsval)
981 bs = (bval * bdval) / bsval;
983 bs = 255 - (255 - bdval) * (255 - bval) / (255 - bsval);
984 composeRGBPixel(rs, gs, bs, ppixel);
1019l_int32 nrval, ngval, nbval;
1022 return ERROR_INT(
"&pixel defined", __func__, 1);
1023 if (fract < -1.0 || fract > 1.0)
1024 return ERROR_INT(
"fraction not in [-1 ... +1]", __func__, 1);
1026 nrval = (fract < 0) ? (l_int32)((1.0 + fract) * rval + 0.5) :
1027 rval + (l_int32)(fract * (255 - rval) + 0.5);
1028 ngval = (fract < 0) ? (l_int32)((1.0 + fract) * gval + 0.5) :
1029 gval + (l_int32)(fract * (255 - gval) + 0.5);
1030 nbval = (fract < 0) ? (l_int32)((1.0 + fract) * bval + 0.5) :
1031 bval + (l_int32)(fract * (255 - bval) + 0.5);
1032 composeRGBPixel(nrval, ngval, nbval, ppixel);
1067l_int32 rval, gval, bval;
1070 if (!pixs || pixGetDepth(pixs) != 32)
1071 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", __func__, pixd);
1072 if (pixd && (pixd != pixs))
1073 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
1074 if (fract < -1.0 || fract > 1.0)
1075 return (
PIX *)ERROR_PTR(
"fraction not in [-1 ... +1]", __func__, NULL);
1078 extractRGBValues(srcval, &rval, &gval, &bval);
PIX * pixColorGrayRegions(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegions()
PIX * pixColorGrayMasked(PIX *pixs, PIX *pixm, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMasked()
l_ok pixelShiftByComponent(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 srcval, l_uint32 dstval, l_uint32 *ppixel)
pixelShiftByComponent()
l_ok pixColorGray(PIX *pixs, BOX *box, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGray()