Motion Blending
Make a batch of frames feel like motion, without any motion vectors
- images
- IMAGE
MotionBlending is the node that fakes the look of motion in a still, or adds temporal smear to a sequence of frames - the "something moved and the camera kept the shutter open" effect. It's from the image-effects shelf of DJZ-Nodes, and if your workflow produces a batch of frames you want to feel less like a slideshow and more like footage, this is the cheap, fast way to get there.
There's an important honesty note up front: this is simulated motion. It builds a directional blur kernel and smears frames with it; it is not optical-flow motion blur, and it doesn't analyze where things actually moved. For stylized smear, action-line drama, or that slightly dreamy "long exposure" vibe, that's exactly what you want. If you need physically-correct motion blur on a moving subject, you're looking at a flow-based tool, not this.
How it works
Two modes, two styles, and they combine:
- mode = Motion Blur - blurs each frame with a directional kernel. Simulated Shutter builds a line-shaped kernel at your
angleand runs it through OpenCV'sfilter2D; theintensitystretches the blur length. Temporal Blend instead smears copies of the frame horizontally withnp.roll, fading each copy bydecay_factor- closer to what a slow shutter on a fast pan looks like. - mode = Frame Blending - the smear direction. With Simulated Shutter it chains the motion blur then the temporal blend; with Temporal Blend it just blends harder. Pick this when you're feeding it actual consecutive frames and want them to run together.
So the two controls that shape everything: angle (degrees, −180 to 180 - where the motion points) and kernel_size (3–99, how fat the smear is). Then frames_to_blend (2–10) and decay_factor (0–1) govern how many ghosts stack up and how fast they fade.
The inputs that matter
- mode - Motion Blur (per-frame smear) vs Frame Blending (motion feel across a sequence).
- style - Simulated Shutter vs Temporal Blend, as above.
- angle - direction of the blur. 0 is horizontal, 90 is vertical. This is the one beginners forget, and the effect looks wrong until you set it.
- kernel_size - 15 is a decent starting blur; go higher for drama.
- intensity - overall strength, 0–1.
- frames_to_blend / decay_factor - the "how many ghosts / how fast they fade" pair.
Output: a single IMAGE the same size as your input batch, ready for a VHS effect, a Save node, or straight into video encoding.
Installing it
It's a DJZ-Nodes pack node (the MushroomFleet pack by Drift Johnson). ComfyUI Manager → Install Custom Nodes → search DJZ-Nodes → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt
It needs OpenCV (opencv-python), which is in the pack's requirements - the standard install handles it. If you ever see an import error around cv2, that's the dependency that didn't finish.
Common issues
The classic mistake is leaving angle at 0 and wondering why everything looks like a horizontal smear regardless of the actual motion. Set the angle to match your content and it reads immediately. Also keep intensity modest: combined with a big kernel_size, high intensity turns frames into a gray streak. And a fair warning about the temporal blend: because it rolls pixels horizontally, it can warp text and hard edges - fine for abstract/glitch vibes, wrong for footage with readable signage. Test on a few frames before committing to a long batch.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| mode | COMBO | 2 options: Motion Blur, Frame Blending | |
| style | COMBO | 2 options: Simulated Shutter, Temporal Blend | |
| intensity | FLOAT | 0.500–1 | — |
| angle | FLOAT | 0-180–180 | — |
| kernel_size | INT | 153–99 | — |
| frames_to_blend | INT | 22–10 | — |
| decay_factor | FLOAT | 0.500–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |