Adjust Image
One node to fix a flat or soft image before it ever leaves ComfyUI
- image
- image
The generation came out flat, a touch soft, maybe banding in the sky - and the fix is a bunch of sliders, not a re-roll. AdjustImage is ComfyUI's one-stop post-processing node from the Alchemine pack: brightness, contrast, saturation and gamma for color, a real denoise plus three kinds of sharpening, and an optional resize, all in a single node.
The trick that makes it safe to drop into any workflow: every knob defaults to a no-op. Wire it in, run it, and the image passes through pixel-identical until you actually move something. You can add it to a graph you already like without changing a single result.
How it works
The order is fixed and deliberate: brightness → contrast → saturation → gamma → denoise → edge enhance → CAS → local contrast → resize. Denoise runs first so the sharpeners don't amplify the noise they were meant to remove. Everything is plain torch ops on whatever device the image tensor lives on - no numpy round-trip, so a GPU tensor stays on the GPU. It processes RGB and passes an existing alpha channel through untouched.
The inputs that matter
- cas - Contrast Adaptive Sharpening, the one you'll probably reach for. It sharpens flat regions more and already-sharp edges less, so it avoids crunchy over-sharpening. For anime line art that's the difference between "crisper" and "halos everywhere."
- denoise - an edge-preserving bilateral filter. It smooths flat noise and banding while keeping lines crisp, which is exactly what a blocky flat sky needs. This is a bilateral blur, not a gaussian one - the distinction the whole post-processing layer lives or dies on.
- gamma - a power curve that lifts or crushes mid-tones without moving white. When an image looks "flat," this is usually the right knob; additive brightness flattens contrast and clips highlights fast.
- local_contrast - large-radius clarity. Adds mid-scale depth and volume for the image that reads flat but you can't say why.
- upscale_method / scale_by - a plain resize using ComfyUI's resamplers (lanczos by default). Handy for prepping a hi-res-fix pass, not a substitute for a real upscaler.
Brightness, contrast, saturation and edge_enhance are the blunt instruments - you'll use them occasionally and that's fine.
Where it fits
Post-processing is the deterministic pixel layer: a gamma curve is a gamma curve, and it's a million times cheaper than re-running diffusion to fix color. AdjustImage is a tidy single-node alternative to wiring up a chain of separate ImageFilter nodes (WAS, bvhari, spacepxl). One honest caveat: it's one fixed pipeline, so you can't reorder the stages, and it won't match a palette between two images - for that you still want a dedicated color-match node. For the price (it's free, local, and does nothing until you turn a knob), it's a good default to leave in the graph.
Install
ComfyUI Manager is the easy path: search for ComfyUI-Alchemine-Pack, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/alchemine/comfyui-alchemine-pack
pip install -r requirements.txt
then restart ComfyUI. The pack's only Python dependency is python-dotenv, and AdjustImage needs no model files, no API key, nothing heavy at load time.
Troubleshooting
The most common "problem" is nothing happening - which is the design. Every slider defaults to neutral, so if the output looks unchanged you've probably not moved the one you meant. Note the color sliders default to 1.0 (no change), not 0.0 - and saturation at 0.0 means grayscale, so don't zero it by accident. If you're feeding RGBA, the alpha is passed through untouched rather than adjusted. That's about all there is to go wrong with this one; it's self-contained torch math.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| brightness | FLOAT | 1.000–3 | 1.0 = no change, <1.0 = darker, >1.0 = brighter. |
| contrast | FLOAT | 1.000–3 | 1.0 = no change, <1.0 = less contrast, >1.0 = more contrast. |
| saturation | FLOAT | 1.000–3 | 1.0 = no change, 0.0 = grayscale, >1.0 = more vivid. |
| gamma | FLOAT | 1.000.1–5 | 1.0 = no change, <1.0 = brighter mid-tones, >1.0 = darker mid-tones. |
| edge_enhance | FLOAT | 0.000–1 | Blend factor for edge enhancement. 0.0 = off, 1.0 = full. |
| cas | FLOAT | 0.000–1 | Contrast Adaptive Sharpening. 0.0 = off. Adaptive, avoids crunchy edges. Great for anime. |
| local_contrast | FLOAT | 0.000–2 | Large-radius clarity. 0.0 = off. Adds mid-scale depth/volume. |
| denoise | FLOAT | 0.000–1 | Edge-preserving denoise (bilateral). 0.0 = off. Removes flat noise/banding, keeps lines. |
| upscale_method | COMBO | lanczos | Resampling method used when scale_by != 1.0. |
| scale_by | FLOAT | 1.000.1–8 | Scale factor. 1.0 = no resize, 1.2 = 20% larger, <1.0 = smaller. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |