Latent Adjustment π¦
Brightness, contrast, saturation β applied while the image is still latent
- latents
- latents
- previews
Latent Adjustment is the pack's answer to "I wish I could just nudge the exposure" - but it does the nudging in latent space, before or between sampling passes, instead of on the finished pixels. You feed it a LATENT and it comes out the other side with its brightness, contrast, saturation, and exposure changed, plus optional sharpening and high-pass filtering. It's the node you reach for when a generation is consistently too dark or too flat and you'd rather fix the latent than fight the prompt.
The key thing to understand is why latent-space adjustments are worth having. A VAE encode-decode cycle is lossy - round-tripping a latent through pixels and back throws away fine detail. When you're chaining img2img or doing a multi-pass workflow, adjusting in latent space means you never pay that round trip. You're also working on the actual thing the model will denoise next, which is a more direct way to steer a result than adjusting a rendered image you've already committed to.
How it works
The math comes from PPFNLatentAdjustment in the pack's nodes.py. Each of the R, G, B channels of the latent is scaled around the 0.5 midpoint by contrast, shifted by brightness, then desaturated toward a luminance-weighted grey by saturation, and finally scaled by 2^exposure. If alpha_sharpen is above 0, a sharpen pass runs on the latent; if high_pass_radius is above 0, a high-pass filter with high_pass_strength is applied. clamp_min/clamp_max then normalize the output range so the result stays where the model expects values to be.
Inputs that matter
brightness,contrast,saturation,exposure- the four you'll actually use. All default to neutral (1 for the first three, 0 for exposure) so the node is a no-op until you move something.alpha_sharpen- latent sharpening strength. A touch can recover definition in soft img2img passes; too much and you'll get crunchy artifacts.high_pass_radius/high_pass_strength- high-pass filtering. Radius 0 means off. This is the "make the texture pop" control, and it's a genuine rarity - few other packs expose high-pass in latent space.clamp_min/clamp_max- output range guardrails. Leave at 0/1 unless you know why you're changing them.latent2rgb_preview- only affects the preview output; the actual latent is untouched by it. The README notes the RGB representation isn't very accurate, so trust it as a hint, not a truth.
Outputs: latents (the adjusted result) and previews (an IMAGE you can eyeball).
Where it fits
Two natural homes. First, right after a noise generator: darken or brighten your starting noise to bias the generation's overall exposure before the sampler ever runs. Second, between sampling passes: sharpen a latent or lift its contrast before a second, low-denoise pass, instead of decoding, adjusting pixels, and re-encoding with the loss that implies.
Install
It's a Power Noise Suite node, so the whole pack comes in one install. ComfyUI Manager β search "Power Noise Suite", or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/PowerNoiseSuite
Restart. No model files; torch is the only dependency.
Gotchas
Remember this works on raw latent values, not image values - the relationship between a latent value and what you eventually see is indirect, so adjustments here are coarser than the same slider on a rendered image. The pack's own preview tooltip warns the RGB preview isn't accurate for the same reason. And go easy on alpha_sharpen and the high-pass: they amplify whatever is in the latent, including noise, so aggressive settings give you artifacts that a pixel-space sharpen never would.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| latents | LATENT | β | |
| brightness | FLOAT | 1.000-1β2 | β |
| contrast | FLOAT | 1.000-1β2 | β |
| saturation | FLOAT | 1.0000β2 | β |
| exposure | FLOAT | 0.000-1β2 | β |
| alpha_sharpen | FLOAT | 0.000β10 | β |
| high_pass_radius | FLOAT | 0.000β1024 | β |
| high_pass_strength | FLOAT | 1.000β2 | β |
| clamp_min | FLOAT | 0.00-10β10 | β |
| clamp_max | FLOAT | 1.00-10β10 | β |
| latent2rgb_previewopt | COMBO | 2 options: false, true |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latents | LATENT | β |
| previews | IMAGE | β |