Nodes/DOGMA Nodes/DOGMA Global Low-Frequency Lock FAST v24
ComfyUI Node

DOGMA Global Low-Frequency Lock FAST v24

DOGMA Global Low-Frequency Lock FAST v24

By axior·Created 4 months ago·Updated 3 days ago· 1
DOGMA Global Low-Frequency Lock FAST v24
  • generated
  • source
  • image
  • info
strength0.92
proxy_divisor32

Every tiled pipeline ends the same way: the tiles come back sharper, and the whole frame has quietly drifted. Faded haze goes missing, the exposure creeps, the colour shifts a few degrees toward whatever the model likes. This node is the post-combine correction for exactly that - and it takes the one approach that doesn't undo your work.

It restores the old image's colour and exposure at very low spatial frequency, and touches nothing else.

What it is

You finish a divide-and-conquer run - crop, re-render, stitch - and the result is a single master image. That master is your detail. What it isn't is necessarily the same photograph you started with, tonally. Models used for restoration are very good at making things look like they were shot yesterday; they are not good at preserving the specific wash of haze, the slightly crushed blacks and the odd colour cast that make an archival frame look like itself.

The usual fix is a colour match against the source, which is a blunt instrument - it re-grades the whole image including the new detail. The other usual fix is a straight copy of the source's colour channel at low resolution, which is the same idea but the naive version: it rewrites the base layer the new detail sits on.

This is that idea done carefully.

How it works

The implementation is short and worth understanding, because it's a genuinely clean piece of tiling-adjacent engineering.

Both generated and source are downsampled to a proxy - proxy_divisor 32 by default, so an 8K frame becomes a 256-ish pixel-wide version, floored at 64px on the short side - using area interpolation, which averages rather than samples. At that size, all that survives is the low-frequency content: overall colour, exposure, haze, vignetting. delta is source_proxy - generated_proxy. That delta is then bilinearly upsampled back to full resolution and added to the generated image, scaled by strength.

The consequence is the whole point, and the class docstring states it: the node "never blends source high-frequency pixels back into the generated master." Sharpening, texture, grain, repaired geometry - all of it survives, because at 1/32 scale it was averaged into nothing and never entered the correction. What you get back is the source's tonal character laid under your model's detail.

strength at the 0.92 default is almost a full tonal lock; dropping toward 0.5 lets the generated image keep more of its own colour, which is what you want if the Klein pass legitimately improved the grade.

Inputs and outputs

Two inputs, both IMAGE. generated is your stitched master; source is the original reference frame. The node handles a size mismatch by resampling the source, and handles a batch-count mismatch by reusing the first source frame, so wiring an upscaled result against the original is safe.

Two numbers. strength (0–1, default 0.92) is how much of the low-frequency correction is applied. proxy_divisor (8–96, default 32) sets the proxy scale, and it's the dial that decides what counts as "low frequency" - 8 keeps much more structure and starts being a real colour grade; 96 is barely more than a global exposure match.

Two outputs: image (IMAGE) and info (STRING), where info reports the proxy size it used, the strength, and the reminder that high-frequency detail was preserved. image is the final master in most v24-era graphs, so it typically goes to a save or preview node.

Order matters, and it's easy to get wrong: this runs after the combine, on the whole frame. Run it per-tile and you'll lock every tile to a different local average, which is how you manufacture visible tile boundaries in an otherwise fine result. That failure - tiles diverging from the source and from each other - is the classic tiled-upscale trap, and it's usually prevented with a tile ControlNet condition; here it's prevented by correcting once, at the end, on the assembled image.

Install

ComfyUI Manager → search DOGMA Nodes (publisher axior), restart, done. Manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/axior/ComfyUI-DOGMA-Nodes
# restart ComfyUI

Pure torch, no pip installs (requirements.txt is a one-line "no external dependencies" note), no bundled weights.

Common issues

Over-correction is the one to watch for. At the default 0.92, a source frame with a strong colour cast will drag the generated result back toward that cast - and if your whole reason for the pass was to heal a faded frame, you'll undo it. Drop strength to 0.5–0.7 on deliberately faded sources and compare.

The second thing is resolution assumptions. proxy_divisor is a ratio, not a pixel count, so the same setting means different things on a 2K master and an 8K master. If you tuned it at 2048 and the result changed character after you moved to native-HD chunks, that's why: at 8K and divisor 32 you've got a much finer proxy than at 2K, and it's now capturing structure you didn't intend to copy.

If your master has genuine local drift - one region's colour off from the rest, not the whole frame - this node cannot help, because it corrects globally by construction. That's what the detail-donor and blend nodes are for.

CategoryDOGMA/Semantic Detailer

Inputs (4)

NameTypeDefaultDescription
generatedIMAGE
sourceIMAGE
strengthFLOAT0.920–1
proxy_divisorINT328–96

Outputs (2)

NameTypeDescription
imageIMAGE
infoSTRING