Flex Image Posterize β‘π ‘π π £π
Posterize an image sequence and let audio drive the effect
- images
- opt_feature
- IMAGE
Posterize on its own is old news - reduce the color levels, get that flat, retro-poster look. What makes this version worth a second look is the "Flex" in the name: every parameter that shapes the effect can optionally be driven by a FEATURE, the pack's time-varying curve extracted from audio, motion, or whatever else you've wired up. Leave the feature input empty and it's a perfectly normal deterministic posterize filter on an image sequence. Plug something in, and the posterization intensity, dithering, gamma, or color-channel offset can pulse with the beat instead of sitting static for the whole clip.
How it works
The core operation reduces each color channel to a limited number of levels (max_levels), which is what actually creates the posterized banding. Everything else layered on top shapes how that reduction looks: dither_strength blends in dithering noise to soften the hard color bands (via dither_method - Bayer-matrix ordered for a fast retro grain, floyd for Floyd-Steinberg error diffusion that suits natural gradients better, or none for sharp, undithered transitions), channel_separation offsets the RGB channels from each other for a chromatic-shift look, and gamma reshapes brightness distribution before the posterize step runs, which changes where the color bands fall.
The Flex part comes in through feature_param: pick which one of those settings - max_levels, dither_strength, channel_separation, or gamma - gets modulated by whatever's plugged into opt_feature, and feature_mode decides whether that modulation is relative (centered around your set value) or absolute (scales from zero). feature_threshold gates the whole thing - the feature has to cross that level before the effect kicks in, useful for only reacting to louder hits rather than every tiny fluctuation.
Inputs and outputs
images(required,IMAGE) - your input sequence.strength- overall intensity of the effect, 0 to 1.max_levels(default 8) - the actual posterize amount; lower is more dramatic banding, higher preserves more color detail.opt_feature(optional,FEATURE) - the reactive driver; leave unconnected for a static effect.- Output - a single
IMAGE.
Everything else - feature_threshold, feature_param, feature_mode, dither_strength, dither_method, channel_separation, gamma - only matters once you've decided whether you're driving this with a feature and how aggressive you want the base look.
Installing it
Install through ComfyUI Manager (search RyanOnTheInside) or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
Then pip install -r requirements.txt and restart ComfyUI. This node itself is pure image processing with no external model, but if you're planning to drive it with an audio feature, that upstream extraction step needs librosa installed - which is exactly what that requirements file pulls in.
Common issues
If you plug in opt_feature and see nothing change, check feature_threshold first - it's easy to leave it high enough (or your source feature quiet enough) that the modulation never actually triggers. The second most common miss is feature_param - if it's set to None, the feature input is connected but has nothing to modulate, so the node behaves exactly as if opt_feature were empty even though the wire is there.
Push max_levels too low with dither_strength at zero and you'll get harsh, ugly banding rather than the intentional retro look - that's dither_method doing its job (or not); switch to floyd if ordered's Bayer pattern reads too mechanical for your source footage.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| strength | FLOAT | 1.000β1 | Overall strength of the effect (0.0 to 1.0) Higher values create more dramatic changes, while lower values are more subtle. |
| feature_threshold | FLOAT | 0.000β1 | Minimum feature value to trigger the effect (0.0 to 1.0) Only applies the effect when the feature value exceeds this threshold. Lower values make the effect more sensitive, higher values make it more selective. |
| feature_param | COMBO | Choose which parameter to modulate: - max_levels: Dynamically adjust color quantization - dither_strength: Dynamically adjust dithering intensity - channel_separation: Dynamically adjust color channel offsets - gamma: Dynamically adjust brightness distribution - None: No parameter modulation | |
| feature_mode | COMBO | relative | How to apply the feature modulation: - relative: Changes are centered around the original value - absolute: Changes scale directly from zero to the maximum |
| images | IMAGE | Input image sequence to be processed (IMAGE type) | |
| max_levels | INT | 82β256 | Maximum number of color levels per channel. Higher values preserve more color detail (2 to 256) |
| dither_strength | FLOAT | 0.300β1 | Intensity of dithering effect. Higher values reduce color banding (0.0 to 1.0) |
| channel_separation | FLOAT | 0.200β1 | Degree of separation between color channels. Creates color shift effects (0.0 to 1.0) |
| gamma | FLOAT | 1.20.1β2.2 | Gamma correction applied before posterization. Affects brightness distribution (0.1 to 2.2) |
| dither_method | COMBO | ordered | Method used for dithering: - ordered: Fast Bayer matrix dithering, good for retro effects - floyd: Floyd-Steinberg dithering, better for natural gradients - none: No dithering, creates sharp color transitions |
| opt_featureopt | FEATURE | Optional feature input for modulation Connect any feature node here to control the effect. Features can come from audio, motion, color, or other sources. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | β |