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.

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:
| Cast | Try | Why |
|---|---|---|
| Yellow | colorbalance=bm=0.1:bh=0.05 | Positive blue moves away from yellow |
| Green | colorbalance=gm=-0.1 | Negative green moves toward magenta |
| Blue | colorbalance=bm=-0.1 | Negative blue moves toward yellow |
| Magenta | colorbalance=gm=0.1 | Positive 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:
normalizestretches 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.histeqequalizes 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/checkvalidates 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, thenGET /v1/jobs/:id/resultfor the newvideo_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:
lut3disn'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
- How to convert HEVC (H.265) video to H.264
Convert HEVC (H.265) to H.264 by re-encoding the video stream. On Sume, an exact trim of a whole non-HDR clip returns an H.264 MP4.
- How to crop a video without losing quality
A normal crop re-encodes the frames, so lose as little as you can: crop once, from the original, and don't scale back up. How Sume encodes each edit.
- Demand Gen video specs: sizes, lengths, and the 4:5 cut
Demand Gen takes 1:1, 16:9, 4:5, and optional 9:16 videos of at least 5 seconds, uploaded to YouTube. How to make each, including 4:5, with Sume.
- Detect language from audio with a speech-to-text API
Detect the language spoken in an audio file: run speech-to-text with no language hint, then read the detected code and confidence from the result.
Written by Sume