Histogram of image intensities I want to create a histogram of intensities 0.1, 0.2, .... 0.9, 1, from an image rendered using OpenGL and C++. How can I do this? Can I access the pixel intensities in the framebuffer somehow? Also, I'm not using any glsl shaders, and don't intend to.

So far I tried:

unsigned char *framebuffer = frameBuffer = new unsigned char[1920*1080 * 4];

glReadPixels(0, 0, 1920, 1080, GL_RGBA, GL_UNSIGNED_BYTE, frameBuffer);

for (int j = 0; j&lt;1920*1080 * 4; j += 4){
    if(frameBuffer[j] == 0.1)
        // find pixel with R channel at 0.1: this is where the problem is.
        // I know I have surfaces with this intensity but I never enter the if statement
}
Due the way floating point values work, you probably don't want to do an exact equality check. You probably want something more like this in your loop:

uint32 sums [ 11 ] = { 0 };
for (int j = 0; j &lt; 1920 * 1080 * 4; j += 4) {
    size_t bucket = static_cast&lt;size_t&gt;(framebuffer [ j ] * 10.0);
    sums [ bucket ]++;
}


Note that there are 11 buckets because the range includes both 0 and 1. If you want only 10 buckets and want to put any pixels that have a value of 1 in them into the top bucket, you could do:

uint32 sums [ 10 ] = { 0 };


and change the bucket index calculation to:

size_t bucket = static_cast&lt;size_t&gt;(framebuffer [ j ] * 10.0);
bucket = std::min(bucket, 9);