1 代码
import cv2
import numpy as np
def remove_watermark(image_path, output_path):
# 读取图片
image = cv2.imread(image_path)
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用中值滤波去除噪声
median_filtered = cv2.medianBlur(gray, 5)
# 计算图像的梯度
laplacian = cv2.Laplacian(median_filtered, cv2.CV_64F)
# 将梯度图像转换为8位无符号整数
laplacian_8u = np.uint8(np.absolute(laplacian))
# 使用阈值操作找到潜在的水印区域
_, thresholded = cv2.threshold(laplacian_8u, 30, 255, cv2.THRESH_BINARY)
# 对阈值图像进行形态学操作,填充孔洞并平滑边缘
kernel = np.ones((3, 3), np.uint8)
closing = cv2.morphologyEx(thresholded, cv2.MORPH_CLOSE, kernel, iterations=2)
# 创建一个掩码,将潜在的水印区域设置为白色
mask = np.zeros_like(image)
mask[closing == 255] = [255, 255, 255]
# 将掩码转换为单通道图像
mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
# 使用掩码去除水印
result = cv2.inpaint(image, mask_gray, 3, cv2.INPAINT_TELEA)
# 保存去水印后的图片
cv2.imwrite(output_path, result)
remove_watermark('input.jpg', 'output.jpg')
2 去水印效果
图2-1 去水印前后对比
从图2-1可以看出并没有完美去除水印,这是由水印与背景颜色接近造成的,后面我会用深度学习的方法探索一番。