static void DisplayMapHistogram(L_AMAP *m, PIXCMAP *cmap, const char *rootname) { l_int32 i, n, ival; l_uint32 val32; NUMA *na; RB_TYPE key; RB_TYPE *pval; n = pixcmapGetCount(cmap); na = numaCreate(n); for (i = 0; i < n; i++) { pixcmapGetColor32(cmap, i, &val32); key.utype = val32; pval = l_amapFind(m, key); if (pval) { ival = pval->itype; numaAddNumber(na, ival); } } /* numaWrite("/tmp/lept/map/map.na", na); */ gplotSimple1(na, GPLOT_X11, rootname, NULL); numaDestroy(&na); return; }
static void DisplayMapHistogram(L_AMAP *m, PIXCMAP *cmap, const char *rootname) { char buf[128]; l_int32 i, n, ival; l_uint32 val32; NUMA *na; RB_TYPE key; RB_TYPE *pval; n = pixcmapGetCount(cmap); na = numaCreate(n); for (i = 0; i < n; i++) { pixcmapGetColor32(cmap, i, &val32); key.utype = val32; pval = l_amapFind(m, key); if (pval) { ival = pval->itype; numaAddNumber(na, ival); } } gplotSimple1(na, GPLOT_PNG, rootname, NULL); snprintf(buf, sizeof(buf), "%s.png", rootname); l_fileDisplay(buf, 700, 0, 1.0); numaDestroy(&na); return; }
static L_AMAP * BuildMapHistogram(PIX *pix, l_int32 factor, l_int32 print) { l_int32 i, j, w, h, wpl, val; l_uint32 val32; l_uint32 *data, *line; L_AMAP *m; PIXCMAP *cmap; RB_TYPE key, value; RB_TYPE *pval; fprintf(stderr, "\n --------------- Begin building map --------------\n"); m = l_amapCreate(L_UINT_TYPE); data = pixGetData(pix); wpl = pixGetWpl(pix); cmap = pixGetColormap(pix); pixGetDimensions(pix, &w, &h, NULL); for (i = 0; i < h; i += factor) { line = data + i * wpl; for (j = 0; j < w; j += factor) { val = GET_DATA_BYTE(line, j); pixcmapGetColor32(cmap, val, &val32); key.utype = val32; pval = l_amapFind(m, key); if (!pval) value.itype = 1; else value.itype = 1 + pval->itype; if (print) { fprintf(stderr, "key = %llx, val = %lld\n", key.utype, value.itype); } l_amapInsert(m, key, value); } } fprintf(stderr, "Size: %d\n", l_amapSize(m)); if (print) l_rbtreePrint(stderr, m); fprintf(stderr, " ----------- End Building map -----------------\n"); return m; }
l_int32 main(int argc, char **argv) { l_int32 i, n, w, h, val; l_uint32 val32; L_AMAP *m; NUMA *na; PIX *pix; PIXCMAP *cmap; RB_TYPE key, value; RB_TYPE *pval; lept_mkdir("lept/map"); pix = pixRead("weasel8.240c.png"); pixGetDimensions(pix, &w, &h, NULL); fprintf(stderr, "Image area in pixels: %d\n", w * h); cmap = pixGetColormap(pix); /* Build the histogram, stored in a map. Then compute * and display the histogram as the number of pixels vs * the colormap index */ m = BuildMapHistogram(pix, 1, FALSE); TestMapIterator1(m, FALSE); TestMapIterator2(m, FALSE); DisplayMapHistogram(m, cmap, "/tmp/lept/map/map1"); l_amapDestroy(&m); /* Ditto, but just with a few pixels */ m = BuildMapHistogram(pix, 14, TRUE); DisplayMapHistogram(m, cmap, "/tmp/lept/map/map2"); l_amapDestroy(&m); /* Do in-order tranversals, using the iterators */ m = BuildMapHistogram(pix, 7, FALSE); TestMapIterator1(m, TRUE); TestMapIterator2(m, TRUE); l_amapDestroy(&m); /* Do in-order tranversals, with iterators and destroying the map */ m = BuildMapHistogram(pix, 7, FALSE); TestMapIterator3(m, TRUE); lept_free(m); m = BuildMapHistogram(pix, 7, FALSE); TestMapIterator4(m, TRUE); lept_free(m); /* Do in-order tranversals, with iterators and reversing the map */ m = BuildMapHistogram(pix, 7, FALSE); TestMapIterator5(m, TRUE); l_amapDestroy(&m); /* Build a histogram the old-fashioned way */ na = pixGetCmapHistogram(pix, 1); numaWrite("/tmp/lept/map/map2.na", na); gplotSimple1(na, GPLOT_X11, "/tmp/lept/map/map1", NULL); numaDestroy(&na); /* Build a separate map from (rgb) --> colormap index ... */ m = l_amapCreate(L_UINT_TYPE); n = pixcmapGetCount(cmap); for (i = 0; i < n; i++) { pixcmapGetColor32(cmap, i, &val32); key.utype = val32; value.itype = i; l_amapInsert(m, key, value); } /* ... and test the map */ for (i = 0; i < n; i++) { pixcmapGetColor32(cmap, i, &val32); key.utype = val32; pval = l_amapFind(m, key); if (i != pval->itype) fprintf(stderr, "i = %d != val = %llx\n", i, pval->itype); } l_amapDestroy(&m); pixDestroy(&pix); return 0; }