92 #include "allheaders.h" 134 l_int32 i,
n, ncolors, ngray;
139 PROCNAME(
"pixColorGrayRegions");
141 if (!pixs || pixGetDepth(pixs) == 1)
142 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
144 return (
PIX *)ERROR_PTR(
"boxa not defined", procName, NULL);
146 return (
PIX *)ERROR_PTR(
"invalid type", procName, NULL);
150 cmap = pixGetColormap(pixs);
154 if (ncolors + ngray < 255) {
164 return (
PIX *)ERROR_PTR(
"thresh must be < 255", procName, NULL);
166 L_WARNING(
"threshold set very high\n", procName);
169 return (
PIX *)ERROR_PTR(
"thresh must be > 0", procName, NULL);
171 L_WARNING(
"threshold set very low\n", procName);
176 for (i = 0; i <
n; i++) {
178 pixColorGray(pixd, box, type, thresh, rval, gval, bval);
235 l_int32 i, j,
w,
h, d, wpl, x1, x2, y1, y2, bw, bh;
236 l_int32 nrval, ngval, nbval, aveval;
239 l_uint32 *line, *data;
243 PROCNAME(
"pixColorGray");
246 return ERROR_INT(
"pixs not defined", procName, 1);
248 return ERROR_INT(
"invalid type", procName, 1);
250 cmap = pixGetColormap(pixs);
252 if (!cmap && d != 8 && d != 32)
253 return ERROR_INT(
"pixs not cmapped, 8 bpp or rgb", procName, 1);
260 return ERROR_INT(
"thresh must be < 255; else this is a no-op",
263 L_WARNING(
"threshold set very high\n", procName);
266 return ERROR_INT(
"thresh must be > 0; else this is a no-op",
269 L_WARNING(
"threshold set very low\n", procName);
289 wpl = pixGetWpl(pixs);
291 for (i = y1; i <= y2; i++) {
294 line = data + i * wpl;
295 for (j = x1; j <= x2; j++) {
299 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
300 ((val32 >> 8) & 0xff)) / 3;
304 nrval = (l_int32)(rval * aveval * factor);
305 ngval = (l_int32)(gval * aveval * factor);
306 nbval = (l_int32)(bval * aveval * factor);
310 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
311 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
312 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
361 l_int32 i, j,
w,
h, d, wm, hm, wmin, hmin, wpl, wplm;
362 l_int32 nrval, ngval, nbval, aveval;
365 l_uint32 *line, *data, *linem, *datam;
369 PROCNAME(
"pixColorGrayMasked");
372 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
373 if (!pixm || pixGetDepth(pixm) != 1)
374 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, NULL);
376 return (
PIX *)ERROR_PTR(
"invalid type", procName, NULL);
378 cmap = pixGetColormap(pixs);
380 if (!cmap && d != 8 && d != 32)
381 return (
PIX *)ERROR_PTR(
"pixs not cmapped, 8 bpp gray or 32 bpp",
392 return (
PIX *)ERROR_PTR(
393 "thresh must be < 255; else this is a no-op", procName, NULL);
395 L_WARNING(
"threshold set very high\n", procName);
398 return (
PIX *)ERROR_PTR(
399 "thresh must be > 0; else this is a no-op", procName, NULL);
401 L_WARNING(
"threshold set very low\n", procName);
406 L_WARNING(
"wm = %d differs from w = %d\n", procName, wm,
w);
408 L_WARNING(
"hm = %d differs from h = %d\n", procName, hm,
h);
417 wpl = pixGetWpl(pixd);
419 wplm = pixGetWpl(pixm);
421 for (i = 0; i < hmin; i++) {
422 line = data + i * wpl;
423 linem = datam + i * wplm;
424 for (j = 0; j < wmin; j++) {
428 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
429 ((val32 >> 8) & 0xff)) / 3;
433 nrval = (l_int32)(rval * aveval * factor);
434 ngval = (l_int32)(gval * aveval * factor);
435 nbval = (l_int32)(bval * aveval * factor);
439 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
440 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
441 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
484 l_int32 val, sval, dval;
485 l_int32 rval, gval, bval, rsval, gsval, bsval;
486 l_int32 i, j,
w,
h, d, wpl;
488 l_uint32 *line, *data;
490 PROCNAME(
"pixSnapColor");
493 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
494 if (pixd && (pixd != pixs))
495 return (
PIX *)ERROR_PTR(
"pixd not null or == pixs", procName, pixd);
497 if (pixGetColormap(pixs))
502 if (pixGetDepth(pixs) < 8)
503 return (
PIX *)ERROR_PTR(
"pixs is < 8 bpp", procName, pixd);
511 wpl = pixGetWpl(pixd);
513 sval = srcval & 0xff;
514 dval = dstval & 0xff;
515 for (i = 0; i <
h; i++) {
516 line = data + i * wpl;
517 for (j = 0; j <
w; j++) {
519 if (L_ABS(val - sval) <= diff)
525 for (i = 0; i <
h; i++) {
526 line = data + i * wpl;
527 for (j = 0; j <
w; j++) {
530 if ((L_ABS(rval - rsval) <= diff) &&
531 (L_ABS(gval - gsval) <= diff) &&
532 (L_ABS(bval - bsval) <= diff))
533 *(line + j) = dstval;
571 l_int32 i, ncolors, index, found;
572 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
577 PROCNAME(
"pixSnapColorCmap");
580 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
581 if (!pixGetColormap(pixs))
582 return (
PIX *)ERROR_PTR(
"cmap not found", procName, pixd);
583 if (pixd && (pixd != pixs))
584 return (
PIX *)ERROR_PTR(
"pixd not null or == pixs", procName, pixd);
591 cmap = pixGetColormap(pixd);
597 for (i = 0; i < ncolors; i++) {
599 if ((L_ABS(rval - rsval) <= diff) &&
600 (L_ABS(gval - gsval) <= diff) &&
601 (L_ABS(bval - bsval) <= diff)) {
616 L_INFO(
"nothing to do\n", procName);
624 if ((tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32))) == NULL)
625 return (
PIX *)ERROR_PTR(
"tab not made", procName, pixd);
626 for (i = 0; i < ncolors; i++) {
628 if ((L_ABS(rval - rsval) <= diff) &&
629 (L_ABS(gval - gsval) <= diff) &&
630 (L_ABS(bval - bsval) <= diff))
686 l_int32 i, j,
w,
h, wpl;
687 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
688 l_int32 *rtab, *gtab, *btab;
690 l_uint32 *line, *data;
692 PROCNAME(
"pixLinearMapToTargetColor");
695 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
696 if (pixd && (pixd != pixs))
697 return (
PIX *)ERROR_PTR(
"pixd not null or == pixs", procName, pixd);
698 if (pixGetDepth(pixs) != 32)
699 return (
PIX *)ERROR_PTR(
"pixs is not 32 bpp", procName, pixd);
707 rsval = L_MIN(254, L_MAX(1, rsval));
708 gsval = L_MIN(254, L_MAX(1, gsval));
709 bsval = L_MIN(254, L_MAX(1, bsval));
710 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
711 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
712 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
713 if (!rtab || !gtab || !btab)
714 return (
PIX *)ERROR_PTR(
"calloc fail for tab", procName, pixd);
715 for (i = 0; i < 256; i++) {
717 rtab[i] = (i * rdval) / rsval;
719 rtab[i] = rdval + ((255 - rdval) * (i - rsval)) / (255 - rsval);
721 gtab[i] = (i * gdval) / gsval;
723 gtab[i] = gdval + ((255 - gdval) * (i - gsval)) / (255 - gsval);
725 btab[i] = (i * bdval) / bsval;
727 btab[i] = bdval + ((255 - bdval) * (i - bsval)) / (255 - bsval);
731 wpl = pixGetWpl(pixd);
732 for (i = 0; i <
h; i++) {
733 line = data + i * wpl;
734 for (j = 0; j <
w; j++) {
783 l_int32 srval, sgval, sbval, drval, dgval, dbval;
784 l_int32 srmap, sgmap, sbmap, drmap, dgmap, dbmap;
786 PROCNAME(
"pixelLinearMapToTargetColor");
789 return ERROR_INT(
"&dcolor not defined", procName, 1);
795 srmap = L_MIN(254, L_MAX(1, srmap));
796 sgmap = L_MIN(254, L_MAX(1, sgmap));
797 sbmap = L_MIN(254, L_MAX(1, sbmap));
800 drval = (srval * drmap) / srmap;
802 drval = drmap + ((255 - drmap) * (srval - srmap)) / (255 - srmap);
804 dgval = (sgval * dgmap) / sgmap;
806 dgval = dgmap + ((255 - dgmap) * (sgval - sgmap)) / (255 - sgmap);
808 dbval = (sbval * dbmap) / sbmap;
810 dbval = dbmap + ((255 - dbmap) * (sbval - sbmap)) / (255 - sbmap);
868 l_int32 i, j,
w,
h, wpl;
869 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
870 l_int32 *rtab, *gtab, *btab;
872 l_uint32 *line, *data;
875 PROCNAME(
"pixShiftByComponent");
878 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
879 if (pixd && (pixd != pixs))
880 return (
PIX *)ERROR_PTR(
"pixd not null or == pixs", procName, pixd);
881 if (pixGetDepth(pixs) != 32 && !pixGetColormap(pixs))
882 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, pixd);
889 if ((cmap = pixGetColormap(pixd)) != NULL) {
896 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
897 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
898 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
899 if (!rtab || !gtab || !btab) {
900 L_ERROR(
"calloc fail for tab\n", procName);
903 for (i = 0; i < 256; i++) {
906 else if (rdval < rsval)
907 rtab[i] = (i * rdval) / rsval;
909 rtab[i] = 255 - (255 - rdval) * (255 - i) / (255 - rsval);
912 else if (gdval < gsval)
913 gtab[i] = (i * gdval) / gsval;
915 gtab[i] = 255 - (255 - gdval) * (255 - i) / (255 - gsval);
918 else if (bdval < bsval)
919 btab[i] = (i * bdval) / bsval;
921 btab[i] = 255 - (255 - bdval) * (255 - i) / (255 - bsval);
925 wpl = pixGetWpl(pixd);
926 for (i = 0; i <
h; i++) {
927 line = data + i * wpl;
928 for (j = 0; j <
w; j++) {
971 l_int32 rsval, rdval, gsval, gdval, bsval, bdval, rs, gs, bs;
973 PROCNAME(
"pixelShiftByComponent");
976 return ERROR_INT(
"&pixel defined", procName, 1);
982 else if (rdval < rsval)
983 rs = (rval * rdval) / rsval;
985 rs = 255 - (255 - rdval) * (255 - rval) / (255 - rsval);
988 else if (gdval < gsval)
989 gs = (gval * gdval) / gsval;
991 gs = 255 - (255 - gdval) * (255 - gval) / (255 - gsval);
994 else if (bdval < bsval)
995 bs = (bval * bdval) / bsval;
997 bs = 255 - (255 - bdval) * (255 - bval) / (255 - bsval);
1029 l_int32 nrval, ngval, nbval;
1031 PROCNAME(
"pixelFractionalShift");
1034 return ERROR_INT(
"&pixel defined", procName, 1);
1035 if (fraction < -1.0 || fraction > 1.0)
1036 return ERROR_INT(
"fraction not in [-1 ... +1]", procName, 1);
1038 nrval = (fraction < 0) ? (l_int32)((1.0 + fraction) * rval + 0.5) :
1039 rval + (l_int32)(fraction * (255 - rval) + 0.5);
1040 ngval = (fraction < 0) ? (l_int32)((1.0 + fraction) * gval + 0.5) :
1041 gval + (l_int32)(fraction * (255 - gval) + 0.5);
1042 nbval = (fraction < 0) ? (l_int32)((1.0 + fraction) * bval + 0.5) :
1043 bval + (l_int32)(fraction * (255 - bval) + 0.5);
l_ok pixcmapCountGrayColors(PIXCMAP *cmap, l_int32 *pngray)
pixcmapCountGrayColors()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
l_ok pixSetMasked(PIX *pixd, PIX *pixm, l_uint32 val)
pixSetMasked()
l_ok pixelFractionalShift(l_int32 rval, l_int32 gval, l_int32 bval, l_float32 fraction, l_uint32 *ppixel)
pixelFractionalShift()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
PIX * pixSnapColorCmap(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval, l_int32 diff)
pixSnapColorCmap()
l_ok pixColorGray(PIX *pixs, BOX *box, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGray()
PIX * pixLinearMapToTargetColor(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval)
pixLinearMapToTargetColor()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
#define GET_DATA_BIT(pdata, n)
l_ok pixColorGrayCmap(PIX *pixs, BOX *box, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayCmap()
l_ok pixelShiftByComponent(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 srcval, l_uint32 dstval, l_uint32 *ppixel)
pixelShiftByComponent()
l_ok pixColorGrayMaskedCmap(PIX *pixs, PIX *pixm, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMaskedCmap()
PIX * pixSnapColor(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval, l_int32 diff)
pixSnapColor()
l_ok pixColorGrayRegionsCmap(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegionsCmap()
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 pixelLinearMapToTargetColor(l_uint32 scolor, l_uint32 srcmap, l_uint32 dstmap, l_uint32 *pdcolor)
pixelLinearMapToTargetColor()
PIX * pixColorGrayMasked(PIX *pixs, PIX *pixm, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMasked()
PIX * pixShiftByComponent(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval)
pixShiftByComponent()
#define GET_DATA_BYTE(pdata, n)
l_int32 pixcmapGetFreeCount(PIXCMAP *cmap)
pixcmapGetFreeCount()
l_ok pixcmapShiftByComponent(PIXCMAP *cmap, l_uint32 srcval, l_uint32 dstval)
pixcmapShiftByComponent()
void pixDestroy(PIX **ppix)
pixDestroy()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
PIX * pixColorGrayRegions(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegions()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixMakeMaskFromLUT(PIX *pixs, l_int32 *tab)
pixMakeMaskFromLUT()
l_ok pixRemoveUnusedColors(PIX *pixs)
pixRemoveUnusedColors()
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
l_ok pixTransferAllData(PIX *pixd, PIX **ppixs, l_int32 copytext, l_int32 copyformat)
pixTransferAllData()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
l_ok boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()