AI壁纸创作革命:用DeepSeek+Python全自动去除图片水印
——附可商用级代码与多方案效果对比
一、痛点觉醒:被水印支配的AI创作者
作为日均产出300+AI壁纸的创作者,豆包生成的固定位置水印(右下角半透明Logo+文字)导致:
- 单日浪费2.7小时手动PS修补
- 不同尺寸壁纸需反复调整修补区域
- 传统去水印工具破坏画面纹理
核心诉求:
- 批量识别/去除固定格式水印
- 智能修复被覆盖的原始背景
- 支持1920x1080至8K分辨率自适应
二、DeepSeek生成基础框架
Prompt输入:
"用Python编写批量去水印脚本:
自动识别图片右下角300x100区域使用OpenCV修复算法去除半透明水印保留原始画质并批量输出"
DeepSeek生成初版代码:
import cv2
import os
import numpy as np
def remove_watermark(img_path, output_dir):
img = cv2.imread(img_path)
height, width = img.shape[:2]
# 定义水印区域(右下角300x100)
y_start = height - 100
x_start = width - 300
watermark_roi = img[y_start:height, x_start:width]
# 创建修复蒙版
mask = np.zeros(watermark_roi.shape[:2], np.uint8)
mask[10:-10, 10:-10] = 255 # 保留边缘过渡
# 使用inpaint算法修复
repaired = cv2.inpaint(watermark_roi, mask, 3, cv2.INPAINT_TELEA)
# 替换原区域
img[y_start:height, x_start:width] = repaired
cv2.imwrite(os.path.join(output_dir, os.path.basename(img_path)), img)
if __name__ == "__main__":
input_dir = "watermarked"
output_dir = "cleaned"
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
if file.lower().endswith(('.png', '.jpg')):
remove_watermark(os.path.join(input_dir, file), output_dir)
三、深度调优:与DeepSeek的攻防实战
问题1:半透明水印残留
现象:修复区域出现明显拼接痕迹
优化方案:
- 多算法融合:结合边缘感知滤波与纹理合成
- 向DeepSeek提问:
- “如何提升半透明水印的修复效果?”
DeepSeek建议代码升级:
# 新增边缘保护处理
def edge_aware_filter(roi):
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 3, 2)
# 联合双边滤波
return cv2.ximgproc.jointBilateralFilter(roi, edges, 15, 75, 75)
# 修改修复逻辑
repaired = edge_aware_filter(repaired)
问题2:动态分辨率适配
现象:4K壁纸水印区域比例失调
解决方案:
# 智能计算水印区域占比
def calc_watermark_area(width, height):
return (int(width * 0.2), int(height * 0.1)) # 宽度20%,高度10%
四、工业级最终代码(支持多分辨率/多进程)
import cv2
import os
import numpy as np
from multiprocessing import Pool
from tqdm import tqdm
class WatermarkRemover:
def __init__(self, edge_sigma=75, process_num=4):
self.edge_sigma = edge_sigma
self.process_num = process_num
def _edge_aware_filter(self, roi):
"""边缘感知滤波"""
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 3, 2)
return cv2.ximgproc.jointBilateralFilter(roi, edges, 15,
self.edge_sigma, self.edge_sigma)
def _inpaint_region(self, img):
"""核心修复逻辑"""
h, w = img.shape[:2]
w_w, w_h = int(w*0.2), int(h*0.1) # 动态计算区域
# 渐变蒙版生成
mask = np.zeros((w_h, w_w), dtype=np.uint8)
cv2.rectangle(mask, (15,15), (w_w-15, w_h-15), 255, -1)
mask = cv2.GaussianBlur(mask, (51,51), 0)
roi = img[-w_h:, -w_w:]
repaired = cv2.inpaint(roi, mask, 3, cv2.INPAINT_NS)
return self._edge_aware_filter(repaired)
def process_image(self, args):
"""供多进程调用的处理方法"""
path, output_dir = args
try:
img = cv2.imread(path)
repaired_roi = self._inpaint_region(img)
img[-repaired_roi.shape[0]:, -repaired_roi.shape[1]:] = repaired_roi
cv2.imwrite(os.path.join(output_dir, os.path.basename(path)), img,
[int(cv2.IMWRITE_JPEG_QUALITY), 95])
return True
except Exception as e:
print(f"处理失败: {path} - {str(e)}")
return False
if __name__ == "__main__":
input_dir = "壁纸源文件" #路径和文件名都不能有中文,不然会出现无法读取图片异常
output_dir = "无水印壁纸"
os.makedirs(output_dir, exist_ok=True)
remover = WatermarkRemover(edge_sigma=80)
task_list = [(os.path.join(input_dir, f), output_dir)
for f in os.listdir(input_dir) if f.lower().endswith(('.png', '.jpg'))]
# 多进程加速
with Pool(processes=4) as pool:
results = list(tqdm(pool.imap(remover.process_image, task_list), total=len(task_list)))
print(f"成功处理 {sum(results)} 张图片")
五、效果实测与方案对比
测试环境:
- Intel i7 + RTX 3060
- 100张4K壁纸(含动态/渐变/纹理背景)
方案 | 耗时 | 残影程度 | 纹理连贯性 |
手动PS修补 | 217m | ★★★☆☆ | ★★★★☆ |
初版inpaint | 6.2m | ★★☆☆☆ | ★★★☆☆ |
本方案(优化版) | 8.7m | ★★★★☆ | ★★★★☆ |
六、进阶技巧与法律边界
- 参数调优指南:
- edge_sigma:控制纹理保留强度(50-100)
- 修改calc_watermark_area调整检测区域
- 法律警示:
- 本代码仅适用于去除自主生成内容的水印
- 严禁用于去除他人版权内容水印
- 扩展方向:
- 接入Stable Diffusion进行背景重绘
- 训练YOLO模型识别非固定位置水印
立即运行:
pip install opencv-python tqdm numpy
(建议在Linux/Mac环境运行,Windows需配置OpenCV多线程支持)