Nodes/Akatz-Loop-Nodes/Adaptive Sharpening | akatz-loops
ComfyUI Node

Adaptive Sharpening | akatz-loops

Unsharp Mask, the Honest Way

By akatz-ai·Created about a year ago·Updated 8 months ago· 23
Adaptive Sharpening | akatz-loops
  • image
  • IMAGE
intensity0.7
radius1.1

Every image comes out of a sampler looking slightly soft - the model renders, the VAE decodes, and fine detail lands a little mushy. AdaptiveSharpening is the pack's answer: a plain, predictable unsharp mask that puts the crispness back without pretending to be AI. One image in, one image out, two knobs. That's the whole node.

And it's worth being blunt about the "adaptive" in the name: this is not adaptive edge-aware sharpening in the fancy anisotropic sense. It's a standard unsharp mask - blur a copy, subtract to isolate high-frequency detail, add that detail back scaled by intensity - applied to each image in the batch. "Sharpening is unsharp masking, and the name is literally the recipe," as the KB's post-processing doc puts it; the only adaptation here is that it processes your batch per-image. Which is fine, because unsharp masking is genuinely the right tool for this job, and the two knobs are the whole craft.

The two knobs that matter

  • intensity (default 0.7, range 0–2) - how hard the detail gets added back. Below ~0.5 you'll barely notice it; above ~1.2 you start building halos on hard edges. 0.7 is a sane "crisp without crunchy" starting point.
  • radius (default 1.1, range 0.1–3) - the size of the blur that defines what counts as "detail." Small radius sharpens fine texture; large radius sharpens edges. The default 1.1 is good for a normal-resolution render; for upscaled images, nudge it up.

The one input that's not a knob is image, which accepts an IMAGE batch - the node loops the batch and returns every frame sharpened, so it slots anywhere a batch flows.

Where it fits

This is post-processing, the "what happens to pixels after the sampler" layer. If your output needs a touch of punch, sharpen here for free and in milliseconds - don't burn a diffusion pass (and its face-rewriting, its seed lottery) doing what a deterministic blur-and-difference does perfectly. If you're upscaling, note the standard advice: don't sharpen before a generative upscale (the model will amplify the halos), and be conservative after. Pair this node with ColorCorrectionAndSharpening if you also want the saturation pass in one stop, or use them standalone to tune each.

Install

Part of Akatz-Loop-Nodes (akatz-ai). Via ComfyUI Manager, search "Akatz-Loop-Nodes"; or:

cd ComfyUI/custom_nodes
git clone https://github.com/akatz-ai/Akatz-Loop-Nodes

Restart ComfyUI afterward. This node does need the pack's one real dependency, opencv-python (for the color/HLS work - sharpening itself is PIL), which Manager installs automatically. No model files, no downloads.

The failure mode to respect is haloing: cranking intensity to 2 on a high-contrast image gives you white fringes along edges, and no amount of "adaptive" anything rescues that. If you want detail back and smooth skin, unsharp is the wrong pass alone - that's what a bilateral/edge-preserving filter is for. But for the common "my render looks soft, make it look like a product shot" case, this node is the cleanest two-knob sharpen in the pack.

CategoryAkatz Loop Nodes/Image

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
intensityFLOAT0.70–2
radiusFLOAT1.10.1–3

Outputs (1)

NameTypeDescription
IMAGEIMAGE