How to make a video black and white (or keep one color)

Make a video black and white by setting its saturation to zero with FFmpeg's hue or eq filter, or keep one color with colorhold. How to do it on Sume.

4 min readSume
All posts

To make a video black and white, set its color saturation to zero: in FFmpeg that's the hue=s=0 filter, and eq=saturation=0 or monochrome work too. With Sume, send a clip already hosted on media.sume.com and the filter, as its filtergraph, to POST /v1/video-filter, and you get back a new black-and-white MP4 with the clip's sound.

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.

Which filter makes a video black and white?

Any of these three does it, and all three are on Sume's filter allowlist today. Saturation is how much color each pixel carries, so at zero only its lightness is left. Because eq also sets contrast and brightness, eq=saturation=0:contrast=1.2 removes the color and raises the contrast in one filter.

Options from the FFmpeg filters documentation; allowlist from Sume's filter compiler, as described in Video filter. Read 2026-09-27.
FiltergraphWhat FFmpeg's docs sayRange and default
hue=s=0hue modifies the hue and/or the saturation; s is the saturations from −10 to 10, default 1
eq=saturation=0eq sets brightness, contrast, saturation, and approximate gammasaturation from 0.0 to 3.0, default 1
monochromeConverts video to gray using a custom color filtercb and cr from −1 to 1, default 0

How do I make a video black and white with the Sume API?

Send the clip and the filter 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.

  • Validate first with POST /v1/video-filter/check: the same body, 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.
  • The default mode is async, so poll GET /v1/jobs/:id/status and then GET /v1/jobs/:id/result. The kind: video_filter result carries a new video_url with the source's size, frame rate, and audio; the source is untouched.
curl -X POST https://api.sume.com/v1/video-filter \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: black-and-white-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/clip.mp4",
    "filtergraph": "hue=s=0"
  }'

How do I make a video black and white except for one color?

Use colorhold, which is also on the allowlist today. FFmpeg's docs say it removes all color information for all RGB colors except for the one you name, for example colorhold=color=red:similarity=0.3:

  • color takes a color name such as red or a hex value such as 0xD62828, per FFmpeg's color syntax.
  • similarity sets how close a pixel must be to that color to keep it: 0.01 matches only the exact color, and 1.0 matches everything.
  • blend at 0.0 makes the other pixels fully gray; higher values keep more of their color.
  • A real object is rarely one exact color, so raise similarity until it keeps its color, and lower it if other things keep theirs too. POST /v1/video-frames on the result returns full-size stills to check, unbilled.

What are the limits?

  • One clip per job, up to 300 seconds; a longer source fails with output_duration_exceeded.
  • The filter refuses HDR sources (PQ or HLG) with hdr_source_unsupported. A POST /v1/video-inspect probe, which is unbilled, reports hdr before you submit.
  • The graph holds up to 32 named filters and 2,048 characters, so other fixes can go in the same pass; the filter allowlist post lists what's allowed and how the output is encoded.
  • As written, these graphs change every frame of the clip. To change one section only, cut the clip into parts with video trim, filter the part you want, and join the parts in a Timeline 1.0 render over the clip's detached audio.
  • The check is free, and each encode is billed per job; the docs say to confirm the rate in GET /v1/catalog.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume