Pix* stats(Pix* pix){ Numa* histo = pixGetGrayHistogram(pix, 4); Numa* norm = numaNormalizeHistogram(histo, 1); l_float32 mean, median, variance, stdd; numaGetHistogramStats(histo, 0, 1, &mean, &median, NULL, &variance); stdd = sqrt(variance); printf("stats: mean = %.2f, stdd = %.2f\n", mean, stdd); numaDestroy(&histo); numaDestroy(&norm); return pixClone(pix); }
main(int argc, char **argv) { char fname[256]; l_int32 i, w, h, nbins, factor, success, display; l_int32 spike; l_uint32 *array, *marray; FILE *fp; NUMA *na, *nan, *nai, *narbin; PIX *pixs, *pixt, *pixd; PIXA *pixa; if (regTestSetup(argc, argv, &fp, &display, &success, NULL)) return 1; /* Find the rank bin colors */ pixs = pixRead("map1.jpg"); pixGetDimensions(pixs, &w, &h, NULL); factor = L_MAX(1, (l_int32)sqrt((l_float64)(w * h / 20000.0))); nbins = 10; pixGetRankColorArray(pixs, nbins, L_SELECT_MIN, factor, &array, 2); for (i = 0; i < nbins; i++) fprintf(stderr, "%d: %x\n", i, array[i]); pixd = pixDisplayColorArray(array, nbins, 200, 5, 1); pixWrite("/tmp/rankhisto.0.png", pixd, IFF_PNG); regTestCheckFile(fp, argv, "/tmp/rankhisto.0.png", 0, &success); pixDisplayWithTitle(pixd, 100, 100, NULL, display); pixDestroy(&pixd); /* Modify the rank bin colors by mapping them such * that the lightest color is mapped to white */ marray = (l_uint32 *)CALLOC(nbins, sizeof(l_uint32)); for (i = 0; i < nbins; i++) pixelLinearMapToTargetColor(array[i], array[nbins - 1], 0xffffff00, &marray[i]); pixd = pixDisplayColorArray(marray, nbins, 200, 5, 1); pixWrite("/tmp/rankhisto.1.png", pixd, IFF_PNG); regTestCheckFile(fp, argv, "/tmp/rankhisto.1.png", 1, &success); pixDisplayWithTitle(pixd, 100, 600, NULL, display); pixDestroy(&pixd); FREE(marray); /* Save the histogram plots */ #ifndef _WIN32 sleep(2); /* give gnuplot time to write out the files */ #else Sleep(2000); #endif /* _WIN32 */ pixa = PixSavePlots1(); pixd = pixaDisplay(pixa, 0, 0); pixWrite("/tmp/rankhisto.2.png", pixd, IFF_PNG); regTestCheckFile(fp, argv, "/tmp/rankhisto.2.png", 2, &success); pixDisplayWithTitle(pixd, 100, 600, NULL, display); pixaDestroy(&pixa); pixDestroy(&pixd); /* Map to the lightest bin; then do TRC adjustment */ pixt = pixLinearMapToTargetColor(NULL, pixs, array[nbins - 1], 0xffffff00); pixd = pixGammaTRC(NULL, pixt, 1.0, 0, 240); pixWrite("/tmp/rankhisto.3.png", pixd, IFF_PNG); regTestCheckFile(fp, argv, "/tmp/rankhisto.3.png", 3, &success); pixDisplayWithTitle(pixd, 600, 100, NULL, display); pixDestroy(&pixt); pixDestroy(&pixd); /* Now test the edge cases for the histogram and rank LUT, * where all the histo data is piled up at one place. * We only require that the result be sensible. */ for (i = 0; i < 3; i++) { if (i == 0) spike = 0; else if (i == 1) spike = 50; else spike = 99; na = numaMakeConstant(0, 100); numaReplaceNumber(na, spike, 200.0); nan = numaNormalizeHistogram(na, 1.0); numaDiscretizeRankAndIntensity(nan, 10, &narbin, &nai, NULL, NULL); snprintf(fname, sizeof(fname), "/tmp/rtnan%d", i + 1); gplotSimple1(nan, GPLOT_PNG, fname, "Normalized Histogram"); snprintf(fname, sizeof(fname), "/tmp/rtnai%d", i + 1); gplotSimple1(nai, GPLOT_PNG, fname, "Intensity vs. rank bin"); snprintf(fname, sizeof(fname), "/tmp/rtnarbin%d", i + 1); gplotSimple1(narbin, GPLOT_PNG, fname, "LUT: rank bin vs. Intensity"); numaDestroy(&na); numaDestroy(&nan); numaDestroy(&narbin); numaDestroy(&nai); } #ifndef _WIN32 sleep(2); /* give gnuplot time to write out the files */ #else Sleep(2000); #endif /* _WIN32 */ pixa = PixSavePlots2(); pixd = pixaDisplay(pixa, 0, 0); pixWrite("/tmp/rankhisto.4.png", pixd, IFF_PNG); regTestCheckFile(fp, argv, "/tmp/rankhisto.4.png", 4, &success); pixDisplayWithTitle(pixd, 500, 600, NULL, display); pixaDestroy(&pixa); pixDestroy(&pixd); pixDestroy(&pixs); FREE(array); regTestCleanup(argc, argv, fp, success, NULL); return 0; }