Count the steps in the gradient
Open a dark sky, a studio backdrop lit with a soft falloff, or a simple gradient behind a title, and you will often see distinct bands instead of a smooth ramp. The cause is arithmetic you can do in your head.
An 8-bit channel has 256 levels. Spread a gradient from black to white across a 1920-pixel-wide frame and each level covers about 7.5 pixels. Restrict it to a realistic range (a sky that runs from level 40 to level 90, fifty levels over 1080 pixels) and each step is 21 pixels wide.
The human visual system is very good at detecting an edge, including an edge of about 1 per cent in luminance between two large flat areas. A 21-pixel step is a visible line. This is banding, and it is not a compression artefact in origin; it is quantisation.
Ten bits, and why it fixes it
A 10-bit channel has 1024 levels. The same fifty-level range is now two hundred levels, each step about 5 pixels wide, below the threshold at which the eye separates them for most content. 12-bit gives 4096.
That is the entire argument for higher bit depth, and it is specifically about smooth gradients and heavy grading, not about “more colours” in any sense that matters for a detailed image. A photograph of a forest has so much variation that 8 bits per channel is ample. A sunset, a studio cyclorama, a fade to black, or an image that has been pushed two stops in a grade, is where 8 bits runs out.
Grading is the multiplier here. Lift the shadows of an 8-bit image by two stops and you are stretching perhaps 30 levels across the range where 120 used to be. Whatever banding was latent becomes obvious, and there is nothing to recover: the intermediate values were never recorded.
Encoding at 10-bit even from 8-bit sources
This surprises people: encoding an 8-bit source to a 10-bit output can produce a better-looking file at the same bitrate.
The reason is internal precision. The encoder’s transforms, motion compensation and rounding all happen at the working bit depth. At 8 bits, rounding error accumulates through those stages and shows up as extra banding. At 10 bits there is enough headroom that the rounding stays below the visible threshold.
ffmpeg -i in.mov -c:v libx265 -pix_fmt yuv420p10le -crf 22 out.mp4For HEVC this is the Main 10 profile, and support is broad: every modern phone and television decodes it. For H.264, the equivalent is High 10, and support is much patchier: many hardware decoders refuse it. So the practical advice splits: 10-bit HEVC or AV1, yes; 10-bit H.264, only if you control the players.
Dithering: making the error invisible
If you must stay at 8 bits, the fix is to add a small amount of noise before quantising.
The mechanism is worth understanding because it is counter-intuitive. Without dither, a value sitting between two levels always rounds the same way, so an entire region snaps to the same level and its neighbour snaps to the next: a hard edge. With dither, the value plus a little noise rounds up in some pixels and down in others, in proportion to where it sat between them. The average across a region is now the correct value, and the edge has become a stochastic transition the eye integrates as smooth.
You have traded a visible structured error for an invisible random one. The same principle appears in audio, for exactly the same reason, when reducing from 24-bit to 16-bit.
ffmpeg -i in.mov -vf "gradfun=strength=1.2:radius=16" -c:v libx264 -crf 20 out.mp4gradfun is ffmpeg’s debanding filter: it finds gradients, smooths them, and dithers the result. deband in other tool sets does the same. Use it lightly: too much strength smooths real detail.
The film-grain approach from the compositing module does the same job with a nicer texture: real or synthesised grain is dither, and it is why grainy footage does not band.
Where the depth is lost
Bit depth is a chain, and the lowest link sets the result.
- Camera. Many consumer cameras record 8-bit internally even when the sensor reads more. A camera that records 10-bit 4:2:2 gives you a different grading range.
- The codec. An 8-bit codec discards the rest no matter what fed it.
- The intermediate. Rendering a graded sequence through an 8-bit intermediate and grading again is where a surprising amount of banding is introduced.
- The working space. Compositing in 8 bits and applying several operations compounds rounding at each step. Float is the standard answer, and it is why EXR exists.
- The display. Most laptop panels are 8-bit, some 6-bit with temporal dithering. You may not be able to see your own 10-bit file’s advantage on the screen you are grading on.
That last point matters: banding visible on your monitor may be your monitor, and banding invisible on your monitor may still be visible on a viewer’s television. Check on more than one display before you chase it.
The free path
ffmpeg encodes 10-bit HEVC, VP9 and AV1, and has gradfun and grain filters. DaVinci Resolve’s free edition works in 32-bit float internally and exports 10-bit. Blender renders and composites in float and writes EXR. ImageMagick handles high-bit-depth stills. None of this is behind a paywall; the constraint is usually the camera and the display rather than the software.
The limitation
Bit depth is not free: 10-bit encoding is slower, files are larger, and hardware decode support varies by device and codec. And it cannot recover what was never captured: an 8-bit source graded aggressively will band regardless of what you encode it to, and adding bit depth at the end of the chain buys nothing.
It also does not save you from a badly-lit gradient. A backdrop with a steep falloff lit badly will band in 10 bits too. The ordering is: light it well, capture it deep, work in float, dither on the way out, and skipping any one of those is where the bands come from.
Every lesson here is open. Your progress is recorded once you pass the Video with AI exam.
Check your understanding
Why can encoding an 8-bit source to a 10-bit HEVC output produce a better-looking file at the same bitrate, given that the source has no extra information to carry?
Pick the one you would defend. Your answer stays private.
Stuck on something?Ask Deepa, your AI tutor
