ai
  • index
  • cursor
  • vector
  • crawl
  • crawl-front
  • DrissionPage
  • logging
  • mysql
  • pprint
  • sqlalchemy
  • contextmanager
  • dotenv
  • Flask
  • python
  • job
  • pdfplumber
  • python-docx
  • redbook
  • douyin
  • ffmpeg
  • json
  • numpy
  • opencv-python
  • pypinyin
  • re
  • requests
  • subprocess
  • time
  • uuid
  • watermark
  • milvus
  • pymilvus
  • search
  • Blueprint
  • flash
  • Jinja2
  • secure_filename
  • url_for
  • Werkzeug
  • chroma
  • HNSW
  • pillow
  • pandas
  • beautifulsoup4
  • langchain-community
  • langchain-core
  • langchain
  • langchain_unstructured
  • libreoffice
  • lxml
  • openpyxl
  • pymupdf
  • python-pptx
  • RAGFlow
  • tabulate
  • sentence_transformers
  • jsonl
  • collections
  • jieba
  • rag_optimize
  • rag
  • rank_bm25
  • Hugging_Face
  • modelscope
  • all-MiniLM-L6-v2
  • ollama
  • rag_measure
  • ragas
  • ASGI
  • FastAPI
  • FastChat
  • Jupyter
  • PyTorch
  • serper
  • uvicorn
  • markdownify
  • NormalizedLevenshtein
  • raq-action
  • CrossEncoder
  • Bi-Encoder
  • neo4j
  • neo4j4python
  • matplotlib
  • Plotly
  • Streamlit
  • py2neo
  • abc
  • read_csv
  • neo4jinstall
  • APOC
  • neo4jproject
  • uv
  • GDS
  • heapq
  • 1. Python图像去水印基本原理
  • 2. 代码
  • 3. 关键代码解析
    • 3.1 图像读取
    • 3.2 水印区域定位
    • 3.3 掩码创建
    • 3.4 图像修复
    • 3.5 结果保存

1. Python图像去水印基本原理 #

图像去水印的核心原理是:

  1. 识别出水印所在的区域
  2. 利用周围像素信息重建被水印覆盖的区域
  3. 使用图像修复算法填充水印区域

2. 代码 #

pip install opencv-python numpy
import cv2
import numpy as np

def remove_watermark(input_path, output_path):
    """去除图片水印的主函数

    参数:
        input_path: 输入图片路径
        output_path: 输出图片路径
    """
    # 1. 读取原始图片
    img = cv2.imread(input_path)
    if img is None:
        print("错误: 无法读取图片文件")
        return

    # 2. 获取图片尺寸
    height, width = img.shape[:2]

    # 3. 估算水印区域(这里假设水印在右下角)
    # 可以根据实际情况调整这些比例
    watermark_height = int(height * 0.10)  # 水印高度占图片高度的10%
    watermark_width = int(width * 0.22)   # 水印宽度占图片宽度的22%

    # 4. 创建掩码(标记水印区域)
    mask = np.zeros((height, width), np.uint8)  # 全黑掩码
    # 将水印区域设置为白色(255)
    mask[height - watermark_height : height, 
         width - watermark_width : width] = 255

    # 5. 使用inpaint算法去除水印
    # 参数说明:
    # - img: 原始图像
    # - mask: 水印区域掩码
    # - 3: 邻域半径(修复时考虑的周围像素范围)
    # - cv2.INPAINT_TELEA: 使用的修复算法
    result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

    # 6. 保存结果
    cv2.imwrite(output_path, result)
    print(f"去水印完成,结果已保存到 {output_path}")

# 使用示例
remove_watermark("input.jpg", "output.jpg")

3. 关键代码解析 #

3.1 图像读取 #

img = cv2.imread(input_path)
  • 使用OpenCV的imread函数读取图片
  • 返回的是一个NumPy数组,包含图像的像素数据
  • 彩色图像的shape为(高度, 宽度, 3)(BGR三个通道)

3.2 水印区域定位 #

watermark_height = int(height * 0.10)
watermark_width = int(width * 0.22)
  • 这里假设水印位于图片右下角
  • 通过图片尺寸的百分比来估算水印区域大小
  • 实际应用中需要根据水印的实际大小调整这些比例

3.3 掩码创建 #

mask = np.zeros((height, width), np.uint8)
mask[height - watermark_height : height, 
     width - watermark_width : width] = 255
  • 创建一个与图片同尺寸的全黑(0)单通道掩码
  • 将水印对应的区域设置为白色(255)
  • 白色区域表示需要修复的部分

3.4 图像修复 #

result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
  • cv2.inpaint()是OpenCV的图像修复函数
  • 参数说明:
    • img: 原始图像
    • mask: 标记修复区域的掩码
    • 3: 邻域半径(修复时考虑的周围像素范围)
    • cv2.INPAINT_TELEA: 使用的修复算法

3.5 结果保存 #

cv2.imwrite(output_path, result)
  • 使用imwrite函数保存处理后的图像
  • 支持多种图像格式(如.jpg, .png等)

访问验证

请输入访问令牌

Token不正确,请重新输入