PerlinNoise Coordinate Randomizer
Organic jitter for motion tracks that look stitched
- images_for_marker
- noise_mask
- randomized_results
- image_with_results
CoTracker gives you motion that's faithful to the reference. This node gives you motion that's alive. If your track-driven video looks too mechanical - points sliding around like they're glued to rails - PerlinCoordinateRandomizerNode layers smooth, organic noise on top of your tracking data, so nearby points drift together the way cloth or hair actually does instead of twitching independently.
Perlin noise is the same trick games use for terrain and clouds: gradient noise that's continuous in space and time. This pack implements it in plain Python - permutation table, fades, interpolation, the classic algorithm - and samples a 3D version at each point, each frame. Because nearby points sample nearby noise, they move coherently; because time is one of the noise axes, movement is smooth frame-to-frame rather than random flicker. The README frames it as adding "natural, smooth variations to tracking points," and that's exactly the use case: take a CoTracker output, add flutter, get motion that reads as physics.
It's the pack's most tunable node, and the sliders all do what the tooltips say. spatial_scale (in pixels) sets how far apart two points have to be before they stop moving in sync - larger means smooth and coherent, smaller means chaotic and erratic. time_scale (in frames) sets how slowly the noise evolves - larger means slow drift, smaller means fast jitter. intensity is the displacement in pixels, so start small. octaves layers in detail - 3 is a good default, and cranking toward 10 gets you busy, nervous motion fast. seed makes it reproducible, noise_mask restricts the randomization to a masked region (how you keep a face still while hair moves), and enabled lets you bypass the node without rewiring the graph.
Input tracking_results takes the STRING from CoTrackerNode, GridPointGeneratorNode, or even the XY amplifier. Outputs mirror the parent node: randomized_results (STRING, same format, straight into ATI Tracks) and image_with_results (the clip with red markers) if you pass images_for_marker, so you can eyeball the displacement before committing to a render.
One honest caution: the default intensity of 100 pixels is a lot. On a 480p clip that's a big chunk of the frame, and it will happily drag points onto the wrong object if you're not watching. The demo videos in the pack look great because they were tuned. Start around 10–20 and work up.
Install is the shared pack story: ComfyUI Manager → "Comfyui CoTracker Node", or clone the repo and restart. No model, no weights - the Perlin generator is pure numpy, so it runs anywhere, offline, instantly. It's the node you reach for when tracking alone feels stiff.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| tracking_results | STRING | — | |
| images_for_markeropt | IMAGE | — | |
| noise_maskopt | MASK | Mask for randomize | |
| spatial_scaleopt | INT | 10001–9999 | spatial_scale (pixels) / Larger → Smooth, coherent movement (nearby points move similarly) / Smaller → Chaotic, erratic movement (neighboring points move randomly) |
| time_scaleopt | INT | 601–1000 | time_scale (frames) / Larger → Slow movement / Smaller → Fast movement |
| intensityopt | INT | 1001–1000 | intensity (pixels) / Larger → Big displacement / Smaller → Small displacement |
| octavesopt | INT | 31–10 | octaves (layers) / Larger → Complex, detailed movement / Smaller → Simple, basic movement |
| seedopt | INT | 00–4294967295 | — |
| enabledopt | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| randomized_results | STRING | — |
| image_with_results | IMAGE | — |