Denoise Filter
Stop Noise Before It Becomes Ugly Roughness
- image
- denoised
If you've ever run a noisy phone photo through a normal-map generator and watched the result look like a bumpy alien landscape, you know exactly why this node exists. Denoise Filter is the pre-flight step in the TextureAlchemy pack: clean the source before you feed it to Marigold or Lotus, so sensor noise and JPEG mush don't get baked into your roughness, height, and AO maps.
TextureAlchemy (from amtarr/ComfyUI-TextureAlchemy) is primarily a PBR toolkit - its headline trick is turning one photo into an albedo/normal/roughness/metallic set. But the whole pipeline is garbage-in, garbage-out, and AI normal estimators are great at hallucinating detail from noise. That's where the filter nodes earn their keep.
How it works
The node gives you four denoise methods and then does something sensible with them: whatever method you pick, the output is blended with the original image according to strength. At strength: 0 you get the source unchanged; at 1.0 you get the fully filtered result. That blend is what makes it forgiving - you can knock the edge off a noisy texture without melting it into soup.
The four methods, in rough order of how often you'll use them:
- bilateral - an edge-preserving blur. This is the one you want for texture work: it smooths flat areas while keeping the creases and cracks that are the material.
preserve_edgestoggles whether the edge-detection pass kicks in. - non_local_means - despite the fancy name, it's a simplified patch-based approximation under the hood, so don't expect OpenCV-grade NLM. Fine for mild cleanup.
- gaussian - plain blur. Fast, but it softens everything including edges.
- median - good at killing salt-and-pepper speckle, less good at photographic noise.
The inputs that matter
strength(0–1, default 0.5) - how much of the filtered result to mix in. Start low.method- bilateral is the default and the right call for most photos.preserve_edges(default on) - only meaningfully changes behavior with the bilateral method.
Output is a single denoised IMAGE, which you wire straight into a Load Image → Denoise Filter → Marigold/Lotus chain.
Installing it
Denoise Filter ships inside TextureAlchemy, so install the pack once and you get all ~40 nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy
# restart ComfyUI
Or use ComfyUI Manager → Install Custom Nodes → search "Texture Alchemy". No extra pip packages - it runs on ComfyUI's built-in PyTorch/PIL/NumPy. You'll find it under Texture Alchemist → Filters in the node menu.
Gotchas
Where people get burned: don't over-denoise. A roughness or height map built from a heavily blurred source comes out flat and dead. Run strength at 0.3–0.6, check the result, and remember that a little texture noise in the source often reads as welcome surface grain in the final material. And if your target is clean PBR extraction, denoise before seam-fixing and equalization, not after - every filter in this pack compounds on the last.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| strength | FLOAT | 0.500–1 | — |
| method | COMBO | 4 options: bilateral, non_local_means, gaussian, median | |
| preserve_edges | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| denoised | IMAGE | — |