ComfyUI Node

Dequality

Deliberately wreck your render so it finally looks like a photo

By Tr1dae·Created 2 years ago·Updated 2 years ago· 4
Dequality
  • pixels
  • IMAGE
jpeg_artifact_level65
noise_level8
adjust_brightness1
adjust_color1
adjust_contrast1
seed0

The name is doing honest work: Dequality takes a finished image and makes it worse on purpose. It adds realistic Gaussian noise, re-encodes the result as a mid-quality JPEG, and gives the colors, brightness, and contrast a little random wobble. That sounds like a prank node, but it's one of the oldest tricks in the realism book. A render that comes out of the sampler too clean and glossy reads as "AI"; a phone snapshot with grain and compression smears reads as "captured." The photorealism playbook calls this out explicitly: subtle post noise is what makes an image look shot rather than generated. You reach for Dequality at the very end of a photoreal workflow, right before Save Image, to subtract polish instead of adding it.

How it works

Strip away the packaging and it's about sixty lines of PIL and numpy. First, if the toggles are on, it runs ImageEnhance for brightness, color, and contrast, each multiplied by a random factor between 0.9 and 1.1. Then the noise pass adds Gaussian noise with a standard deviation of 255 × (noise_level / 1000), and about 5% of pixels get a second, stronger noise layer on top - the "some pixels just got hammered" texture that real sensors produce. Finally, unless jpeg_artifact_level is 100, the image is saved to a temp file as a JPEG at that quality and read back, which reintroduces block artifacts, chroma smearing, and mosquito noise.

One naming trap: jpeg_artifact_level is really a JPEG quality setting. Higher means cleaner. Set it to 65 and you get a passable web-poster look; drop it into the 20s–30s and you get visible 8×8 blocks. At 100 the JPEG step is skipped entirely.

This node didn't start as a node. It's a GitHub port by Tr1dae of a script by u/flobblobblob, itself based on u/I_like_lips' "make the picture look even more amateurish" script from a +1800-score r/StableDiffusion post in January 2024. Tr1dae says so themselves in the README: "I didn't do anything here." Fine - that honesty is useful. Know what you're getting: a thin utility, not a maintained project with an issue tracker full of answers.

The inputs that matter

  • pixels (IMAGE) - anything that outputs an image. Wire it after your upscaler, before Save Image.
  • jpeg_artifact_level (INT, 0–100, default 65) - the JPEG re-encode quality; the lower, the grimier.
  • noise_level (INT, 0–100, default 8) - grain strength. Remember it's divided by 1000 internally, so 8 is gentle film grain, and you need 40+ before it looks like a nightclub photo.
  • adjust_brightness / adjust_color / adjust_contrast (0/1, default 1) - turn each ±10% random wobble on or off. The seed decides the wobble.
  • seed (INT) - sets the RNG for those three enhancements.

Output is a single IMAGE tensor - feed it to Preview Image or Save Image and you're done.

Install

ComfyUI Manager, search "ComfyUI-Dequality", install, restart. Or the manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/Tr1dae/ComfyUI-Dequality
# restart ComfyUI

There's no requirements.txt and no models to download - it only uses PIL, numpy, torch, and torchvision, all of which ComfyUI already ships.

Where people get burned

Two gotchas, both visible in the source. First, the seed does not control the noise: the noise pass calls numpy's global unseeded RNG, so the grain changes on every run no matter what seed you set. Only the brightness/color/contrast wobble is reproducible. If you need a repeatable frame, set noise_level to 0. Second, the node assumes a single image - it does squeeze(0) on the tensor, so feed it one frame, not a batch or video; you'll only get the first frame back. RGBA inputs get flattened to RGB, and - a miss if you were hoping for the full phone-snapshot illusion - the original script's random fake camera EXIF metadata is not in this port. Noise and JPEG grunge only.

Expect small results: defaults are tuned to barely-there, which is exactly what a realism pass needs. Crank the levels when you want the effect obvious, keep them low when you want your face render to stop looking waxed.

Categoryimage

Inputs (7)

NameTypeDefaultDescription
pixelsIMAGE
jpeg_artifact_levelINT650–100
noise_levelINT80–100
adjust_brightnessINT10–1
adjust_colorINT10–1
adjust_contrastINT10–1
seedINT0-1125899906842624–1125899906842624

Outputs (1)

NameTypeDescription
IMAGEIMAGE