当前位置: 首页 > 后端技术 > Python

用Python去除图片水印,只要有手

时间:2023-03-26 18:42:04 Python

人生苦短,学了Python,有同学问,既然Python那么牛逼,能用Python去除图片水印吗?肯定有这个,但是由于图片水印的种类很多,今天我们就来说说最简单的一种。就是上图中的①型水印。这种水印存在于白底文档中。水印是灰色的,要保留的文字是黑色的。这通常适用于简单的亮度/对比度转换,直到水印消失并降低亮度以进行补偿[1]。参考了别人的方法,发现去除水印的方法有很多种。大体原理类似,先说OpenCV的方法。此方法所需的OpenCV+Numpy库:cv2、numpy。cv2是基于OpenCV的图像处理库,可以对图像进行腐蚀、膨胀等操作;Numpy是用于处理矩阵和维度运算的强大库。功能介绍先介绍一下cv2的三个基本功能:分别使用cv2.imread()、cv2.imshow()、cv2.imwrite()读取、显示和保存图像。img=cv2.imread('test.png')cv2.imshow('test.png',img)cv2.waitKey(0)cv2.imwrite('test_2.png',img)对于Numpy,你需要使用np.clip(),它是一个截取函数,用于截取数组中小于或大于某个值的部分,并使截取的部分等于一个固定值。np.clip(a,a_min,a_max,out=None):具体用法:可以看到数组x中的所有数字都限制在0到5之间,为什么要介绍这些函数呢,接着往下看。颜色转换回到本文的开头,我们想去除文档图像中的水印。在上图中,我选择了三个点,分别对应白色背景、黑色字体和灰色水印。我们现在要做的就是想办法把水印变成白底。也就是说,就是将图片中[217,217,217]的像素点转换成[255,255,255]。当然这个[217,217,217]并不是固定的,只是一个范围而已。为了方便调整,我选择了一些像素点,做了线性回归。我希望改变图片的整体像素颜色。原来的黑色字体要尽量一致,水印部分必须≥255。然后可以通过np.clip()限制间隔,让它们都变成[255,255,255]。只需导入cv2importnumpyasnpimg=cv2.imread('test.png')new=np.clip(1.4057577998008846*img-38.33089999653017,0,255).astype(np.uint8)cv2.imwrite('removed.png',new)看一下调整后的效果(左边是转换前,右边是转换后)。左图:转换前右图:转换后,处理效果还是不错的,说明对于这类文档图片水印,只需几行Python代码就可以轻松去除水印。但是,通过线性回归改变整体图片颜色,也会影响到原来的黑色文字,导致其颜色略有变化。那我们可不可以简单粗暴!只改变水印的颜色怎么样?你也可以试试。PIL+itertoolsPIL也是一个Python图像处理库。Image模块是PythonPIL图像处理中的一个常用模块。对图像进行基本操作的功能基本都包含在这个模块中。Itertools以前被称为零负面评论的Python内置库。其中,itertools.product用于生成多个列表和迭代器的(product)。还是按照之前的原理,我们希望将图片中[217,217,217]的像素点转换为[255,255,255]。那么就简单粗暴了,就是把像素值加起来大约为600(217+217+217)的像素点改成[255,255,255]。从itertoolsimportproductfromPILimportImageimg=Image.open('test.png')width,height=img.sizeforposinproduct(range(width),range(height)):ifsum(img.getpixel(pos)[:3])>600:img.putpixel(pos,(255,255,255))img.save('removed_1.png')结果,比较。左图:转换前右图:转换后,与第一种方法相比,肉眼看不出太明显的区别。然后使用任何你喜欢的方法!这是我们文章的结尾。如果对去水印感兴趣,可以自己动手,敲代码,会有更深刻的体会。喜欢今天的Python实战教程,请继续关注我,有问题也可以在评论区留言