【超简单】利用Python去除图片水印,太神奇了叭,你还不会嘛?(附三种方法)
前言
哈喽!我是栗子,今天忙里偷闲给大家更新一下文啦~
所有文章完整的素材+源码都在👇文末自取哦!
大家是不是经常遇到一些电子版加了一些水印需要去掉才能用的或是需要加一些水印文字的
呢?
工作的时候,尤其是自媒体工作者,必备水印添加工具以保护知识产权,网上有许多的在线/下
载的水印添加工具,但他们或多或少都存在一些问题!
现在只要你会一些简单的代码就可以搞定这些问题啦~
今天我们就能教大家怎么使用Python超级简单地为图片添加水印啦!超简单滴
正文
图片水印的种类有很多,今天我们先讲最简单的几种。
一、9行Python代码,去除图片中的数字水印
问题描述:
已知某图片带有数字水印,且水印信息嵌入到有效信息的后面,不影响有效信息的阅读。要求
编写Python程序,删除图片中的数字水印信息,把处理后的图片保存为新文件。
测试图片,《Python程序设计基础(第2版)》(董付国,清华大学出版社,
ISBN9787302490562,2020年9月第17次印刷)版权页图片。
原图片——
效果展示——
代码展示——
二、OpenCV+NUmpy、PIL + itertools两种方法
即上图中的①类水印,这种水印存在白色背景上的文档里,水印是灰色,需要保留的文字是黑
色。
这种通常可以进行简单的亮度/对比度转换,直到水印消失并降低亮度以进行补偿[1]。参考别人
的方法,我发现可以用多种方法去除水印。大致原理比较相似,下面先讲OpenCV的方法。
1)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]。
说干就干
import cv2import numpy as npimg = cv2.imread('test.png')new = np.clip(1.4057577998008846*img-38.33089999653017, 0, 255).astype(np.uint8)cv2.imwrite('removed.png', new)
下面我们看看调整后的效果(左侧是转换前,右侧是转换后)。
处理效果还是不错的,说明对于这类文档图片水印,通过几行Python代码就可以轻松去除水
印。不过通过线性回归改变整体图片颜色,也会影响原有的黑色文本,导致其颜色发生了微微
变化。那我们能不能简单粗暴一点!只改变水印的颜色呢?也可以试试。
2)PIL + itertools
PIL也是一个Python 图像处理库,其中Image模块是在Python PIL图像处理中常见的模块,对
图像进行基础操作的功能基本都包含于此模块内。
itertools
之前更是被我们称为一个 零差评的 Python 内置库。其中itertools.product
用来产
生多个列表和迭代器的(积)。
还是跟之前一个原理,我们希望将图片中[217,217,217]的像素点转换成[255,255,255]。
那就简单粗暴一点,也就是像素值相加大概600(217+217+217)以上的像素点,都改成
[255,255,255]就好了。
from itertools import productfrom PIL import Imageimg = Image.open('test.png')width, height = img.sizefor pos in product(range(width), range(height)): if sum(img.getpixel(pos)[:3]) > 600: img.putpixel(pos, (255,255,255))img.save('removed_1.png')
运行结果,对比一下。
这两种方法对比,肉眼也没看出来太明显差别。
那大家就喜欢那种方法就用哪个吧!
总结
今天这篇简单的去水印就到这里了啦!下一期给大家更新添加水印的文章可以嘛?
如果大家还有什么需求,可以评论区给我留言的哦~
✨完整的素材等:也可以滴滴我吖!或者点击文末自取免费拿的哈~
😘往期推荐阅读——
项目1.6 【Pygame小游戏】斗地主我见多了,BUT 这款开源欢乐斗地主,最让人服气~
项目2.2【Pygame小游戏】扫雷游戏50多岁了,但这款我能玩一年~(三个版本集合)
项目0.5 【视频倒放神器】超级玩法:千万不要倒放视频,太魔性了根本停不下来……
项目0.6 【Python小程序】隐藏表白图:“你永远都不知道我喜欢你”(建议保存)
🎁文章汇总——
汇总: Python文章合集 | (入门到实战、游戏、Turtle、案例等)
(文章汇总还有更多你案例等你来学习啦~源码找我即可免费!)
来源:嗨!栗子同学