简单!Python+OpenCV三步去除水印
作为一个不会用PS的我,每当在工作中遇到一些要去除水印的图片,我只能通过手机或者PPT(没错,PPT的删除背景功能真的很强大)。如此以往,我觉得生活不能再这么继续下去,ok!编个代码吧!
Step 1 思路要清楚
还是用把大象装进冰箱的思路,简单的捋一捋去除水印的步骤
- 识别出水印
- 哼哼哈兮(例如腐蚀,膨胀等一些不知道原理也不影响的东西)的处理
- 还原图片
简略的分析一下之后就可以开工了,后面会详细说怎么处理的
Step 2 准备库
这次的库比较简单一个cv2和一个numpy
cv2可以对图像进行腐蚀,膨胀等操作,用来做一个人脸识别也是没问题的
numpy是用来处理大数据的,然而这里主要运用它处理矩阵的能力,因为图片在计算机里都是以矩阵形式存在的
- import cv2 #基于OpenCV的图像处理库
- import numpy #这是一个强大的处理矩阵和维度运算的库
Step 3 编代码了鸭
因为这次代码比较简单我先直接粘成品
import cv2
import numpy as np
path = "路径.格式" #记得不要有中文路径
img = cv2.imread(path)
height,width = img.shape[0:2]
#开始操作
thresh = cv2.inRange( img,np.array([0,0,0]),np.array([192,192,192]) )
scan = np.ones( (3,3),np.uint8)
cor = cv2.dilate(thresh,scan,iterations=1)
specular = cv2.inpaint(img,cor,5,flags=cv2.INPAINT_TELEA)
#操作结束,下面开始是输出图片的代码
cv2.namedWindow("image",0)
cv2.resizedWindow("image",int(width/2),int(height/2))
cv2.imshow("image",img)
cv2.namedWindow("modified",0)
cv2.resizeWindow("modified",int(width/2),int(height/2))
cv2.imshow("modified",specular)
cv2.waitKey(0)
cv2.destroyAllWindows()
#代码纯手打,如果run不出优先检查错别字
ok我们开始逐步分析
这是我要去除水印的图片,为了增加点难度,我在原图中间还乱涂乱画了
这个是通过inRange函数搞定的,这个是个二值化的操作。简单来说,在后面的参数输入一段颜色范围,符合的填1,不符合的填0
如果只运行
thresh = cv2.inRange( img,np.array([0,0,0]),np.array([192,192,192]) )
后面的(0,0,0)-(192,192,192)是灰色的RGB取值范围
附上一部分RGB颜色区域
效果如图
我们不难看出很大一部分的水印都被提取出来了,然后就很愉快呢
这里我们开始腐蚀特征,这样可以让图片看上去更加贴切和吻合
在上一步的基础上运行
scan = np.ones( (3,3),np.uint8)
cor = cv2.dilate(thresh,scan,iterations=1)
效果如图
嗯,没啥差别。因为我们腐蚀步骤就1(iterations=1)大家有兴趣可以加数字,效果会更加明显
最后通过inpaint函数了,这个函数就厉害了,大家自己百度吧。我一句两句说不清楚
通过inpaint我们就能得到去除水印的图啦
好的,今天的教学到此为止。
对python有兴趣的可以
https://blog.csdn.net/Maximun/article/details/85064274