Scan FX (thermal / nightvision / hud / ...)
Thermal, night vision, HUD and 57 more looks stacked eight deep — a scan-effect station in one node
- image
- mask
- image
Every surveillance-glam shot needs the same handful of looks: thermal glow, green night vision, a HUD sweep, a glitch burst. Usually you'd collect that from five different packs and spend an afternoon lining up their color spaces. ScanFX (display "Scan FX (thermal / nightvision / hud / ...)") bundles 61 of these procedural treatments into a single node with eight stacked effect slots - and then adds the one trick that makes it actually useful: an optional mask so the effect only bites part of the frame, like a drone's thermal camera painting only the subject.
How it works
Each effect slot (effect_1 through effect_8, each with its own matching strength_1–strength_8 knob) is an ordered layer. The stack runs top to bottom - slot 1 on the original, slot 2 on the result, and so on - which is how you build compound looks like "thermal base, then a HUD sweep over it, then film grain." Every effect is a synthetic graphic treatment computed in-node: the author is upfront that the thermal/depth/scan appearances are approximations, not real sensor data. There's no model weight, no depth map required, and it runs on any IMAGE batch. Animated effects (sweep, sonar, ekg, code-rain, hologram) advance with frame position and animation_speed, so they only move if you feed multiple frames.
The effect menu is genuinely long - none, thermal, nightvision, xray, lidar, wireframe, holo_sweep, hud, sonar, glitch, hologram, ekg, coderain, chroma, falsecolor, depthmap, sketch, blueprint, halftone, ascii, pixelate, posterize, sobel, bloom, lensflare, vhs, crt, filmgrain, lightpaint, motionblur, slitscan, kaleidoscope, fisheye, tiltshift, doubleexp, solarize, duotone, neon, heathaze, dissolve, voronoi, spectrum, topographic, flowfield, inkbleed, oilpaint, liquidmetal, refraction, caustics, godrays, matrixfloor, vaporwave, aerochrome, uvblacklight, schlieren, bokeh, prism, crosshatch, stipple, frost, teslaarc - plus more. That's a lot of dropdown, so don't memorize it: set slot 1 and iterate.
The controls that matter
mix(default 1) is global opacity for the whole effect stack - pull it down to ghost the effect over the original.mask(optional MASK input) confines everything to a region;mask_feathersoftens the edge andinvert_maskflips it. This is the killer feature - a thermal face over a clean background, or a HUD only in the corner.animation_speeddrives sweep/sonar/ekg/code-rain motion.seedcontrols randomness.- Leave most of the eight slots on
noneuntil you need layering. There is no shame in using one slot.
Wiring it
Input is image (IMAGE), output is image (IMAGE). It sits between a video source and the encoder like any per-frame stylizer - Load Video → ScanFX → Save Video. For the animated effects to do anything you need a frame batch, not a single still. The output frame count matches the input, so you can also run it mid-graph and composite the scan look over clean footage with a mask or a mixer.
Install
ScanFX is one node in the unified MSCH Nodes pack - one install covers all 35 nodes. Via ComfyUI Manager search for "MSCH Nodes" / msch-comfyui-nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/mariobilly/msch-comfyui-nodes.git
cd msch-comfyui-nodes
python -m pip install -r requirements.txt
then restart ComfyUI. Effects are computed with torch/Pillow - no models download, nothing optional to fetch.
Gotchas
Two real ones. First, "thermal" and friends are color-grade approximations, so don't expect sensor-accurate heat maps - for surveillance footage you'd generate with ControlNet or similar, it's close enough to read instantly on screen, which is the point. Second, stacking all eight slots at strength 1 is how you get a brown mush; effects compose multiplicatively, so lower strengths and leave mix room. And remember this node has no memory of time beyond the frames you hand it - for a sweep that starts when the beat drops you'll want it downstream of your beat-synced video, not feeding it.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mix | FLOAT | 1.000–1 | Global opacity of the whole effect stack inside the mask. |
| mask_feather | FLOAT | 4.00–256 | Soften the mask edge (pixels). |
| invert_mask | BOOLEAN | false | — |
| animation_speed | FLOAT | 1.00–10 | Speed of moving effects (sweep, sonar, ekg, code-rain). |
| seed | INT | 00–4294967295 | — |
| effect_1 | COMBO | thermal | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_1 | FLOAT | 1.000–1 | — |
| effect_2 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_2 | FLOAT | 1.000–1 | — |
| effect_3 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_3 | FLOAT | 1.000–1 | — |
| effect_4 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_4 | FLOAT | 1.000–1 | — |
| effect_5 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_5 | FLOAT | 1.000–1 | — |
| effect_6 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_6 | FLOAT | 1.000–1 | — |
| effect_7 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_7 | FLOAT | 1.000–1 | — |
| effect_8 | COMBO | none | 61 options: none, thermal, nightvision, xray, lidar, wireframe, +55 |
| strength_8 | FLOAT | 1.000–1 | — |
| maskopt | MASK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |