1. Python图像去水印基本原理 #
图像去水印的核心原理是:
- 识别出水印所在的区域
- 利用周围像素信息重建被水印覆盖的区域
- 使用图像修复算法填充水印区域
2. 代码 #
pip install opencv-python numpyimport 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等)