🧽 Resample Banding Fix
That Sky Looked Like a Low-Bit JPEG — This Node Un-Bands It
- latent
- model
- positive
- negative
- LATENT
You know the look: a sunset, a studio backdrop, or just a dark wall comes out with visible horizontal stripes of color instead of a smooth gradient. That's banding - the pixel space runs out of precision on a smooth ramp, and what should be a gentle transition collapses into steps. It gets worse after upscaling, heavy JPEG-ish VAE output, and any model that's lazy about gradients. The classic fixes are post-process blur/dither tricks that trade banding for grain. This node takes a different, better route: it re-runs a tiny diffusion pass on the latent.
What it actually is
ResampleBandingFix is one node from the "Remove Banding Artifacts" pack, and honestly the pack is just this one node. The idea is dead simple: instead of scrubbing the decoded pixels, you go back into latent space, add a little noise, and denoise again at low strength. That re-smooths the quantization steps the VAE baked in while leaving composition, pose, and subject basically untouched. It's the img2img trick of "same image, slightly re-graded," tuned for the one artifact you're hunting.
The author built it around Flux - the README brags it's ultra-fast with the fp8 Flux.1-Dev checkpoint and supersonic with Nunchaku checkpoints - and that shows in the defaults, so keep reading before you bolt it onto SD 1.5.
How it works
Under the hood it constructs a standard KSampler, but with a few things hardcoded that you can't touch: 14 steps, CFG at 1.0, and a random seed (the node returns NaN from IS_CHANGED, so it re-executes with a fresh seed every run - no reproducible outputs here). Your denoise input picks where in those 14 steps sampling starts. With the default 0.22, it starts around step 10 of 14: a shallow partial denoise that adds just enough noise to melt the gradient steps, then cleans it back up.
That hardcoded CFG of 1.0 is the tell that this is a flow-matching era node. CFG 1.0 is normal for Flux; for SD 1.5 or SDXL, where the sweet spot is 5–9, a CFG of 1 means guidance is basically off. Your positive/negative conditioning still has to be wired in, but at CFG 1.0 the prompts are mostly along for the ride - an empty prompt gets you the same fix.
The inputs that matter
Most of the inputs are the standard KSampler crew, and you'll wire them the same way:
- latent - this is the one that trips people up. Feed it the latent before decoding:
VAEEncodeyour image (or grab the output of a previous KSampler), not pixels. - model, positive, negative - same model and text encodings your normal sampler uses.
- denoise (default 0.22) - the knob you'll actually tune. Higher means more aggressive de-banding but more drift from the original; 0.4+ starts visibly re-lighting things.
- sampler / scheduler - six samplers (euler, euler_ancestral, dpmpp_2m, dpmpp_2m_sde, deis, heun) and nine schedulers (beta, simple, sgm_uniform, karras, exponential, ddim_uniform, normal, linear_quadratic, kl_optimal). The author's example workflow uses
euler+beta, and that's a fine place to start.
The output is a single LATENT - wire it into VAEDecode and you're done. That's it: one latent in, one (smoother) latent out.
Installing it
ComfyUI Manager is the easy path - search for Remove Banding Artifacts and hit install. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/tritant/ComfyUI_Remove_Banding_Artifacts
Then restart ComfyUI. No model downloads, no requirements.txt, no pip deps - it's a single Python file that only uses ComfyUI's own sampling internals, which is refreshingly rare for a fix-this-artifact node.
Where people get burned
Two things bite. First, the hardcoded CFG 1.0 - if you drop this on an SDXL checkpoint expecting it to behave like a normal img2img pass, you'll wonder why your prompts do nothing. It's really a Flux/flow-matching tool; use it there or accept that the prompt is decorative. Second, the random seed means every run is slightly different, so if you're A/B testing denoise values, the noise floor moves between runs. And if you set denoise to 0 you get a no-op, while setting it near 1 is just... regenerating the image. Low and gentle is the whole game, which is why the 0.22 default is worth trusting before you start cranking it.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | — | |
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| denoise | FLOAT | 0.220–1 | — |
| sampler | COMBO | 6 options: euler, euler_ancestral, dpmpp_2m, dpmpp_2m_sde, deis, heun | |
| scheduler | COMBO | 9 options: beta, simple, sgm_uniform, karras, exponential, ddim_uniform, +3 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |