〽️ Image Ops Lens Artifacts
The node page is real, the node isn't (here's what to do instead)
- image
- dirt
- mask
- image
- mask
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
dirtinput 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_amountset speck density and brightness,dust_sizethe speck size in pixels (0.5 → 20), andseedmade 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:
- Load your dirt plate (Load Image) and resize/pad it to match your render.
- ImageOps Merge with the plate as
A, the dirt asB, modemultiply(orgrain_mergefor a softer look), andmixto taste - Merge's blend maths runs in linear light, which is exactly what you want for a dirt attenuation pass. - ImageOps Grain for the fine dust speckle layer if you want procedural specks rather than a photographed plate.
- 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".
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| bypass | BOOLEAN | false | — |
| dirt_amount | FLOAT | 0.000–1 | Opacity of the connected dirt texture. |
| dust_amount | FLOAT | 0.000–1 | Procedural dust speck density and brightness. |
| dust_size | FLOAT | 2.00.5–20 | Speck size in pixels. |
| seed | INT | 123450–18446744073709550000 | Dust is a static lens artifact: the same seed always produces the same specks. |
| invert_mask | BOOLEAN | false | — |
| imageopt | IMAGE,VIDEO | Images/Video input. | |
| dirtopt | IMAGE,VIDEO | Optional dirt/smudge texture to composite (a stock lens-dirt plate). Its luma is used as an attenuation mask. | |
| maskopt | MASK | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |