本文目录导读:

我理解您可能需要对一批图片进行处理,但需要提醒您:去除他人作品的版权水印可能涉及侵权,请确保仅对您拥有完全版权或已获得授权的图片进行操作。
以下我将提供技术实现方案(假设您拥有图片的所有权),使用Python实现批量去除水印,主要采用两种方法:
基于OpenCV的像素填充(适用于纯色背景水印)
import cv2
import numpy as np
import os
from pathlib import Path
def remove_watermark_opencv(input_path, output_path, watermark_color, tolerance=30):
"""
使用OpenCV去除纯色水印
:param input_path: 输入图片路径
:param output_path: 输出图片路径
:param watermark_color: 水印颜色 (B,G,R) 格式
:param tolerance: 颜色容忍度
"""
# 读取图片
img = cv2.imread(str(input_path))
if img is None:
print(f"无法读取图片: {input_path}")
return False
# 创建水印颜色的掩码
lower = np.array([max(0, c - tolerance) for c in watermark_color])
upper = np.array([min(255, c + tolerance) for c in watermark_color])
mask = cv2.inRange(img, lower, upper)
# 使用中值滤波修复水印区域
repaired = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
# 保存结果
cv2.imwrite(str(output_path), repaired)
return True
def batch_process(input_dir, output_dir, watermark_color, tolerance=30):
"""
批量处理目录中的所有图片
"""
# 创建输出目录
Path(output_dir).mkdir(parents=True, exist_ok=True)
# 支持的图片格式
extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff']
# 遍历输入目录
success_count = 0
for file_path in Path(input_dir).iterdir():
if file_path.suffix.lower() in extensions:
output_path = Path(output_dir) / file_path.name
print(f"处理: {file_path.name}")
if remove_watermark_opencv(file_path, output_path, watermark_color, tolerance):
success_count += 1
print(f"处理完成!成功: {success_count} 张")
# 使用示例
if __name__ == "__main__":
# 参数配置
INPUT_DIR = "./input_images" # 输入图片文件夹
OUTPUT_DIR = "./output_images" # 输出文件夹
WATERMARK_COLOR = (255, 255, 255) # 水印颜色(这里假设白色水印)
TOLERANCE = 30 # 颜色容忍度
batch_process(INPUT_DIR, OUTPUT_DIR, WATERMARK_COLOR, TOLERANCE)
基于深度学习(使用rembg库,处理复杂水印)
import os
from pathlib import Path
from PIL import Image
import numpy as np
from rembg import remove
import cv2
class DeepWatermarkRemover:
def __init__(self, threshold=0.5):
"""
初始化深度学习水印去除器
:param threshold: 置信度阈值
"""
self.threshold = threshold
def remove_watermark_deep(self, input_path, output_path):
"""
使用深度学习去除水印
"""
try:
# 读取图片
img = Image.open(input_path)
# 使用rembg去除背景(将水印视为前景物体)
result = remove(img, alpha_matting=True)
# 将alpha通道作为掩码
result_np = np.array(result)
if result_np.shape[2] == 4:
mask = result_np[:, :, 3] > (self.threshold * 255)
# 读取原图
original = cv2.imread(str(input_path))
if original is None:
return False
# 对水印区域进行修复
mask_uint8 = (mask * 255).astype(np.uint8)
repaired = cv2.inpaint(original, mask_uint8, 3, cv2.INPAINT_TELEA)
# 保存结果
cv2.imwrite(str(output_path), repaired)
return True
else:
# 如果没有alpha通道,直接保存原图
result.save(str(output_path))
return True
except Exception as e:
print(f"处理失败: {e}")
return False
def batch_process(self, input_dir, output_dir):
"""
批量处理
"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff']
success_count = 0
for file_path in Path(input_dir).iterdir():
if file_path.suffix.lower() in extensions:
output_path = Path(output_dir) / file_path.name
print(f"处理: {file_path.name}")
if self.remove_watermark_deep(file_path, output_path):
success_count += 1
print(f"处理完成!成功: {success_count} 张")
# 使用深度学习方法的示例
if __name__ == "__main__":
# 安装依赖: pip install rembg pillow opencv-python numpy
# 配置参数
INPUT_DIR = "./input_images"
OUTPUT_DIR = "./output_images"
# 创建实例并处理
remover = DeepWatermarkRemover(threshold=0.5)
remover.batch_process(INPUT_DIR, OUTPUT_DIR)
基于手动标记水印区域的批量处理
import cv2
import numpy as np
from pathlib import Path
import json
class ManualWatermarkRemover:
def __init__(self):
self.watermark_roi = None # 水印区域坐标 [x, y, w, h]
def select_watermark_roi(self, sample_image_path):
"""
手动选择水印区域(只需在第一张图片上操作)
"""
img = cv2.imread(sample_image_path)
if img is None:
print("无法读取示例图片")
return False
print("请用鼠标选择水印区域,按Enter确认")
r = cv2.selectROI("选择水印区域", img)
cv2.destroyAllWindows()
if r[2] == 0 or r[3] == 0:
print("未选择区域")
return False
self.watermark_roi = r
return True
def remove_watermark_roi(self, input_path, output_path):
"""
根据标记区域去除水印
"""
if self.watermark_roi is None:
print("请先选择水印区域")
return False
img = cv2.imread(str(input_path))
if img is None:
return False
x, y, w, h = self.watermark_roi
roi = img[y:y+h, x:x+w]
# 修复水印区域
mask = np.ones((h, w), dtype=np.uint8) * 255
repaired = cv2.inpaint(img[y:y+h, x:x+w], mask, 3, cv2.INPAINT_TELEA)
img[y:y+h, x:x+w] = repaired
cv2.imwrite(str(output_path), img)
return True
def batch_process_with_roi(self, input_dir, output_dir, sample_image_name):
"""
批量处理(先选择水印区域)
"""
# 选择一张示例图片标记水印
sample_path = Path(input_dir) / sample_image_name
if not self.select_watermark_roi(str(sample_path)):
return
# 创建输出目录
Path(output_dir).mkdir(parents=True, exist_ok=True)
# 批量处理
extensions = ['.jpg', '.jpeg', '.png', '.bmp']
success_count = 0
for file_path in Path(input_dir).iterdir():
if file_path.suffix.lower() in extensions:
output_path = Path(output_dir) / file_path.name
print(f"处理: {file_path.name}")
if self.remove_watermark_roi(file_path, output_path):
success_count += 1
print(f"处理完成!成功: {success_count} 张")
# 使用示例
if __name__ == "__main__":
# 配置参数
INPUT_DIR = "./input_images"
OUTPUT_DIR = "./output_images"
SAMPLE_IMAGE = "sample.jpg" # 用于标记水印的示例图片
remover = ManualWatermarkRemover()
remover.batch_process_with_roi(INPUT_DIR, OUTPUT_DIR, SAMPLE_IMAGE)
安装依赖
# 基础依赖 pip install opencv-python numpy pillow # 深度学习方案额外依赖 pip install rembg
使用建议
-
方法选择:
- 纯色水印 → 方法一(简单高效)
- 复杂水印 → 方法二(深度学习)
- 固定位置水印 → 方法三(手动标记)
-
参数调优:
- 根据水印颜色调整
tolerance参数 - 使用
inpaint的半径参数控制修复效果
- 根据水印颜色调整
-
性能优化:
- 使用多线程处理大量图片
- 图片预处理(Resize)可以提高处理速度
仅对您有权处理的图片使用这些技术,未经授权去除他人水印可能违反版权法和使用条款。