// Speed making histogram from BWImage: ~1 GPixels/s // Time to get median brightness: ~1us sclass BWImageHistogram { IBWImage image; // optional int[] data; // pixel count for each brightness from 0 to 255 int nPixels; // sum of pixel count int medianBrightness = -1; int medianSum; *(BufferedImage image) { this(BWImage(image)); } *(BWImage *image) { nPixels = area(image); data = bwImageHistogramArray(image); } toString { ret "BWImageHistogram of " + nPixels(nPixels) + (image == null ? "" : appendBracketed(str_px(image))); } int[] getArray() { ret data; } int medianSumTarget() { ret (nPixels+1)/2; } int medianBrightness() { if (medianBrightness < 0) { int threshold = medianSumTarget(), sum = 0; for i to 256: { sum += data[i]; if (sum > threshold) { medianBrightness = i; medianSum = sum; break; } } } ret medianBrightness; } // get pixel count for brightness int get(int brightness) { ret data[brightness]; } void printMedianStats() { int threshold = medianBrightness(); int prevSum = threshold == 0 ? 0 : medianSum-get(threshold-1); printVars(+threshold, +prevSum, target := medianSumTarget(), sum := medianSum); } }