Wavelet Graphic EQ (4-band)
It's Just Four Multiplications — and That's Exactly Why It's Useful
- band1
- band2
- band3
- band4
- band1
- band2
- band3
- band4
The Wavelet Graphic EQ (4-band) is a node whose entire job is band * gain, four times over. Don't let that underwhelm you. Slid between this pack's Wavelet Decompose and Wavelet Reconstruct, those four sliders become the fastest way to hear what each wavelet subband actually contributes to an image - and the best way to finally understand what LL, LH, HL and HH mean with your own eyes.
It's the wavelet-domain cousin of the author's FFTGraphicEqualizer in comfyui-fft-2d. Where the FFT version carves gain bands out of one frequency image with radius masks, this one gives each band its own socket, so the bands aren't tied to any particular naming - band1..band4 is enough, and each is scaled independently of the others' shapes.
How it works
The mechanism is genuinely just multiplication. Each input band is multiplied by its gain, nothing more, nothing less. Because the pack runs on the SIGNED_IMAGE convention (zero-centered, nominally -1.0..+1.0, never clamped mid-pipeline), those gains multiply signed coefficients - which is what makes the node interesting. Crank gain_band1 to 3 and the band doesn't just brighten, it overflows the display range on purpose. The author trusts you; clamping happens only at the very end, in the companion pack's To Unsigned Image.
There's one behavior that trips people up because it differs from the other nodes in this pack: an unconnected band passes straight through as an unconnected output. No zero-filling. Wavelet Layout and Reconstruct treat a missing input as "all zeros" - this node can't, because there's no other band's shape to borrow. The practical consequence is mild (if you leave a band unconnected here, Reconstruct will zero-fill it on its side anyway), but worth knowing when you're debugging why a "missing" band silently vanished.
The inputs and outputs that matter
gain_band1…gain_band4- the sliders. Range0.0to3.0, step0.1, default1.0(identity). Below 1 you're attenuating, 0 kills the band entirely, above 1 you're boosting.band1…band4- optionalSIGNED_IMAGEinputs. Wire these from Wavelet Decompose, which outputs subbands in the order HH, HL, LH, LL top-to-bottom.- Outputs
band1…band4-SIGNED_IMAGE, meant to feed Wavelet Reconstruct's HH/HL/LH/LL inputs.
The classic experiment: set the band holding LL to 0 and keep the three detail bands, reconstruct, and you've built an edge/high-pass extractor - the wavelet equivalent of the unsharp-mask difference in the KB's post-processing notes, but operating on frequency bands instead of a blur radius. Leave only LL and you get the smoothed approximation. That's the whole "graphic EQ" fantasy: isolating, muting, and boosting frequency content the way you'd mix a track.
How to install it
Through ComfyUI Manager, search "comfyui-wavelet-2d" (display title "ComfyUI-Wavelet-2D") and hit install. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/NobutakaKuroki/comfyui-wavelet-2d
cd comfyui-wavelet-2d
pip install -r requirements.txt
That requirements.txt is exactly one line: PyWavelets. No model files, no API keys. The catch - and it's the big one - is that this pack cannot run alone. Its sockets are the SIGNED_IMAGE type, which is defined by the companion pack comfyui-signed-image, and that dependency is not installed automatically. Install it alongside, or you'll get missing-type errors the moment you load a workflow. Restart ComfyUI after.
Common issues
- "Can't connect: type mismatch" / missing SIGNED_IMAGE - the signed-image companion pack isn't installed. That's the number-one failure for this entire pack, and it isn't obvious from the error.
- Reconstruct errors about subband shapes - because the EQ's bands are independent, if you feed them from different Decompose nodes (different wavelets, different image sizes), the downstream Reconstruct will hard-fail on mismatched shapes. Keep all four bands from one Decompose at one level.
- Image looks washed or clipped after reconstruct - you're feeding a
SIGNED_IMAGEto a plain 0..1 preview. Route throughTo Unsigned Image(orPreview Signed Image) from the companion pack.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| gain_band1 | FLOAT | 1.00–3 | — |
| gain_band2 | FLOAT | 1.00–3 | — |
| gain_band3 | FLOAT | 1.00–3 | — |
| gain_band4 | FLOAT | 1.00–3 | — |
| band1opt | SIGNED_IMAGE | — | |
| band2opt | SIGNED_IMAGE | — | |
| band3opt | SIGNED_IMAGE | — | |
| band4opt | SIGNED_IMAGE | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| band1 | SIGNED_IMAGE | — |
| band2 | SIGNED_IMAGE | — |
| band3 | SIGNED_IMAGE | — |
| band4 | SIGNED_IMAGE | — |