Comprehensive Image Enhancement
Run every watermark-enhancement trick at once
- image
- IMAGE
This is the "throw everything at the watermark" node. Instead of picking one technique, Comprehensive Image Enhancement runs eight of them in a single pass - CLAHE, a high-pass filter, Canny edges, adaptive thresholding, morphology, a gray-region boost, a texture band-pass, and a denoise - then blends the results back onto your original image by weight. If you've cloned this pack and have no idea which of its many nodes you need, this is the one to drag in first. It's an exploration tool: run it once, and the faint mark you couldn't see before usually jumps out somewhere in the mix.
A quick word on the pack in general, because the title is doing some heavy lifting. ComfyUI-WaterMark-Detector contains no neural network and no model weights - no detector. It's all classical OpenCV/scipy/pywt image processing, and every node here is really an enhancement filter that makes a watermark easier to see (and then easier to mask or inpaint away). The community's watermark work is dominated by removal-via-inpainting - Flux Fill and friends - but you need the mark visible to know what you're removing. That's the niche this pack fills, and Comprehensive is its flagship.
How it works
The source is honest about the architecture: enhance() instantiates the pack's own CLAHEEnhancement, HighPassFilter, EdgeDetection, AdaptiveThresholding, MorphologicalOperations, ImprovedGrayColorEnhancement, TextureEnhancement, and DenoisingFilter classes, runs each on your input, and then does a weighted blend. Your original keeps a share of 1 - (sum of all weights), every enhanced layer contributes its own weight_* value, and the result is clamped to 0–1. So you're effectively building an eight-node chain with one node.
The inputs that matter
The schema is long, but you only really set two groups of things:
- The
weight_*knobs -weight_clahe,weight_hpf,weight_edge,weight_at,weight_morph,weight_gray,weight_texture,weight_denoise. These decide which techniques get to contribute. This is 90% of the tuning. - Per-method params for when you want to dig in:
clahe_clip_limit/clahe_grid_size,hpf_cutoff_freq,edge_low_threshold/edge_high_threshold,at_block_size/at_c,morph_operation/morph_kernel_size, the gray range and boost, the texture range, and the denoise strengths. Same knobs as the standalone nodes, just namespaced.
Output is a single IMAGE tensor - wire it straight into a preview or Save Image, or feed it onward.
Where people get burned
The defaults are a trap. The eight weights sum to 1.6, which means your original gets a negative share (1 − 1.6 = −0.6), and the two binary channels - weight_edge and weight_at - are both active at 0.2. The default output is often a mashed edge map rather than a subtly enhanced photo. Fix: zero out every channel you don't care about (edge and adaptive threshold especially) and keep the remaining weights summing to about 1. Once the watermark is visible, the standard move is to mask it and inpaint - the edge/threshold outputs here double as decent raw masks for that.
Installing
Same as any custom node, and there's nothing exotic to fetch - no models at all:
cd ComfyUI/custom_nodes
git clone https://github.com/hotpizzatactics/ComfyUI-WaterMark-Detector
Or search ComfyUI-WaterMark-Detector in ComfyUI Manager. The pack's install.py pip-installs torch, numpy, opencv-python, scipy, and PyWavelets on first load; opencv is the chunky one, and you almost certainly already have it. No GPU needed - this is all CPU-friendly CV. Restart ComfyUI after installing.
Expect this one to be the slowest node in the pack: it's eight full image passes per frame, so a big batch will take noticeably longer than any single node. If it's too heavy, break the workflow into the individual nodes you actually want - the pack ships them all as standalone classes, and their articles on this site cover each one.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| clahe_clip_limit | FLOAT | 4.00.1–10 | — |
| clahe_grid_size | INT | 82–16 | — |
| hpf_cutoff_freq | INT | 801–100 | — |
| edge_low_threshold | INT | 300–255 | — |
| edge_high_threshold | INT | 1000–255 | — |
| at_block_size | INT | 113–99 | — |
| at_c | FLOAT | 2.00–10 | — |
| morph_operation | COMBO | 4 options: dilate, erode, open, close | |
| morph_kernel_size | INT | 31–21 | — |
| gray_lower | INT | 500–255 | — |
| gray_upper | INT | 2000–255 | — |
| gray_boost_factor | FLOAT | 2.01–5 | — |
| gray_sharpen_amount | FLOAT | 2.50–5 | — |
| texture_freq_range | INT | 701–100 | — |
| texture_boost_factor | FLOAT | 3.01–5 | — |
| denoise_strength | FLOAT | 5.00–20 | — |
| denoise_color_strength | FLOAT | 5.00–20 | — |
| weight_clahe | FLOAT | 0.300–1 | — |
| weight_hpf | FLOAT | 0.200–1 | — |
| weight_edge | FLOAT | 0.200–1 | — |
| weight_at | FLOAT | 0.100–1 | — |
| weight_morph | FLOAT | 0.100–1 | — |
| weight_gray | FLOAT | 0.300–1 | — |
| weight_texture | FLOAT | 0.300–1 | — |
| weight_denoise | FLOAT | 0.100–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |