import cv2
import numpy as np
# 1. 读取图片
img = cv2.imread("watermark.jpg")
# 2. 提取水印区域(创建蒙版)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 根据水印颜色调整范围(蓝色水印示例)
lower = np.array([90, 50, 50])
upper = np.array([130, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
# 3. 图像修复(核心)
result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
# 保存结果
cv2.imwrite("result.jpg", result)
方法 2:指定区域去水印(最常用)
适合:水印固定在角落 / 固定位置
import cv2
import numpy as np
img = cv2.imread("watermark.jpg")
# 手动框选水印区域 (x, y, w, h)
x, y, w, h = 50, 50, 200, 80 # 根据你的图片修改
roi = img[y:y+h, x:x+w]
# 创建蒙版
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask[y:y+h, x:x+w] = 255
# 修复
result = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)
cv2.imwrite("result.jpg", result)
方法 3:半透明 / 淡入水印(频域去水印)
适合:图片上的半透明水印、文字水印、Logo 水印(效果最好)
import cv2
import numpy as np
def remove_watermark(img_path):
img = cv2.imread(img_path, 0)
# 傅里叶变换
fft = np.fft.fft2(img)
fft_shift = np.fft.fftshift(fft)
# 屏蔽水印高频区域
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
fft_shift[crow-10:crow+10, ccol-10:ccol+10] = 0
# 逆变换
ifft_shift = np.fft.ifftshift(fft_shift)
ifft = np.fft.ifft2(ifft_shift)
result = 255 * np.abs(ifft)
result = result.astype(np.uint8)
return result
# 使用
img = remove_watermark("watermark.jpg")
cv2.imwrite("result.jpg", img)
全部评论