Spectral Phase Blend
Morph spatial structure between two images, with a warning label on the box
- image_a
- image_b
- image
If SpectralMagnitudeBlend borrows texture, SpectralPhaseBlend borrows geometry. In an FFT, the phase is what encodes where things are - edges, shapes, the spatial layout of the whole image. So blending the phase of two images morphs their spatial structure, while the magnitude (the texture character) is always taken from image A. The README puts it plainly: blending phases morphs the spatial geometry of the image while its spectral character is preserved.
This is the pack's most dramatic node, and it comes with the loudest warning. Phase blending is perceptually strong even at very small values. The default blend is 0.05, and the tooltip says it twice: start at 0.05 and increase carefully. A 5% phase blend is already a visible structural change - this is not a subtle texture tweak.
How it works
The technically interesting bit is that phase can't just be linearly interpolated like a float. Phase angles wrap around ±π, so lerp(phi_a, phi_b) would take the long way around the circle and smear things. The node does it correctly via circular interpolation on the complex unit circle:
angle( lerp( exp(i*phi_a), exp(i*phi_b), blend ) )
The frequency_band control gives you fine control over which spatial scale gets morphed, with the tooltip's framing worth quoting: low → morph large shapes / global structure; mid → morph medium textures and object edges; high → morph fine-detail micro-texture only. So you could blend only the low-frequency phase to warp the overall composition while keeping A's fine detail intact.
The inputs that matter
image_a- primary image; magnitude is always taken from here.image_b- structure donor; phase is blended from here.blend(default 0.05!) - 0 = A's phase entirely, 1 = B's entirely. Start at 0.05.frequency_band(defaultall) - which spatial scale to morph.lowis the mildest in perceptual terms if you want a global nudge.
One image output.
Installing it
Part of ComfyUI-Spectral-Preprocessing-Nodes - one install, all sixteen nodes under Spectral Preprocessing. ComfyUI Manager (search "ComfyUI-Spectral-Preprocessing-Nodes"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/EdoardoGuerriero/ComfyUI-Spectral-Preprocessing-Nodes
Restart. Dependencies are numpy and scipy, both bundled. Nothing to download.
Where people get burned
Burning happens by turning the dial and watching a face melt. At blend 0.1+ on the full band, B's structure starts dominating and the output can look like a bad morph - because that's literally what it is. The honest use cases are narrow: blending low band phase for a subtle compositional nudge, or high band for micro-structure influence while keeping the subject intact. If your goal is "make the AI image feel more natural without changing its content," you almost certainly want SpectralMagnitudeBlend, not this node. Reach for phase blending when you specifically want to move structure - and treat every step of 0.05 as a real change, because it is.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image_a | IMAGE | Primary image — magnitude is always taken from here. | |
| image_b | IMAGE | Structure donor — phase is blended from here. | |
| blend | FLOAT | 0.0500–1 | 0 = keep A's phase entirely, 1 = use B's phase entirely. Start at 0.05 and increase carefully — phase blending is perceptually strong even at low values. |
| frequency_band | COMBO | all | 'low' → morph large shapes / global structure. 'mid' → morph medium textures and object edges. 'high' → morph fine-detail micro-texture only. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |