ComfyUI Node

Spectral Phase Blend

Morph spatial structure between two images, with a warning label on the box

By EdoardoGuerriero·Created 2 months ago·Updated 2 months ago· 0
Spectral Phase Blend
  • image_a
  • image_b
  • image
blend0.050
frequency_bandall

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 (default all) - which spatial scale to morph. low is 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.

CategorySpectral Preprocessing

Inputs (4)

NameTypeDefaultDescription
image_aIMAGEPrimary image — magnitude is always taken from here.
image_bIMAGEStructure donor — phase is blended from here.
blendFLOAT0.0500–10 = 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_bandCOMBOall'low' → morph large shapes / global structure. 'mid' → morph medium textures and object edges. 'high' → morph fine-detail micro-texture only.

Outputs (1)

NameTypeDescription
imageIMAGE