Frequency Separation
The Retoucher's Secret Weapon, Now a Node
- image
- low_frequency
- high_frequency
- preview_split
Frequency separation is the technique portrait retouchers use to smooth skin without erasing pores, and texture artists use to fix lighting without killing detail. The idea is brutally simple: split an image into a low-frequency band (color, lighting, broad shading) and a high-frequency band (texture, grain, edges), work on whichever one you care about, then put them back together. FrequencySeparation is the split half of that in TextureAlchemy - and the pack throws in a preview_split output so you can actually see what you're separating.
This is one of the genuinely useful detail nodes in amtarr/ComfyUI-TextureAlchemy. If you've ever tried to recolor a brick wall or remove a shadow from an albedo map and watched the texture smudge along with it, this is the fix: recolor the low band, leave the high band alone, recombine.
How it works
The low-frequency image is just a blur of the input - method picks the blur type (gaussian, median, or bilateral), and radius controls the filter size. The high-frequency band is the original minus the low band: everything the blur removed, in other words the fine detail. Add low + high back together and you get the original (which is exactly what the pack's FrequencyRecombine node does).
The math is simple enough that it runs instantly on the GPU - there's no model, no download, just a couple of convolutions.
The inputs that matter
radius(1–100, default 10) - the low-pass filter size. Small radius = a "wider" high band (more stuff counts as detail); large radius = a high band that only holds the finest grain. For a 1024px texture, 5–15 is a sensible starting range.method- gaussian is the usual choice. bilateral keeps edges alive in the low band, which matters if you're blurring something with hard creases you don't want to lose.- Outputs are
low_frequency,high_frequency, andpreview_split(a side-by-side you can send to Preview Image to sanity-check the split).
What to wire it into
The natural partner is FrequencyRecombine (same pack, same Detail category): it takes the two bands plus high_freq_strength and low_freq_strength and rebuilds the image with an adjustable balance. That combo is a poor-man's local-contrast control - boost the high band a bit and your texture pops without the halos that naive sharpening gives you.
You can also break the chain deliberately: blur the low band to soften lighting on an albedo, run it through a color node like ColorMatchTransfer, then recombine. That's the retoucher move, and it's far less destructive than filtering the whole image.
Installing it
It ships inside TextureAlchemy, so install the pack once:
cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy
then restart ComfyUI. Or grab it via ComfyUI Manager by searching "Texture Alchemy". No extra dependencies - it leans on ComfyUI's built-in torch/PIL/NumPy. You'll find the node under Texture Alchemist → Detail.
Gotchas
The preview_split output is the thing beginners skip, and it's the thing that saves you - the split only means something once you can see what landed in each band. Also, mind the radius when you change resolution: a radius that's perfect on a 512px tile will grab way too much detail on a 2K one. If your high band looks like a whole gray image rather than fine grain, bump radius up.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| radius | FLOAT | 10.01–100 | Separation radius (low-pass filter size) |
| method | COMBO | 3 options: gaussian, median, bilateral |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| low_frequency | IMAGE | — |
| high_frequency | IMAGE | — |
| preview_split | IMAGE | — |