TT Postproduction
LUT, film grain, and upscale — one pass after the VAE
- image
- IMAGE
The gap between "generated" and "finished" is where most images die: flat colors, that plastic sheen, no texture. TT Postproduction is TenserTensor's one-stop box for the three fixes people actually apply after the VAE - a LUT color grade, film grain, and an upscale - chained in that order in a single node. Feed it an IMAGE, get an IMAGE out the other side that's graded, grained, and bigger.
The LUT stage is a real LUT, not a tint slider. The pack ships a lut/ folder of .cube files and applies them with the colour-science library - the same math video colorists use. lut_strength blends between the graded and original image (0–1), and lut_colorspace picks linear or logarithmic handling for how the LUT expects its input; logarithmic is the film-log pipeline, and if your LUT looks wrong, flip this first. To add your own looks, drop .cube files into ComfyUI/custom_nodes/ComfyUI-TenserTensor/lut/ and they show up in lut_file.
The film grain is the genuinely interesting bit. It's not a simple noise overlay: the node generates multi-scale gaussian-blurred grain in YCbCr color space (three channels, three blur kernel sizes), converts back to RGB, and blends it multiplicatively with a film-style toe (shadow lift) so the grain sits in the shadows and highlights like real film, not like static on top of a photo. grain_scale makes the grain grainier, grain_strength controls how visible it is, grain_saturation mixes color vs monochrome grain, and grain_seed gives you reproducible grain per render. It's the difference between "AI image" and "shot on film" that people chase.
The upscaler stage uses the spandrel loader, which is the same engine ComfyUI core uses for upscale models - so any .pt/.safetensors ESRGAN/SwinIR-family model in models/upscale_models/ works. It runs tiled (upscaler_tile 512 default, upscaler_overlap 64) to stay inside VRAM, and if it hits an out-of-memory it automatically retries with smaller tiles instead of dying. upscaler_device can pin the model to CPU if you want to keep VRAM free for the sampler.
The three stages each have a master toggle - apply_lut, add_film_grain, image_upscaler - so you can leave the node in place and switch stages on and off while you tune. Inputs that matter most:
lut_file+lut_strength- the color look, and how much of it.grain_strength+grain_scale- film texture; start near the 0.2/0.25 defaults.upscale_model_name- your upscaler; 4x-UltraSharp or similar ESRGAN models are the usual choice.
Install is the pack standard:
cd ComfyUI/custom_nodes
git clone https://github.com/tenser-tensor/ComfyUI-TenserTensor
or search "TenserTensor" in ComfyUI Manager and restart.
Gotchas worth knowing:
- The pack's
requirements.txtlists onlyggufandkornia, but this node's code also importscolour-scienceandspandrel. ComfyUI core ships both, so you're usually fine - but if this node fails to load with an import error, those are the two to check. - No upscale model selected → error. The upscaler is on by default and it needs a real model. Point
upscale_model_nameat something or flipimage_upscaleroff. - LUT folder error at load. The node scans the pack's
lut/dir and raises if it can't find it; a bad clone/update can cause this. Re-cloning the pack fixes it. - The upscale stage only adds pixels - per the KB's upscaling taxonomy that's "more pixels, source already sharp," not generative detail restoration. Use it to blow up a finished image, not to rescue a soft one.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| apply_lut | BOOLEAN | true | — |
| lut_file | COMBO | 0 options: | |
| lut_strength | FLOAT | 1.000–1 | — |
| lut_colorspace | COMBO | 2 options: linear, logarithmic | |
| add_film_grain | BOOLEAN | true | — |
| grain_seed | INT | 00–18446744073709550000 | — |
| grain_scale | FLOAT | 0.250.25–2 | — |
| grain_strength | FLOAT | 0.200–10 | — |
| grain_saturation | FLOAT | 0.500–2 | — |
| grain_toe | FLOAT | 0.05-0.2–0.5 | — |
| grain_upscale_mode | COMBO | 5 options: bilinear, bicubic, lanczos, nearest, area | |
| grain_antialias | BOOLEAN | true | — |
| image_upscaler | BOOLEAN | true | — |
| upscaler_device | COMBO | 2 options: default, cpu | |
| upscale_model_name | COMBO | 0 options: | |
| upscaler_tile | INT | 512256–4096 | — |
| upscaler_overlap | INT | 640–256 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |