使用基本图像处理技术进行水印去除,主要采用OpenCV提供的库函数以及基本的图像处理进行图像修复,但是从鲁棒性方面可能存在不足。处理的图像可能存在一定的模糊水印去除不完整、留边等问题。本文参考了部分其他内容已在后文引用。
目前常用的水印去除方法主要使用深度学习相关前沿技术进行解决,详情可参考笔者博客:
使用深度学习技术进行水印去除
测试案例
第一种方法:
该方法看着是不是很简单?没错就这么几行代码,但是这种方式需要一个美工,让他配合你做一张di.png
di.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # 方式一 import cv2 def get_water(): # 黑底白字 src = cv2.imread( 'yuan.png' ) # 默认的彩色图(IMREAD_COLOR)方式读入原始图像 # black.jpg mask = cv2.imread( 'di.png' , cv2.IMREAD_GRAYSCALE) # 灰度图(IMREAD_GRAYSCALE)方式读入水印蒙版图像 # 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果较好) dst = cv2.inpaint(src, mask, 3 , cv2.INPAINT_NS) cv2.imwrite( 'result1.jpg' , dst) get_water() |
看完上面这么多废话,其实你就想看看效果如何,那么来看一下该方式效果图
是不是想说效果很差,其实在我所测试使用的方法中,这种方法已经算是效果不错的了。别着急走,下面还有一种比这效果更好的方式
第二种方式:
还是以上一张图片为例,这种方式还是需要美工配合,只是图片变了,同时换了一种算法模式,但是注意该方法效率不高,使用该图片时
跑一次代码就行了,但是若是别的图片,你可能需要跑几遍代码之后,才能出现最终效果(若你发现采用该方式去除水印,发现去除后的效果,
只是水印颜色变淡了,那么请你在对处理过的图,再次执行该代码,如此多次之后,请用肉眼识别最好的效果)
di2.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 方式二 import cv2 import numpy def get_water2(): src = cv2.imread( 'yuan.png' ) mask = cv2.imread( 'di2.png' ) 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( 'result2.jpg' , save) get_water2() |
不多说直接,上效果图
这两种方式,是相对来说效果很好的去除水印方式,也就是”人工”去除水印,但是该两种方式并不能满足我的要求,我需要大批量,高效率的去除水印,等我下一篇文章再来分享吧
参考:
https://www.jianshu.com/p/cc94a78e14e2
https://mp.weixin.qq.com/s/UfLkle4raCPIZvBLdswXkA