Nodes/Tenser Tensor/TT Postproduction
ComfyUI Node

TT Postproduction

LUT, film grain, and upscale — one pass after the VAE

By tenser-tensor·Created 7 months ago·Updated 5 months ago· 0
TT Postproduction
  • image
  • IMAGE
apply_luttrue
lut_file
lut_strength1.00
lut_colorspace
add_film_graintrue
grain_seed0
grain_scale0.25
grain_strength0.20
grain_saturation0.50
grain_toe0.05
grain_upscale_mode
grain_antialiastrue
image_upscalertrue
upscaler_device
upscale_model_name
upscaler_tile512
upscaler_overlap64

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.txt lists only gguf and kornia, but this node's code also imports colour-science and spandrel. 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_name at something or flip image_upscaler off.
  • 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.
CategoryTenserTensor/Postproduction

Inputs (18)

NameTypeDefaultDescription
imageIMAGE
apply_lutBOOLEANtrue
lut_fileCOMBO0 options:
lut_strengthFLOAT1.000–1
lut_colorspaceCOMBO2 options: linear, logarithmic
add_film_grainBOOLEANtrue
grain_seedINT00–18446744073709550000
grain_scaleFLOAT0.250.25–2
grain_strengthFLOAT0.200–10
grain_saturationFLOAT0.500–2
grain_toeFLOAT0.05-0.2–0.5
grain_upscale_modeCOMBO5 options: bilinear, bicubic, lanczos, nearest, area
grain_antialiasBOOLEANtrue
image_upscalerBOOLEANtrue
upscaler_deviceCOMBO2 options: default, cpu
upscale_model_nameCOMBO0 options:
upscaler_tileINT512256–4096
upscaler_overlapINT640–256

Outputs (1)

NameTypeDescription
IMAGEIMAGE