Nodes/ComfyUI-NovaNoiser/Image Postprocess (NOVA NODES)
ComfyUI Node

Image Postprocess (NOVA NODES)

One Node to Make AI Images Look Captured, Not Generated

By Aloukik21·Created 8 months ago·Updated 8 months ago· 5
Image Postprocess (NOVA NODES)
  • image
  • Cam_Opt
  • NS_Opt
  • awb_ref_image
  • fft_ref_image
  • IMAGE
  • EXIF
apply_noise_otrue
noise_std_frac0.020
apply_clahe_otrue
clahe_clip2.0
clahe_grid8
fourier_cutoff0.25
apply_fourier_otrue
fourier_strength0.90
fourier_randomness0.05
fourier_phase_perturb0.08
fourier_radial_smooth5
fourier_modeauto
fourier_alpha1.0
perturb_mag_frac0.010
enable_awbtrue
enable_luttrue
lutX://insert/path/here(.png/.npy/.cube)
lut_strength1.00
glcmfalse
glcm_distances1
glcm_angles0,0.7853981633974483,1.5707963267948966,2.356194490192345
glcm_levels256
glcm_strength0.90
lbpfalse
lbp_radius3
lbp_n_points24
lbp_methoduniform
lbp_strength0.90
seed-1
apply_exif_otrue

Image Postprocess (NOVA NODES) is the heart of this pack - the node that actually does something. You'll slot it in right after VAE decode, before Save Image, and it runs a whole post-processing chain that makes a generated image look like it left a real camera's sensor. This is the pack's flagship, and it's worth knowing exactly what you're turning on, because half of it is off by default for a reason.

Quick background so the inputs make sense: this is the ComfyUI version of the community "Image Detection Bypass Utility" - a research tool that got a lot of traction on r/StableDiffusion for studying how AI-image detectors work (the original threads pulled +400 and +117 upvotes; u/Race88 wrote the first ComfyUI wrapper, and the Aloukik21 repo is that same code re-shipped as NovaNoiser). What that means in practice: it's a photography-pipeline simulator plus some Fourier tricks, all aimed at scrubbing the "generated" look off an image.

How it works. The source is unambiguous about the order: the node writes your image to a temp file and runs the pack's process_image() pipeline - non-semantic attack (if enabled) → CLAHE local contrast → FFT spectral matching → GLCM texture matching → LBP texture matching → Gaussian noise → random pixel perturbation → camera simulator → auto white balance → LUT grade → fake EXIF. Then it loads the result back into a tensor. You're not getting one effect; you're getting a stack, and the stack order is fixed.

The inputs that matter.

  • image - your IMAGE tensor. Only the first frame of a batch is processed.
  • Cam_Opt and NS_Opt - the custom-type plugs for the pack's two settings nodes. Leave them empty and NovaNodes falls back on sensible defaults, so the main node works even bare.
  • noise_std_frac - the Gaussian noise level, 0.02 default. Keep it low; more noise means more "camera" but also more destruction.
  • apply_fourier_o / fourier_strength / fourier_mode - the FFT spectral matcher, the most distinctive thing here. It reshapes your image's frequency spectrum to match a reference (ref), a math model (model), or an automatic choice (auto).
  • seed - -1 means fully random each run; any other value makes the whole chain reproducible. If you're iterating on settings, set it.
  • apply_exif_o - stamps random but plausible camera EXIF (Canon, Nikon, Sony…) into the output.

The two outputs: IMAGE, which is your processed tensor and the only thing you save; and EXIF, a string containing the fake EXIF blob in case you want to persist it separately.

Troubleshooting, from the people who actually ran it. The author's own note applies here: default parameters will not instantly work - expect to tune. Where people get burned:

  • FFT reference + seed cause a lot of variability. Two runs with the same settings but a random seed can look very different. Nail your seed early.
  • The LUT path is a placeholder by default. lut ships as X://insert/path/here(.png/.npy/.cube) - with enable_lut on, the pack tries to load it, fails, and prints a warning to the console every run. It's harmless, but that warning is not an error.
  • GLCM helps Flux generators; LBP "works occasionally - use last." Both are slow texture-statistics matchers (they pull in scikit-image), and the maintainer's own advice is to enable LBP only after everything else.
  • The non-semantic attack is the slow one. It's an LPIPS-based optimizer and needs lpips + torch installed; on CPU, 500 iterations will crawl. If you're not using it, leave it off (it's controlled via NSOptionsNode).

Install - shared with the pack: ComfyUI Manager → search ComfyUI-NovaNoiser, or

cd ComfyUI/custom_nodes
git clone https://github.com/Aloukik21/ComfyUI-NovaNoiser
cd ComfyUI-NovaNoiser
pip install -r requirements.txt

then restart. Watch the pinned torch==2.8.0+cu126 in requirements.txt - it can try to replace your existing torch. Also ignore the README's GUI instructions (run.py, run.sh, PyQt5): that's the standalone app that ships in the repo, and the nodes here don't touch it.

Categorypostprocessing

Inputs (35)

NameTypeDefaultDescription
imageIMAGE
Cam_OptCAMERAOPT
NS_OptNONSEMANTICOP
apply_noise_oBOOLEANtrue
noise_std_fracFLOAT0.0200–0.1
apply_clahe_oBOOLEANtrue
clahe_clipFLOAT2.00.5–10
clahe_gridINT82–32
fourier_cutoffFLOAT0.250–1
apply_fourier_oBOOLEANtrue
fourier_strengthFLOAT0.900–1
fourier_randomnessFLOAT0.050–0.5
fourier_phase_perturbFLOAT0.080–0.5
fourier_radial_smoothINT50–50
fourier_modeCOMBOauto3 options: auto, ref, model
fourier_alphaFLOAT1.00.1–4
perturb_mag_fracFLOAT0.0100–0.05
enable_awbBOOLEANtrue
enable_lutBOOLEANtrue
lutSTRINGX://insert/path/here(.png/.npy/.cube)
lut_strengthFLOAT1.000–1
glcmBOOLEANfalse
glcm_distancesSTRING1
glcm_anglesSTRING0,0.7853981633974483,1.5707963267948966,2.356194490192345
glcm_levelsINT2562–65536
glcm_strengthFLOAT0.900–1
lbpBOOLEANfalse
lbp_radiusINT31–50
lbp_n_pointsINT241–512
lbp_methodCOMBOuniform4 options: default, ror, uniform, var
lbp_strengthFLOAT0.900–1
seedINT-1-1–2147483647
apply_exif_oBOOLEANtrue
awb_ref_imageoptIMAGE
fft_ref_imageoptIMAGE

Outputs (2)

NameTypeDescription
IMAGEIMAGE
EXIFSTRING