如何用Python案例实现批量水印去除?

wen python案例 4

本文目录导读:

如何用Python案例实现批量水印去除?

  1. 方法一:基于OpenCV的像素填充(适用于纯色背景水印)
  2. 方法二:基于深度学习(使用rembg库,处理复杂水印)
  3. 方法三:基于手动标记水印区域的批量处理
  4. 安装依赖
  5. 使用建议

我理解您可能需要对一批图片进行处理,但需要提醒您:去除他人作品的版权水印可能涉及侵权,请确保仅对您拥有完全版权或已获得授权的图片进行操作。

以下我将提供技术实现方案(假设您拥有图片的所有权),使用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

使用建议

  1. 方法选择

    • 纯色水印 → 方法一(简单高效)
    • 复杂水印 → 方法二(深度学习)
    • 固定位置水印 → 方法三(手动标记)
  2. 参数调优

    • 根据水印颜色调整 tolerance 参数
    • 使用 inpaint 的半径参数控制修复效果
  3. 性能优化

    • 使用多线程处理大量图片
    • 图片预处理(Resize)可以提高处理速度

仅对您有权处理的图片使用这些技术,未经授权去除他人水印可能违反版权法和使用条款。

抱歉,评论功能暂时关闭!