VHS Effect v1
The OG VHS degradation node — tape hiss, waves, and a black edge
- images
- IMAGE
You want a video that looks like it spent twenty years in a basement next to a VCR. That's this node. VHS_Effect_v1 is DJZ-Nodes' first-generation VHS simulation, and while the pack has since shipped v2 and v3 with fancier signal-chain math, v1 is still the one people search for - partly because it's simple, partly because it nails the fundamentals with a handful of sliders.
What it does under the hood
Feed it an IMAGE batch and it processes each frame by splitting into luma (brightness) and chroma (color), in YCrCb space. The trick is that it treats the two like a real composite tape signal:
- Luma compression - squashes the frame horizontally, adds Gaussian noise, and rescales it back, recreating that blocky, soft brightness channel.
- Chroma compression - the same squeeze/noise/restore cycle but on color, which gives you the bleeding, undersampled color you remember from VHS.
- Wave distortion - a sine-wave horizontal wobble per row, plus a random "switch noise" that jolts rows out of place, like a tracking problem.
- A black line is cut down the right edge at
border_sizepercent of width - that signature tape-edge artifact.
The catch is that none of this is seeded, so the noise regenerates every run. If you need a repeatable shot, batch it and freeze the result, because there's no seed input here (that's a V2-era fix).
The inputs that matter
Ten sliders, but you'll live in a handful:
- luma_noise_sigma / luma_noise_mean - the grainy static in the brightness channel. Default sigma 30 is already visible; push toward 60+ for heavy snow.
- chroma_noise_intensity - random RGB channel dithering. This is what makes colors look like a degraded copy.
- luma_compression_rate / chroma_compression_rate - how hard the horizontal squeeze is. 1.0 is no compression; higher values eat more horizontal resolution.
- vertical_blur / horizontal_blur - the final softness, which sells the whole effect.
- generations - how many passes of the compression pipeline to run. More passes = more degraded. Default 3 is a good middle ground; 1 is nearly clean, 10 is mush.
- border_size - the width of that black tape edge.
Output is a single IMAGE tensor at the same resolution, ready for any encoder or save node.
Installing
It's one node in the big DJZ-Nodes pack from Drift Johnson. Install the pack once and you get all of its effects:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt
Or just search "DJZ-Nodes" in ComfyUI Manager. The VHS nodes need opencv-python, which is in the pack's requirements.
Honest advice
Between the three VHS generations, v1 is the "no thinking required" one - you get classic tape artifacts from two or three sliders. v2 is more realistic (real filter-based ringing and tape-speed models) but fiddlier, and v3 adds noise lines and band distortion on top of v2. If your clip is supposed to be "old home video," start here, set generations to 2-3, and only reach for v2/v3 when v1's output feels too uniform. The one real gotcha: no seed means the same settings give you different static every run, which is annoying if you're iterating on a specific frame.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| luma_compression_rate | FLOAT | 1.00.1–10 | — |
| luma_noise_sigma | FLOAT | 300–100 | — |
| luma_noise_mean | FLOAT | 0-50–50 | — |
| chroma_compression_rate | FLOAT | 1.00.1–10 | — |
| chroma_noise_intensity | FLOAT | 100–50 | — |
| vertical_blur | INT | 11–21 | — |
| horizontal_blur | INT | 11–21 | — |
| border_size | FLOAT | 1.70–10 | — |
| generations | INT | 31–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |