Image Sharpener /noEmbryo
RCAS in ComfyUI
- image
- image
One image in, one image out, one dial. That's the whole node. The reason it earns a place: the thing people reach for when an output looks soft - another low-denoise sampler pass - is not a sharpener. It's a re-roll. It re-decides your noise, rolls a new seed, and quietly rewrites the parts of the image it feels like touching. A sharpener is a deterministic filter that runs in milliseconds and can't invent a new face. Use the filter for filter jobs.
What RCAS is, and why it isn't an unsharp mask
RCAS is Robust Contrast-Adaptive Sharpening, the sharpening pass from AMD's FidelityFX Super Resolution - and in FSR it runs after the upscale, which tells you where it belongs in your graph.
The mechanism is a single 5-tap cross filter: north, south, east, west, and center. It finds the min and max across those five, derives a weight for the neighbors - a "lobe" - and then applies (center + lobe·(n+s+e+w)) / (1 + 4·lobe). The shipped code in image_nodes.py is exactly that.
Two details do the actual work. On a flat area min and max are nearly equal, so the lobe collapses toward zero and nothing happens - that's the contrast-adaptive part, and it's why skies don't turn to sandpaper. And the lobe is clamped to [-0.1875, 0], which isn't arbitrary: it's AMD's own limit from the FidelityFX shader. It caps how much neighbor signal the filter can ever mix in, which is why RCAS won't rim high-contrast edges the way a runaway unsharp mask does. You trade raw sharpening power for halos you never see.
The two fields
image is required - wire it from your upscaler, your VAE Decode, or your Load Image. It's processed on the GPU in ComfyUI's intermediate dtype.
rcas_strength is the only knob: float, 0 to 1, step 0.01, default 0.8. The author's tooltip says it plainly - "0 = no sharpening, 1 = full RCAS sharpening" - and 0 genuinely short-circuits the filter before it touches a pixel, so it doubles as a clean bypass toggle for A/B comparison.
Set it in practice: 0.8 is not a subtle setting. Start at 0.3–0.5 for a cleanup pass after an upscale, and only go past 0.8 if the source is unusually soft. There's no radius control, so amount is your only lever - if you need to choose what scale of detail gets boosted, this is the wrong node.
The output is image, same type - ready for Save Image or the next post node.
What's in the file that isn't in your menu
Before you go hunting: the same module also ships an ImageSharpenerFull class with a method dropdown - rcas, adaptive USM, high-pass, Richardson–Lucy deconvolution. It isn't registered as a node, so your menu has one Image Sharpener, not four.
Installing it
The pack installs like any Manager node - search noEmbryoNodes (the registry display name) or just noEmbryo - or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/noembryo/ComfyUI-noEmbryo
Restart ComfyUI, then look under Add Node > noEmbryo > Image. There's no pip step: dependencies = [] in the pack's pyproject.toml, no requirements file, no model downloads - no kornia, no opencv, no sharpen model.
Where it belongs in the graph, and where it doesn't
Put it after the upscale, immediately before you save. Sharpening before an upscale is wasted - the resampling pass softens it right back out.
And don't use it as a rescue for a mushy generation. If an image is soft because it's out of focus rather than small, sharpening just makes the blur crisp - which is how you get the "waxy skin after upscaling" complaint that turns up in portrait threads. This is a 3% polish pass, not a fix for a weak source.
If something looks wrong
- Crunchy, grit-edged result? Turn
rcas_strengthdown. This implementation has no noise gate, so grain and compression noise get amplified along with real detail. - Sharpening a batch or a video? The filter loops frame by frame in Python, one dispatch per image. Cheap per frame, but it scales linearly - don't stack three sharpeners hoping for a cumulative fourth.
- Pasting a workflow and nothing connects? The registered class name is
Image Sharpener -noEmbryo- with the suffix. "Image Sharpener" on its own is a different node from a different pack.
One dial, zero dependencies, no way to blow up your graph. Some nodes are boring in exactly the right way, and this is one of them.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| rcas_strengthopt | FLOAT | 0.800–1 | 0 = no sharpening, 1 = full RCAS sharpening. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |