除掉彩色水印的简单方法
有一张下面这样的彩色图片,白底黑字上有蓝色水印:
用photoshop之类软件处理特别麻烦,上网找去背景网站消除或者相关AI工具效果也不一定好,特别是如果这种图片有一整本数百页的书,那就更麻烦。考虑到这种水印的颜色与文字相比差异很大,因此,可以考虑利用OpenCV将其转换为hsv模式,这时候会发现水印部分的v值比文字部分的v值(可以在gimp或者photoshop中查看)大得多,用python代码处理起来就很方便了。如下代码可将上面的示例图片中的蓝色水印消除:
import cv2
import numpy as np
def remove_color_watermark(image_path, thres):
"""
:param image_path: 图片路径
:param thres: V值的阈值
:return: 除掉水印后的图片
"""
# 读取图片
img = cv2.imread(image_path)
if img is None:
print("无法读取图片,请检查图片路径。")
return
# 转换到HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 某像素点的V值大于阈值则将其转换为白色
img[hsv[:, :, 2] > thres ] = [255, 255, 255]
return img
# 请替换为你的图片路径
image_path = f"path\\to\\orig\\img.jpg"
result = remove_color_watermark(image_path, 230)
if result is not None:
# 显示原始图片和处理后的图片
cv2.imshow('Original Image', cv2.imread(image_path))
cv2.imshow('Processed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存处理后的图片
cv2.imwrite('processed_image.jpg', result)
处理效果如下:
似乎还是很不错的。下面的代码可以将整个文件夹中所有相同水印的图片处理后输出为一个pdf文件:
import cv2
import os
from PIL import Image
def remove_color_watermark(image_path, thres):
# 读取图片
img = cv2.imread(image_path)
if img is None:
print("无法读取图片,请检查图片路径。")
return
# 转换到HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 某像素点的v值大于阈值则将其转换为白色
img[hsv[:, :, 2] > thres] = [255, 255, 255]
return img
if __name__ == '__main__':
image_path = 'folder\\path\\to\\orig'
out_path = 'path\\to\\output\\folder'
thresh = 230
images = []
for filename in os.listdir(image_path):
if filename.endswith(('.jpg', '.jpeg', '.png', '.bmp', '.tiff')):
img = remove_color_watermark(os.path.join(image_path, filename), thresh)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# OpenCV图片转换为pillow图片
pillow_image = Image.fromarray(img)
print(f'{filename}已经处理完毕。')
# 加入pillow图片数组,为输出PDF文件做准备
images.append(pillow_image)
# 将处理后的图片输出为PDF文件
images[0].save(os.path.join(out_path,'output.pdf'), save_all=True, append_images=images[1:])