How to color correct a video: fix a color cast and warmth

Color correct a video with FFmpeg filters on Sume: colorbalance removes a yellow or green cast, colortemperature sets warmth, and eq sets saturation.

5 min readSume
All posts

To color correct a video, first remove any color cast so whites and grays look neutral, then set warmth and saturation to taste. In FFmpeg, colorbalance shifts the shadows, midtones, or highlights toward or away from a color, colortemperature simulates warmer or cooler light, and eq or vibrance changes saturation. With Sume, send a clip already hosted on media.sume.com and those filters, as one filtergraph, to POST /v1/video-filter to get a corrected MP4.

The filter options come from the FFmpeg filters documentation and the Sume facts from the Video filter docs and the Sume API reference, all read on 2026-09-27. Which filters Sume accepts, and how it encodes, is read from its filter compiler and describes current behavior.

How do I fix a yellow, green, or blue cast?

Use colorbalance. It sets the red–cyan, green–magenta, and blue–yellow balance separately for shadows (rs, gs, bs), midtones (rm, gm, bm), and highlights (rh, gh, bh). Each value runs from −1.0 to 1.0, default 0, and the pl option, disabled by default, preserves lightness while the balance changes. A positive value shifts toward the primary color and a negative one toward its complement, so push against the cast:

Values are starting points to adjust. Option behavior from the FFmpeg filters documentation; allowlist from Sume's filter compiler, as described in Video filter. Read 2026-09-27.
CastTryWhy
Yellowcolorbalance=bm=0.1:bh=0.05Positive blue moves away from yellow
Greencolorbalance=gm=-0.1Negative green moves toward magenta
Bluecolorbalance=bm=-0.1Negative blue moves toward yellow
Magentacolorbalance=gm=0.1Positive green moves away from magenta

How do I make a video warmer, cooler, or more vibrant?

Use colortemperature, which simulates ambient light of a color temperature you set in kelvin, from 1000 to 40000, default 6500 K. Lower kelvin values describe warmer, more orange light and higher values cooler, bluer light, so temperature=5000 simulates warmer light than the default and temperature=8000 cooler light. mix (0 to 1, default 1) blends the result with the original.

For saturation, vibrance=intensity=0.2 boosts it (intensity runs from −2 to 2, default 0), and eq=saturation=1.2 raises it too (0.0 to 3.0, default 1).

Is there an automatic color correction?

FFmpeg has filters that measure each frame and correct from what they find, and Sume's allowlist includes these two today. They are fixed image-processing filters, so check the result on stills:

  • normalize stretches each color channel's range, frame by frame. Its channels are fully independent by default, which FFmpeg says can be used to remove some color casts. smoothing, off by default, averages the range over previous frames to reduce flicker.
  • histeq equalizes the histogram of each frame. FFmpeg's docs call it useful only for correcting degraded or poorly captured source video.

How do I apply the correction with the Sume API?

Chain the fixes with commas in one filtergraph, the cast first and then saturation, and send it to POST /v1/video-filter with an Idempotency-Key. The clip must already be your workspace's media.sume.com artifact or asset, such as an earlier Sume job's output; which URLs each endpoint accepts explains the rule.

  • POST /v1/video-filter/check validates the same body for free, with no job and no reserved credits. A program that passes can still fail on the worker, for example on a bad expression, and that comes back as a job error.
  • Poll GET /v1/jobs/:id/status, then GET /v1/jobs/:id/result for the new video_url. The output keeps the source's size, frame rate, and audio.
curl -X POST https://api.sume.com/v1/video-filter \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: color-correct-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/indoor-clip.mp4",
    "filtergraph": "colorbalance=bm=0.1:bh=0.05,vibrance=intensity=0.2"
  }'

Can I apply a LUT, and what are the limits?

  • LUT files can't be applied: lut3d isn't on the allowlist, and neither is anything that reads a file.
  • One clip per job, up to 300 seconds; a longer source fails with output_duration_exceeded. The graph holds up to 32 named filters and 2,048 characters.
  • The filter refuses HDR sources (PQ or HLG) with hdr_source_unsupported.
  • The check is free, and each encode is billed per job; the docs say to confirm the rate in GET /v1/catalog. For exposure rather than color, see how to brighten a dark video.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume