python利用opencv去除水印方法
OpenCV(Open Source Computer Vision Library)是一个跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法
在python中可以利用opencv来去除水印
opencv安装
window10
OpenCV 3:http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
Numpy:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
将下载好的whl文件放置到一个方便的目录,打开cmd,安装
pip install xxx
测试
import cv2
没有报错则说明成功
参考自https://www.ywlib.com/archives/39.html
下面开始去除水印, 使用58图片做测试
基于OpenCV的两种去水印方案
1. 基于 inpaint 方法(网上的方法,处理质量较低)
- 算法理论:基于Telea在2004年提出的基于快速行进的修复算法(FMM算法),先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点
- 处理方式:由ui人员制作出黑底白色水印且相同位置的水印蒙版图(必须单通道灰度图),然后使用inpaint方法处理原始图像,具体使用时可把水印区放粗,这样处理效果会好点
需要带水印的图,和该图一样大小的的黑底白色水印且位置相同的水印图
test_dir = 'xxx' mask_dir = 'xxx' save_dir ='xxx' src = cv2.imread(rental_dir) mask = cv2.imread(wm_dir, cv2.IMREAD_GRAYSCALE) dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_TELEA) cv2.imwrite(save_dir, dst)
2. 基于像素的反色中和(处理质量较高)
参考自ps去水印原理,通过一张白底的反色水印图来中和原图水印
需要到水印的图,和该图一样大小的白底棕色(128,128,128)的水印且位置相同的水印图,128的效果比较好
test_dir = 'xxx' mask_dir = 'xxx' save_dir ='xxx' src = cv2.imread(test_dir) mask = cv2.imread(mask_dir) save = numpy.zeros(src.shape, numpy.uint8) for row in range(src.shape[0]): for col in range(src.shape[1]): for channel in range(src.shape[2]): if mask[row, col, channel] == 0: val = 0 else: reverse_val = 255 - src[row, col, channel] val = 255 - reverse_val * 256 / mask[row, col, channel] if val < 0: val = 0 save[row, col, channel] = val cv2.imwrite(save_dir, save)
第二种方面明显比第一种要好,但是水印的边角处理不好,可以先用二在用一,效果会更好
参考自https://my.oschina.net/u/2400083/blog/732321