Pix Pix::GenerateMaskByValue(int val, bool useCMap) { if(IsEmpty()) return Pix(); PIX *dPix = pixGenerateMaskByValue(pix, val, useCMap ? 1 : 0); if(!dPix) return Pix(); return Pix(&dPix); } // END Pix::GenerateMaskByValue()
/*! * \brief pixColorSegmentClean() * * \param[in] pixs 8 bpp, colormapped * \param[in] selsize for closing * \param[in] countarray ptr to array containing the number of pixels * found in each color in the colormap * \return 0 if OK, 1 on error * * <pre> * Notes: * (1) This operation is in-place. * (2) This is phase 3 of color segmentation. It is the first * part of a two-step noise removal process. Colors with a * large population are closed first; this operation absorbs * small sets of intercolated pixels of a different color. * </pre> */ l_ok pixColorSegmentClean(PIX *pixs, l_int32 selsize, l_int32 *countarray) { l_int32 i, ncolors, val; l_uint32 val32; NUMA *na, *nasi; PIX *pixt1, *pixt2; PIXCMAP *cmap; PROCNAME("pixColorSegmentClean"); if (!pixs) return ERROR_INT("pixs not defined", procName, 1); if (pixGetDepth(pixs) != 8) return ERROR_INT("pixs not 8 bpp", procName, 1); if ((cmap = pixGetColormap(pixs)) == NULL) return ERROR_INT("cmap not found", procName, 1); if (!countarray) return ERROR_INT("countarray not defined", procName, 1); if (selsize <= 1) return 0; /* nothing to do */ /* Sort colormap indices in decreasing order of pixel population */ ncolors = pixcmapGetCount(cmap); na = numaCreate(ncolors); for (i = 0; i < ncolors; i++) numaAddNumber(na, countarray[i]); nasi = numaGetSortIndex(na, L_SORT_DECREASING); numaDestroy(&na); if (!nasi) return ERROR_INT("nasi not made", procName, 1); /* For each color, in order of decreasing population, * do a closing and absorb the added pixels. Note that * if the closing removes pixels at the border, they'll * still appear in the xor and will be properly (re)set. */ for (i = 0; i < ncolors; i++) { numaGetIValue(nasi, i, &val); pixt1 = pixGenerateMaskByValue(pixs, val, 1); pixt2 = pixCloseSafeCompBrick(NULL, pixt1, selsize, selsize); pixXor(pixt2, pixt2, pixt1); /* pixels to be added to type 'val' */ pixcmapGetColor32(cmap, val, &val32); pixSetMasked(pixs, pixt2, val32); /* add them */ pixDestroy(&pixt1); pixDestroy(&pixt2); } numaDestroy(&nasi); return 0; }
static PIX * ReconstructByValue(L_REGPARAMS *rp, const char *fname) { l_int32 i, n, rval, gval, bval; PIX *pixs, *pixm, *pixd; PIXCMAP *cmap; pixs = pixRead(fname); cmap = pixGetColormap(pixs); n = pixcmapGetCount(cmap); pixd = pixCreateTemplate(pixs); for (i = 0; i < n; i++) { pixm = pixGenerateMaskByValue(pixs, i, 1); pixcmapGetColor(cmap, i, &rval, &gval, &bval); pixSetMaskedCmap(pixd, pixm, 0, 0, rval, gval, bval); pixDestroy(&pixm); } regTestComparePix(rp, pixs, pixd); pixDestroy(&pixs); return pixd; }