Auto Watermark Remover
Drop in a watermarked image, get a clean one back
- image
- watermark_template
- symbol_reference
- image
- mask
- mask_preview
- detected_text
You have an image with a watermark and you want it gone, and you don't want to hand-paint the mask. Auto Watermark Remover is the whole job in one node: it detects the watermark, builds a mask, and fills the hole, all locally. The name is entirely literal - it calls no API and needs no key.
It's not magic, and the README is refreshingly honest about that. This node works best when the watermark is still visible enough to detect: readable text, corner logos and stock-photo marks, faint semi-transparent overlays with recoverable edges, and repeated symbol watermarks when you can feed it a reference template. If the watermark is a blend that's nearly invisible to your eye, no detector is going to save you.
How it works
Under the hood it's the classic detector-then-inpaint pipeline, which is still the practical open-source frontier for generic watermark removal. Detection happens first - downscaled if your input is huge, then mapped back to a full-resolution mask so big images don't crawl. Then the actual cleanup runs.
The parts that matter, in order:
- Detection.
cv2_onlyuses a contour/text-like-region heuristic and is the fastest starting point.ocr_then_cv2adds EasyOCR for readable text.ocr_onlyis for when you specifically want text and no CV2 fallback. - Hard cases.
detail_detector=decompositionrecovers faint blended overlays that simple contours miss.detail_detector=symbol_templatematches a known logo against a reference image you connect. - The fill.
opencv_teleais the fast first pass for small marks;big_lamais the quality upgrade for thicker or textured areas;symbol_reverse_blendreconstructs a dark semi-transparent symbol from your template;gemini_reverse_alphais a narrow special case for the Gemini sparkle overlay (yes, that watermark is a real plague - it leaks into models' training data and shows up uninvited);diffusers_sd_inpaintruns a crop-aware SD inpainting pass for semantic cleanup on faces, bodies, and costume detail.
The inputs you'll actually touch
Of the twenty-plus widgets, beginners can ignore most of them. The ones that matter:
image- your watermarked image, as a batch or a single frame.detection_mode- startcv2_only, switch toocr_then_cv2when the watermark is readable text.region-edgesorcornersfor border watermarks;full_imageotherwise. Smaller regions are faster and produce fewer false hits.inpaint_method-opencv_teleafor speed,big_lamafor quality.watermark_template- an optional reference crop of the logo or symbol. A tight, clean crop on a similar background beats a noisy crop from the same image every time.
Worth tuning: cv2_sensitivity (raise it for faint overlays, lower it to stop masking real detail), padding and dilate (if watermark edges survive, nudge these up), and symbol_match_threshold (start around 0.45–0.55; raise it if the template keeps latching onto lookalikes).
The node outputs the cleaned image, plus a mask, a mask_preview you can actually look at before trusting it, and detected_text (the OCR'd watermark text and detector messages). Wire image onward to whatever's next; use mask_preview for debugging.
Installing it
ComfyUI Manager is easiest - search for ComfyUI Auto Watermark Mask. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/goodguy1963/comfyui-auto-watermark-mask
Then restart ComfyUI. Manager will install the Python deps, which is where the install actually gets interesting: easyocr, onnxruntime-gpu (on Windows x64 - a chunky install), opencv-python, spandrel, and huggingface_hub. Expect a first-run download or two: EasyOCR pulls its language weights, and Big-LaMa auto-downloads big-lama.pt from Hugging Face into your inpaint model folder (disable that with COMFYUI_AUTO_WATERMARK_MASK_AUTO_DOWNLOAD=0 and drop the file in yourself).
Where people get burned
symbol_reverse_blenderrors out if no template is connected - it requireswatermark_templateor its legacy aliassymbol_reference. Not a bug; it literally cannot run without the reference.- The Diffusers method isn't installed by default.
diffusers_sd_inpaintneedsdiffusers,transformers, andpillowin your environment, whichrequirements.txtdoes not include, and the default model is the ~4GBstable-diffusion-v1-5/stable-diffusion-inpainting. If you pick it without the packages, it fails. Install them only if you actually need semantic cleanup. - First OCR run feels hung. EasyOCR downloads language weights on first use; it's slow once, fast after.
- Mask eats the subject.
cv2_sensitivitytoo high turns real image detail into "watermark." Checkmask_previewbefore the fill - that output exists precisely so you don't find out after.
It's a niche tool, and the community knows the generic version has limits. For stock-style corner marks and readable text it's genuinely good; for everything else, start with the defaults and work your way up the ladder one method at a time.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| languages | STRING | en | Used only when OCR modes are selected. |
| detection_mode | COMBO | cv2_only | How to create the watermark mask before cleanup. cv2_only is usually the best starting point for logos and symbols. |
| region | COMBO | full_image | Limits detection to likely watermark areas. Smaller regions are faster and reduce false hits. |
| min_confidence | FLOAT | 0.250–1 | Minimum OCR confidence before text is masked. Only matters for OCR modes. |
| padding | INT | 100–256 | Extra pixels around each detected area before cleanup. |
| dilate | INT | 50–256 | Expands the final mask. Increase if the watermark edges are still visible after removal. |
| blur | INT | 30–255 | Softens the mask edge. Lower values keep the repaired region tighter. |
| cv2_sensitivity | FLOAT | 0.800–1 | Sensitivity for non-OCR detection. Raise it for faint overlays, lower it to avoid masking real image detail. |
| corner_fallback | COMBO | off | Adds a simple mask in one or more corners when the watermark sits near the border and detection is inconsistent. |
| corner_width_ratio | FLOAT | 0.120.02–0.5 | Corner fallback width as a fraction of image width. |
| corner_height_ratio | FLOAT | 0.080.02–0.5 | Corner fallback height as a fraction of image height. |
| inpaint_method | COMBO | opencv_telea | Cleanup backend. Start with opencv_telea for small marks, big_lama for texture overlap, or moebius for higher-quality 512px generative inpainting. |
| inpaint_model | COMBO | big-lama.pt | Big-LaMa checkpoint name. Used only when inpaint_method=big_lama. |
| inpaint_radius | INT | 51–64 | OpenCV or cleanup radius. Small values preserve detail better; larger values can erase thicker marks. |
| gpu | BOOLEAN | false | Use GPU for OCR when available. Big-LaMa, Moebius, and Diffusers manage their own device placement. |
| detail_detector | COMBO | none | Extra detector for hard masks. Use symbol_template together with watermark_template for known logos or repeated symbol watermarks. |
| symbol_match_threshold | FLOAT | 0.450–1 | Template match threshold for symbol_template and symbol_reverse_blend. Raise it to be stricter. |
| diffusers_model_id | STRING | stable-diffusion-v1-5/stable-diffusion-inpainting | Optional Hugging Face model id or local folder for diffusers_sd_inpaint. |
| diffusers_prompt | STRING | clean image, preserve the original subject and style, remove watermark and text | Prompt used only by diffusers_sd_inpaint. Keep it focused on preserving the original subject while removing the watermark. |
| diffusers_negative_prompt | STRING | watermark, text, logo, signature, artifact, distortion, deformed anatomy, blurry face | Negative prompt used only by diffusers_sd_inpaint. |
| diffusers_strength | FLOAT | 0.900–1 | How strongly Diffusers redraws the cropped area. Lower values preserve more of the source image. |
| diffusers_guidance_scale | FLOAT | 4.51–20 | Prompt guidance for diffusers_sd_inpaint. |
| diffusers_steps | INT | 301–100 | Inference steps for diffusers_sd_inpaint. |
| diffusers_crop_padding | INT | 480–512 | Extra context around the masked area when using diffusers_sd_inpaint. |
| moebius_seed | INT | 00–2147483647 | Random seed used only by moebius. |
| moebius_steps | INT | 201–100 | Denoising steps used only by moebius. The upstream default is 20. |
| moebius_guidance | FLOAT | 2.00–10 | Classifier-free guidance used only by moebius. |
| watermark_templateopt | IMAGE | Optional reference image of the watermark to match. Use a tight crop when possible. A clean external template works better than a noisy crop from the same image. | |
| symbol_referenceopt | IMAGE | Legacy alias for watermark_template. You only need one of these inputs connected. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| mask_preview | IMAGE | — |
| detected_text | STRING | — |