Frequency Separation HSV Node
Split color from detail so relighting stops wrecking your image
- image
- high_freq
- low_freq
If you've ever run an IC-Light relight and gotten back a subject whose skin tones went orange and muddy, you've felt the exact problem this node exists to solve. Relighting models are great at moving light around and genuinely bad at leaving your color and fine detail alone. The standard fix - one that predates diffusion entirely, straight out of retouching - is to separate the image into a low-frequency layer (color and lighting) and a high-frequency layer (texture and detail), fix the color on the low layer, and put the detail back. That's frequency separation, and this node is the version that works on the V channel of HSV instead of plain RGB.
The pack is a one-person project by Andrea Baioni (u/not5 on Reddit), a fashion photographer who built it specifically for an IC-Light "preserve colors and details" workflow he shared. He's the first to tell you the code is rough - the README opens with "probably badly coded" - but the idea is sound, and it's the fix people reach for when IC-Light shifts skin tones under new lighting, a known V1 failure mode.
Why HSV instead of plain RGB
The classic RGB version blurs the image and subtracts it, and that smears color into the detail layer: you get halos and color fringing around edges. The HSV version sidesteps that by splitting only the V channel. Hue and saturation stay on the low-frequency layer untouched, so the low layer carries the true color of the image and the high layer carries pure detail with no color bleed. Exactly what you want when the whole point is to change lighting without wrecking the color underneath.
How it works
Feed in an image and a blur radius and the node does the rest: it converts RGB to HSV, splits H, S, V, Gaussian-blurs V, then computes:
- high_freq = V − blurred V + 0.5, clipped to [0,1] - mid-gray 0.5 means "no detail", stacked into a grayscale-looking three-channel image.
- low_freq = the original H and S with the blurred V put back, converted to RGB - a color-true, smoothed version of your image.
Two inputs and they're both worth touching:
image- any RGB image. It must have exactly three channels; the node raises a ValueError on anything else, so no RGBA or single-channel input.blur_radius- a slider from 1 to 15, default 3. This is the "what counts as detail" dial. Higher values smooth more and push more into the low layer. Even values get silently rounded up to odd.
Both outputs - high_freq and low_freq - wire into the pack's FrequencyCombinationHSV node. In the IC-Light workflow you split both the original and the relit image, color-match or average their low layers, optionally blend the high layers, and recombine.
Install
The README's official path is a plain clone:
cd ComfyUI/custom_nodes
git clone https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV
Then restart ComfyUI. There's no requirements.txt and no model to download - the only real dependency is OpenCV (cv2), which ComfyUI already ships. You can try ComfyUI Manager's search for "FrequencySeparation" if you like, but this is a small pack that may not surface in the registry; the clone is the reliable route.
Where people get burned
- Oversharpening at high blur radii. The author himself flags this: crank
blur_radiustoward 9+ and the recombined result gets crunchy, because the recombine step re-applies the detail layer harder than it should. Default 3 is safe; treat the top of the slider as the danger zone. - It's not a lossless round trip. Split then recombine with zero edits and you won't get your exact pixels back - the detail term comes back at roughly double strength. Same root cause as the oversharpening, and a common "why is this different from my source" moment.
- The console spams. Every image in the batch gets a "Processing image 1/batch" print. Harmless, but it'll fill your terminal.
- Grayscale high layer is by design. Don't expect color detail in
high_freq; that's what makes the method color-safe.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| blur_radius | INT | 31–15 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| high_freq | IMAGE | — |
| low_freq | IMAGE | — |