Image Frequency Blend
Keep the steady, take the sharp
- consistent
- sharp
- images
Here's a frustrating ComfyUI situation: you render the same shot twice and both are wrong in different ways. Pass one is steady but soft - the sampler held composition and lost the detail. Pass two is sharp but jittery - it has the texture you want but the structure wobbles or the highlights flicker. You'd love to keep pass one's structure and steal pass two's detail. Image Frequency Blend is built for exactly that: it splits both pictures into low and high frequencies, keeps the low ones from the first, and takes high-frequency detail from whichever has more of it where it counts.
It's from WAS Node Suite (WASasquatch's MIT pack, v3 ships 457 nodes), under WAS Suite/Image/Process.
How frequency thinking works
Any image can be split into a low-frequency layer (broad tonal structure - the shapes, the lighting, the composition) and a high-frequency layer (the fine detail - texture, grain, sharp edges). A blur-and-subtract does the split: blur the image and you've got the low layer; subtract that from the original and what's left is the high layer. This node does the frequency split in a proper way (the order control sets how abrupt the split is, and it can ring at strong edges if you push it hard), then reassembles with a rule.
The rule: low frequencies come entirely from consistent - the steady pass - and so does all the color. High frequencies are taken from whichever picture has more detail at that location, which is why this works when the sharp pass is sharp only in some places: where it's clean, it wins; where it's a mess, the steady pass's detail quietly fills in.
The inputs
consistent- the picture to keep. Its structure and color carry through. This decides the shot's composition and tone.sharp- the picture to steal detail from. Only its luma high frequencies are used, and only where it has more than the first. Must be the same size and hold the same number of frames.cutoff- where low stops and high starts, as a fraction of the picture's own frequency range. Lower keeps more of the first picture; higher hands more of the image over to the second. 0.2 is a sane start.order- how abrupt the split is. 1 is a gentle roll-off; high values approach a hard cut and can ring around strong edges.strength- how much of the blended detail to add back. 0 returns the first picture blurred to the cutoff; 1 is the intended amount; above 1 exaggerates detail.border- pixels around the edge left as the first picture. Frequency transforms ring slightly at their boundaries, and this hides it.
Where it earns its keep
The headline use is exactly the setup above: a temporal-consistency trick from video work, where one pass is denoised/stable and another is sharper but noisy - blend them and you get stability and detail. It also does the "detail rescue" job: take the color and structure from a clean but soft render and graft detail from an over-sharpened or second-seed version.
It's a deterministic pixel op, no sampling, so it's cheap to run and easy to A/B - dial strength and watch whether the detail lands without bringing back the wobble.
Install and notes
WAS Node Suite via ComfyUI Manager (search "WAS Node Suite v3") or git clone https://github.com/WASasquatch/was-node-suite-comfyui into ComfyUI/custom_nodes, then restart. Needs ComfyUI 0.14.0+ and Python 3.10+, and v3 installs no Python packages - the filtering runs on torch, no OpenCV or scipy. (v2 of this suite was infamous for exactly those dependency collisions.)
The trap to respect: both inputs must already be the same size with the same frame count - this node blends frequencies, it doesn't register or resize. And keep order moderate and border nonzero when the two passes differ slightly, or the seam where they disagree can ring. If one image is simply blurrier than the other at full frame, a plain sharpen or an unsharp-mask node is the simpler tool; this one is for when the two passes are each right somewhere.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| consistent | IMAGE | The picture to keep. Its low frequencies and all of its colour are carried through, so this is the one that decides structure and tone. | |
| sharp | IMAGE | The picture to take detail from. Only its luma high frequencies are used, and only where it has more of them than the first picture. Must be the same size and hold the same number of frames. | |
| cutoff | FLOAT | 0.200.01–0.49 | Where low stops and high starts, as a fraction of the picture's own frequency range rather than in pixels. Lower keeps more of the first picture; higher hands more of the image over to the second. |
| order | INT | 21–8 | How abruptly the split happens. 1 is a gentle roll-off, high values approach a hard cut and can ring around strong edges. |
| strength | FLOAT | 1.000–3 | How much of the blended detail to add back. 0 returns the first picture blurred to the cutoff, 1 is the intended amount, and above 1 exaggerates. |
| border | INT | 20–64 | Pixels around the edge left as the first picture. A transform of a whole frame rings slightly at its boundary, and this hides it. 0 blends right to the edge. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | The first picture's structure carrying the second one's detail. |