Nodes/ComfyUI-Majoor-ImageOps/〽️ Image Ops Lens Artifacts
ComfyUI Node

〽️ Image Ops Lens Artifacts

The node page is real, the node isn't (here's what to do instead)

By MajoorWaldi·Created 9 months ago·Updated 24 days ago· 14
〽️ Image Ops Lens Artifacts
  • image
  • dirt
  • mask
  • image
  • mask
◄bypassfalse►
◄dirt_amount0.00►
◄dust_amount0.00►
◄dust_size2.0►
◄seed12345►
◄invert_maskfalse►

Here's the thing you actually googled your way here to find out: Image Ops Lens Artifacts was removed from the pack. If you've cloned ComfyUI-Majoor-ImageOps and can't find the node in the search list, nothing is broken and you haven't installed it wrong. It's gone. The pack's own changelog lists it among the lens/compositing additions and then lists, in the same release notes, "ImageOps Lens Artifacts - removed"; the shipped node registry for the current 0.6.x pack has no entry for it, and the corresponding source file isn't in the repo. It was written, it was pulled, and this doc page outlived it.

Which is a shame, because the idea is a good one. So: what it did, and how to get the same result today.

What it was for

Real camera lenses are dirty. Not dramatically - a bit of dust on the front element, a fingerprint smudge near the edge, a fleck you never noticed until you shot into the sun. That dirt scatters light, and its signature is unmistakable: soft dark smudges, and pinprick specks that blaze when a bright highlight sits behind them. It's the same family of tells as grain and chromatic aberration - see post-processing.md on the "add the lens behaviour in post" argument, and photorealism.md on lens behaviour being something models rarely produce. Nobody generates a dirty lens. You composite one on.

What the parameters did

From its published schema, the node had two independent artifact sources:

  • Dirt - an optional dirt input took a stock lens-dirt plate (smudge/dust photography, the kind you can find as free textures) and composited it, with its luma used as an attenuation mask. dirt_amount (0 → 1) controlled the opacity of that plate.
  • Dust - procedural, no input needed. dust_amount set speck density and brightness, dust_size the speck size in pixels (0.5 → 20), and seed made it deterministic - the tooltip is explicit that dust is a static lens artifact, so the same seed always produces the same specks. That's the right call: a speck that jitters between frames instantly reads as a broken render, not a dirty lens.

It took an image input and an optional mask, plus the pack's ubiquitous invert_mask and bypass, and output image and mask like every other processing node here.

The workaround

You can rebuild the effect with nodes that do still ship in this pack, and honestly it's more controllable than a single dirt slider:

  1. Load your dirt plate (Load Image) and resize/pad it to match your render.
  2. ImageOps Merge with the plate as A, the dirt as B, mode multiply (or grain_merge for a softer look), and mix to taste - Merge's blend maths runs in linear light, which is exactly what you want for a dirt attenuation pass.
  3. ImageOps Grain for the fine dust speckle layer if you want procedural specks rather than a photographed plate.
  4. ImageOps Bloom on the result, with a low threshold, so the specks that sit over a highlight actually glitter instead of just being dark dots.

Two gotchas worth naming. Dirt is a static artifact, so apply it once to the whole clip, not per frame. And it should go on last - after upscaling - because a dirt plate resized upward turns into grey mush.

Installing the pack

The pack itself is the same install as always:

cd ComfyUI/custom_nodes
git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-ImageOps

Restart ComfyUI, then hard-refresh the browser (Ctrl+F5, Cmd+Shift+R on macOS) so the pack's live-preview frontend JS loads. ComfyUI Manager: search ComfyUI-Majoor-ImageOps. You need ComfyUI 0.19.0 or newer - the pack is V3-schema only and won't register on older builds. No model downloads, no extra dependencies.

If you specifically want a dirt/dust node and would rather not build the stack above, the historical home for this kind of thing is WAS Node Suite, which covered chromatic aberration, bloom and film grain under one roof - though its author has said it's no longer under active development, so treat it as "still works, not growing".

Categoryimage/imageops

Inputs (9)

NameTypeDefaultDescription
bypassBOOLEANfalse—
dirt_amountFLOAT0.000–1Opacity of the connected dirt texture.
dust_amountFLOAT0.000–1Procedural dust speck density and brightness.
dust_sizeFLOAT2.00.5–20Speck size in pixels.
seedINT123450–18446744073709550000Dust is a static lens artifact: the same seed always produces the same specks.
invert_maskBOOLEANfalse—
imageoptIMAGE,VIDEOImages/Video input.
dirtoptIMAGE,VIDEOOptional dirt/smudge texture to composite (a stock lens-dirt plate). Its luma is used as an attenuation mask.
maskoptMASK—

Outputs (2)

NameTypeDescription
imageIMAGE—
maskMASK—