๐ Ripple
Water, heat-haze, and wavy distortions on demand
- image
- IMAGE
Drop a stone in a pond, the water waves out in rings; that's the look this node fakes on any image. It's a radial sine-wave distortion - pixels get displaced outward in concentric ripples from a center point, exactly the kind of warp that signals "this photo was taken through water or heat." If you've ever wanted a reflection shot to look like the surface is moving, or wanted a portrait to melt like a music video, this is the ComfyUI shortcut.
It's part of orion4d's Image Effects pack, one of the five Deformation nodes alongside Pinch, Spherize, Fisheye, and Barrel Distortion. Of those, Ripple is the one with the most personality: it's less "lens correction," more "psychic disturbance." It's also a gateway into how all the deformation nodes in this pack work - same technique, different wave function.
The mechanism
Under the hood it's OpenCV remap: for every pixel, the node measures the distance from center_x/center_y, feeds it through a sine or cosine, and shifts the pixel along the radial direction by that value. amplitude is how far pixels travel (how wavy it gets), frequency is how tightly packed the ripples are, and phase slides the wave pattern around. There's a decay option that fades the ripple out with distance - that's the difference between "pond with a stone dropped in the middle" (high decay) and "the whole image is underwater" (zero decay).
The inputs you'll actually touch:
- amplitude (default 20, 0โ100) - the strength of the wobble. Under 10 is subtle; past 60 it stops reading as water and starts reading as bad LSD.
- frequency (default 0.02) - ripple density. Small values = big, slow waves; larger = fine corrugation.
- wave_type -
sine,cosine, orboth. Sine and cosine start at different points of the wave, so switching them changes which way the first ripple travels.bothaverages the two for a softer look. - center_x / center_y - where the ripples originate. Default dead-center.
- phase (0โ6.28) - shift the wave. Great for matching a ripple to something already moving in a composited frame.
- decay - how quickly ripples die off with distance. The one control that separates "looks like water" from "looks like a kaleidoscope is leaking."
Output is a single IMAGE.
Honest advice
Because it's a radial displacement from a center point, a lot of the frame's content gets pushed toward or away from that point - which means the edges of the image can get pulled into empty space. The node reflects borders to fill the gaps, so you get mirrored streaks at the frame edges instead of black holes. If that bugs you (it will, on clean skies), crop in slightly before rippling. And two pack-wide caveats apply: it's CPU-only and builds its coordinate map with a per-pixel Python loop, so a full-res pass takes a visible moment; and it only processes the first frame of a batch, so don't point it at an animation and expect every frame to warp.
Install
ComfyUI Manager: search ComfyUI-Image-Effects. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/orion4d/ComfyUI-Image-Effects.git
cd ComfyUI-Image-Effects
pip install -r requirements.txt
Restart, then right-click โ Add Node โ Image Effects โ Ripple. No models or downloads - this is CPU numpy/OpenCV math. If the full requirements.txt trips over its optional extras (the cupy-cuda11x line isn't used by any node code here), numpy opencv-python scipy Pillow covers what these actually need.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | โ | |
| amplitude | FLOAT | 200โ100 | โ |
| frequency | FLOAT | 0.0200.001โ0.1 | โ |
| wave_type | COMBO | sine | 3 options: sine, cosine, both |
| center_xopt | FLOAT | 0.500โ1 | โ |
| center_yopt | FLOAT | 0.500โ1 | โ |
| phaseopt | FLOAT | 0.00โ6.28 | โ |
| decayopt | FLOAT | 0.000โ1 | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | โ |