Frequency Recombine (low + high)
The Add Node ComfyUI Never Had
- low
- high
- image
Frequency separation is the retoucher's oldest trick: split the photo into a smooth low layer (colour and tone) and a signed high layer (texture), fix the blotchy colour on the low layer without touching a single pore, then put them back together. In Photoshop the recombination is a blend mode. In ComfyUI it's been a small disaster, because the high layer contains negative values and every ordinary add or blend node clamps them away. You split the image, edited it, and then discovered you couldn't put it back.
Frequency Recombine (low + high) (JHPixelProFrequencyRecombine) is that missing step. The pack's own changelog says it plainly: "ComfyUI has no non-clamping image add, so the separation could not be put back together before; the old tooltip pointed to a node that did not exist."
The whole mechanism
low + detail × high, in float32, clamped exactly once at the end.
That's it, and the single clamp is the point. Clamp at any intermediate stage and you throw away the negative half of the texture signal - which is precisely what a texture layer is: everything above and below the smooth version of the image.
detail and what it does, concretely:
1.0with unedited layers returns the original exactly. Not approximately. That's your round-trip check.- Above 1.0 boosts texture: pores, hair, fabric.
- Below 1.0 softens.
0.0leaves you with the low layer alone - a soft, texture-free version of the image.
Inputs and outputs
low - the low layer, edited or not. This is the one you paint or smooth on.
high - the texture layer. Connect it directly; don't try to grade or clamp it on the way in, and don't route it through anything that rescales to 0–1.
detail (0–3, default 1).
Out: image.
Hard constraints from the implementation, worth knowing before you debug: both inputs must be RGB with the same height and width, batch sizes must match (or one side must be 1, which broadcasts), and detail outside 0–3 raises an error rather than quietly clamping.
The workflow it enables
The point of frequency separation was always editing the low layer while the high layer sits safely to one side. Now that a graph can do it:
- Frequency Separation splits the portrait.
- Do whatever you do to tone - Gaussian-blur the low layer slightly, or run a smoother, or heal a blotch on it - while the texture layer is untouched.
- Frequency Recombine puts it back with
detailas your skin-texture dial.
Keep the split radius consistent for the whole job. The two layers only match if they came from the same split; changing radius mid-flight means the low and high no longer decompose the same image, and the recombination will have a seam-free but wrong result. And a large detail on a noisy photo boosts the noise along with the pores - step it up in small increments rather than jumping to 2.
It's also the cleanest "add texture back" control in the pack. If you've ever run an edge-preserving smoother over skin and got something that reads slightly airbrushed, this pattern - low-layer edit, then detail 1.1–1.5 on the recombine - is how you get the pores back without undoing the tone work.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/jetthuangai/ComfyUI-JH-PixelPro.git
cd ComfyUI-JH-PixelPro
pip install -r requirements.txt # the Python that runs ComfyUI
ComfyUI Manager: search ComfyUI-JH-PixelPro → Install → restart → Add Node → ComfyUI-JH-PixelPro → filters. Deps: kornia>=0.7, mediapipe>=0.10.33, opencv-python-headless>=4.8, scipy>=1.10; PyTorch from ComfyUI supplies everything heavy. Nothing downloads, nothing optional. It's arithmetic - the cheapest node you'll install.
Where people get burned
- The result looks like a different photo. Some node in between renormalised the high layer. Connect it directly.
- A visible halo around edits. You edited the high layer too (or blurred it). Leave the texture layer alone unless you mean it.
- Mismatched sizes. Any resize between split and recombine breaks the pairing, including something as innocent as a crop node.
- Expecting colour control. Recombine has one knob. Colour work belongs on the low layer, before this node.
Worth saying out loud: almost none of this layer of ComfyUI is AI. A gamma curve is a gamma curve; a texture layer is a texture layer. The reason to understand which primitive does which job is so you don't burn a diffusion pass, and a seed lottery, re-rolling a face because the skin texture is wrong. This node is a two-line arithmetic operation that saves you exactly that.
Pack: Apache-2.0, maintained by JH (@jetthuangai), v1.10.0 with 64 nodes and EN/VI docs. No Reddit presence - a search for the pack name in the corpus turns up one unrelated Chrome extension - so consider this your documentation: detail 1.0 must reproduce the original. If it doesn't, something upstream is clamping.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| low | IMAGE | Low layer (colour and tone), edited or not. | |
| high | IMAGE | High layer (texture). Signed values; connect it directly. | |
| detail | FLOAT | 1.000–3 | How much texture to add back. 1 = original, above 1 boosts pores and fine detail, below 1 softens them. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |