How to read an image histogram โ€” exposure, clipping and contrast at a glance

Every camera and editor shows a histogram, and most people ignore it. It is the single most honest readout of a photo's exposure โ€” honest in a way a screen's brightness isn't โ€” and it takes two minutes to learn. The image histogram tool draws one for any picture; here is what to look for.

What the graph shows

The horizontal axis is brightness, from pure black on the left (0) to pure white on the right (255). The vertical axis is how many pixels have that brightness. A tall spike at the left means a lot of black pixels; a hump in the middle means mid-tones dominate. Colour histograms draw one curve per channel (red, green, blue); the luminance histogram combines them. Nothing about position in the frame is shown โ€” the histogram is a count, not a map.

Reading exposure

  • Piled against the left, empty on the right: underexposed. Shadows are crushed and the highlights aren't used.
  • Piled against the right: overexposed; skies and skin go to featureless white.
  • A narrow hump in the middle: low contrast โ€” the flat, hazy look. The full range is unused.
  • Spread across the range with gentle slopes at both ends: a well-exposed, normal-contrast image.

Cameras show the histogram of the JPEG preview, not the raw data, which usually has more headroom; a slight pile at the right may be recoverable in raw.

Clipping: the walls

A spike hard against either edge means clipping: pixels that wanted to be darker than 0 or brighter than 255 and were cut off. Clipped highlights are gone โ€” no editing recovers a white sky โ€” which is why photographers "expose for the highlights" and lift shadows later, where noise is the only penalty. A few clipped pixels (specular reflections, the sun) are normal; a wall of them is a lost photo. The photo enhancer stretches tones toward the edges without pushing past them.

There is no correct shape

The "ideal bell curve" is a myth. A snow scene should pile toward the right; a night street toward the left; a high-key portrait against white has a spike at the right that is the background, not a mistake. The histogram shows what the image contains; whether that's right depends on what you photographed. Read it against the scene, and use it to answer one question: is anything I care about clipped or crushed?

How edits move the histogram

Brightness slides the whole graph left or right. Contrast stretches it from the middle (and pushes the ends toward clipping). Levels set new black and white points โ€” dragging the input sliders to where the data starts and ends is the classic contrast fix, and it is exactly what auto-levels does. Curves reshape the distribution arbitrarily: an S-curve steepens the middle (more contrast) while compressing the ends (protecting them). Watching the histogram while editing is how you learn what each control actually does, and it's the reason the graph sits beside the sliders in every serious editor. Photo filters and the vignette tool each leave a signature you can see.

Sources and further reading

The claims in this guide rest on these references, which were checked when the guide was last updated. Spotted an error? The contact page says how to report it.

  1. Image histogram โ€” Wikipedia

Try the tool

Frequently asked questions

What does a histogram tell me about a photo?

How its brightness values are distributed: whether it is under- or overexposed, whether tones are clipped at black or white, and whether contrast is low. It doesn't show where in the frame anything is.

What is clipping?

Pixels pushed beyond pure black or white and cut off โ€” a spike against the edge. Clipped highlights cannot be recovered; slight shadow clipping usually can.

Should a histogram be a bell curve?

No. The right shape depends on the scene โ€” a snow scene piles right, a night scene left. Use it to check for clipping, not to chase a shape.

How do I fix a flat, low-contrast histogram?

Set the black and white points (levels) to where the data begins and ends, or apply a gentle S-curve. Auto-levels does the first automatically.