43 #include <config_auto.h> 46 #include "allheaders.h" 49 static const l_int32 MAX_ALLOWED_ITERATIONS = 20;
52 static const l_float32 DIST_EXPAND_FACT = 1.3;
58 static const l_int32 LEVEL_IN_OCTCUBE = 4;
62 l_int32 maxdist, l_int32 maxcolors,
143 PROCNAME(
"pixColorSegment");
146 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
147 if (pixGetDepth(pixs) != 32)
148 return (
PIX *)ERROR_PTR(
"must be rgb color", procName, NULL);
153 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
156 pixWriteDebug(
"/tmp/lept/segment/colorseg1.png", pixd, IFF_PNG);
160 countarray = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
163 pixWriteDebug(
"/tmp/lept/segment/colorseg2.png", pixd, IFF_PNG);
167 LEPT_FREE(countarray);
169 pixWriteDebug(
"/tmp/lept/segment/colorseg3.png", pixd, IFF_PNG);
206 l_int32 w, h, newmaxdist, ret, niters, ncolors, success;
210 PROCNAME(
"pixColorSegmentCluster");
213 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
214 if (pixGetDepth(pixs) != 32)
215 return (
PIX *)ERROR_PTR(
"must be rgb color", procName, NULL);
219 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
222 pixCopyResolution(pixd, pixs);
224 newmaxdist = maxdist;
229 maxcolors, debugflag);
234 L_INFO(
"Success with %d colors after %d iters\n", procName,
238 if (niters == MAX_ALLOWED_ITERATIONS) {
239 L_WARNING(
"too many iters; newmaxdist = %d\n",
240 procName, newmaxdist);
244 newmaxdist = (l_int32)(DIST_EXPAND_FACT * (l_float32)newmaxdist);
249 return (
PIX *)ERROR_PTR(
"failure in phase 1", procName, NULL);
278 l_int32 rmap[256], gmap[256], bmap[256];
279 l_int32 w, h, wpls, wpld, i, j, k, found, ret, index, ncolors;
280 l_int32 rval, gval, bval, dist2, maxdist2;
281 l_int32 countarray[256];
282 l_int32 rsum[256], gsum[256], bsum[256];
284 l_uint32 *datas, *datad, *lines, *lined;
287 PROCNAME(
"pixColorSegmentTryCluster");
290 return ERROR_INT(
"pixs not defined", procName, 1);
292 return ERROR_INT(
"pixd not defined", procName, 1);
294 w = pixGetWidth(pixs);
295 h = pixGetHeight(pixs);
296 maxdist2 = maxdist * maxdist;
297 cmap = pixGetColormap(pixd);
299 for (k = 0; k < 256; k++) {
300 rsum[k] = gsum[k] = bsum[k] = 0;
301 rmap[k] = gmap[k] = bmap[k] = 0;
306 wpls = pixGetWpl(pixs);
307 wpld = pixGetWpl(pixd);
309 for (i = 0; i < h; i++) {
310 lines = datas + i * wpls;
311 lined = datad + i * wpld;
312 for (j = 0; j < w; j++) {
319 for (k = 0; k < ncolors; k++) {
320 dist2 = (rval - rmap[k]) * (rval - rmap[k]) +
321 (gval - gmap[k]) * (gval - gmap[k]) +
322 (bval - bmap[k]) * (bval - bmap[k]);
323 if (dist2 <= maxdist2) {
338 if (ret == 0 && index < maxcolors) {
339 countarray[index] = 1;
349 L_INFO(
"maxcolors exceeded for maxdist = %d\n",
359 for (k = 0; k < ncolors; k++) {
360 rval = rsum[k] / countarray[k];
361 gval = gsum[k] / countarray[k];
362 bval = bsum[k] / countarray[k];
419 l_int32 w, h, wpls, wpld, wplm, i, j, success;
420 l_int32 rval, gval, bval, index;
423 l_uint32 *rtab, *gtab, *btab;
425 l_uint32 *datas, *datad, *datam, *lines, *lined, *linem;
428 PROCNAME(
"pixAssignToNearestColor");
431 return ERROR_INT(
"pixd not defined", procName, 1);
432 if ((cmap = pixGetColormap(pixd)) == NULL)
433 return ERROR_INT(
"cmap not found", procName, 1);
435 return ERROR_INT(
"pixs not defined", procName, 1);
436 if (pixGetDepth(pixs) != 32)
437 return ERROR_INT(
"pixs not 32 bpp", procName, 1);
438 if (level < 1 || level > 6)
439 return ERROR_INT(
"level not in [1 ... 6]", procName, 1);
445 if (!rtab || !gtab || !btab || !cmaptab) {
446 L_ERROR(
"failure to make a table\n", procName);
454 wpls = pixGetWpl(pixs);
455 wpld = pixGetWpl(pixd);
458 wplm = pixGetWpl(pixm);
460 for (i = 0; i < h; i++) {
461 lines = datas + i * wpls;
462 lined = datad + i * wpld;
464 linem = datam + i * wplm;
465 for (j = 0; j < w; j++) {
478 index = cmaptab[octindex];
490 return (success) ? 0 : 1;
517 l_int32 i, ncolors, val;
523 PROCNAME(
"pixColorSegmentClean");
526 return ERROR_INT(
"pixs not defined", procName, 1);
527 if (pixGetDepth(pixs) != 8)
528 return ERROR_INT(
"pixs not 8 bpp", procName, 1);
529 if ((cmap = pixGetColormap(pixs)) == NULL)
530 return ERROR_INT(
"cmap not found", procName, 1);
532 return ERROR_INT(
"countarray not defined", procName, 1);
539 for (i = 0; i < ncolors; i++)
544 return ERROR_INT(
"nasi not made", procName, 1);
550 for (i = 0; i < ncolors; i++) {
554 pixXor(pixt2, pixt2, pixt1);
589 l_int32 i, ncolors, index, tempindex;
596 PROCNAME(
"pixColorSegmentRemoveColors");
599 return ERROR_INT(
"pixd not defined", procName, 1);
600 if (pixGetDepth(pixd) != 8)
601 return ERROR_INT(
"pixd not 8 bpp", procName, 1);
602 if ((cmap = pixGetColormap(pixd)) == NULL)
603 return ERROR_INT(
"cmap not found", procName, 1);
605 return ERROR_INT(
"pixs not defined", procName, 1);
607 if (finalcolors >= ncolors)
619 return ERROR_INT(
"nasi not made", procName, 1);
623 tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
624 for (i = finalcolors; i < ncolors; i++) {
l_int32 lept_mkdir(const char *subdir)
lept_mkdir()
NUMA * numaGetSortIndex(NUMA *na, l_int32 sortorder)
numaGetSortIndex()
l_int32 * pixcmapToOctcubeLUT(PIXCMAP *cmap, l_int32 level, l_int32 metric)
pixcmapToOctcubeLUT()
l_ok pixSetMasked(PIX *pixd, PIX *pixm, l_uint32 val)
pixSetMasked()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
NUMA * pixGetCmapHistogram(PIX *pixs, l_int32 factor)
pixGetCmapHistogram()
PIX * pixCloseSafeCompBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeCompBrick()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixGenerateMaskByValue(PIX *pixs, l_int32 val, l_int32 usecmap)
pixGenerateMaskByValue()
#define GET_DATA_BIT(pdata, n)
l_ok pixAssignToNearestColor(PIX *pixd, PIX *pixs, PIX *pixm, l_int32 level, l_int32 *countarray)
pixAssignToNearestColor()
l_ok pixSetColormap(PIX *pix, PIXCMAP *colormap)
pixSetColormap()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
l_ok pixColorSegmentRemoveColors(PIX *pixd, PIX *pixs, l_int32 finalcolors)
pixColorSegmentRemoveColors()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_ok makeRGBToIndexTables(l_int32 cqlevels, l_uint32 **prtab, l_uint32 **pgtab, l_uint32 **pbtab)
makeRGBToIndexTables()
PIX * pixXor(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixXor()
void getOctcubeIndexFromRGB(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *rtab, l_uint32 *gtab, l_uint32 *btab, l_uint32 *pindex)
getOctcubeIndexFromRGB()
#define SET_DATA_BYTE(pdata, n, val)
l_ok pixcmapAddNewColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval, l_int32 *pindex)
pixcmapAddNewColor()
#define GET_DATA_BYTE(pdata, n)
PIX * pixColorSegmentCluster(PIX *pixs, l_int32 maxdist, l_int32 maxcolors, l_int32 debugflag)
pixColorSegmentCluster()
static l_int32 pixColorSegmentTryCluster(PIX *pixd, PIX *pixs, l_int32 maxdist, l_int32 maxcolors, l_int32 debugflag)
pixColorSegmentTryCluster()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
l_ok pixColorSegmentClean(PIX *pixs, l_int32 selsize, l_int32 *countarray)
pixColorSegmentClean()
PIX * pixColorSegment(PIX *pixs, l_int32 maxdist, l_int32 maxcolors, l_int32 selsize, l_int32 finalcolors, l_int32 debugflag)
pixColorSegment()
l_ok pixcmapGetColor32(PIXCMAP *cmap, l_int32 index, l_uint32 *pval32)
pixcmapGetColor32()
PIX * pixMakeMaskFromLUT(PIX *pixs, l_int32 *tab)
pixMakeMaskFromLUT()
l_ok pixRemoveUnusedColors(PIX *pixs)
pixRemoveUnusedColors()
l_int32 pixcmapGetCount(const PIXCMAP *cmap)
pixcmapGetCount()
l_ok pixcmapClear(PIXCMAP *cmap)
pixcmapClear()