【原创】python + OpenCV去除简单水印

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2022-8-16

代码讲解 + 原理分析 + 带你算一遍[茶杯]

[礼物]代码见【图一】,我也开源到gitee啦,白嫖直接见文末

[灯泡]快速过一遍原理,后面细讲:
获取水印颜色,获取背景颜色,将水印的颜色替换为背景颜色,怎么样,至少原理还是很简单吧[滑稽],不要觉得原理是触不可及的高深内容(虽然实现起来稍微花点时间就是了)

主要是怕你们都嫌麻烦直接划走了(/_\),先讲讲简单的原理,留住一点人(卑微),之前的帖子都没几个人回复,估计大部分是点进来划一下就走了~

[灯泡]目前只做了去除简单灰色水印(且主题文字为黑色),咱这个思路只适合最【简单的水印】去除,复杂的建议还是用ps自己慢慢用图章工具抹吧

[灯泡]稍有门槛,前置知识:
线性回归,python,Numpy,OpenCV,rgb基础认知

但我会尽量用基础的表达来阐述整个过程[玫瑰],同时,涉及到的知识点我也会用【[灯泡]】符号强调

其实蛮早以前就实现过去水印,那个时候参数都是参考别人训练好的数据,这次重新自己实现了一次,感觉还是蛮有收获的(对于业余爱好者来讲)

[彩虹]那么开始正文

应该都见过【图二】这种水印吧,灰色稍透明点,本文主要针对这种水印,还有嗷,图片去水印目前还没有实现,最好不要轻易尝试,会破坏原有颜色

[灯泡]【rgb颜色表示法】
r即red红,g即green绿,b即blue蓝,这种颜色表示法中rgb为三原色,其余颜色均为这三者混合而来

由于一个色块大小为8bit,所以按十进制来算,它的取值范围是0-255【重点】,值越小越亮,越大越暗,比如rgb(255,0,0),由于r红的位置为255最亮,所以整体呈红色,那么同理rgb(0,255,0),g位置255,为绿

(0,0,0)即三个颜色亮度都最低,自然就是黑色,相反(255,255,255)就是白色了

[灯泡]【颜色获取】
那么如何获取颜色呢?比较简单的方式是找个截图软件拾取(qq自带,ctrl + alt +a,质量一般,我更喜欢snipaste)【图三】,背景肯定是纯白了,然后再获取文字颜色(这步是为了防止文字变色过多)

[灯泡]【线性回归计算】(重点)
[玫瑰]不要看到数学就怕,认真思考,具备初中到高中的数学水平一般就能看懂啦,我直接上图手算了(只选了6个点)【图四】

首先我们需要黑色的采样(文字颜色),然后是水印采样和背景采样,我分别选了六个点,我们的目的很简单,就是把水印色替换为背景色,并且尽量保证文字颜色变化不大

现在可以开始列线性回归方程了【图五】,这个是很简单的线性回归,直接带点然后套公式就行了,比较复杂的用计算机或者py就行了【图六】,最终得到如【图七】公式

[灯泡]将公式交给Numpy计算【图一】
(可能选的点少了点,精度不够,我又自行调了下参数,最终按图一给出的数值即可)

n.clip是负责限制值域的函数,第一个参数是列表,剩下为最小值和最大值

如n.clip([0,1,2,3,4], 1, 3),最终会得到[1,1,2,3,3](超过部分设置为最大值),前文也说了颜色最大值为255,这么做是为了保证不超量

最终效果见【图九】

(好像一次只能用15个表情。。)
[彩虹]那么本文就到此为止啦(●'◡'●)

[礼物]gitee开源地址:

本帖含有隐藏内容,请您 回复 后查看


有疑问可以在评论区留言[玫瑰]

[彩虹]pluie
[彩虹]2022-08-16

31楼
玫瑰疯了 2022-8-20
Java才是
32楼
昵称455669 2022-8-20
牛逼牛逼!
33楼
Pluie 2022-8-20
。。不,java还差的远呢,和c++,c#,rust,golang差了一个档次,和c又差了一个档次,和汇编又差了一个档次
34楼
Pluie 2022-8-20
[玫瑰][玫瑰][玫瑰]感谢支持
35楼
hu 2022-8-20
可以解释一下为啥要做回归方程吗?我查出那个点的rgb值之后直接遍历整个图替换背景对应RGB值在这个图上应该效果和你的差不多
36楼
Pluie 2022-8-20
暴力求解不适合离散过大的应用场景(不过刚好本贴的素材是比较简单的)
37楼
Pluie 2022-8-20
线性回归是为了对自变量和因变量进行建模,简单来说:是可以遍历,但没必要,所有我用线性回归推导

当然,文章开头也说了,这是简单的水印,所以你这种暴力去除理论上也可以获得差不多的效果,但不是好习惯,同时更加复杂的场景就用不了了(比如背景是变化的,或者水印颜色差距大)

再举个简单的例子,从1加到100,你是用for遍历相加效率高,还是(1+100)/2效率高呢
38楼
hu 2022-8-20
可以试一下深度学习分割出文字区域的mask,然后直接让mask和原图相乘,这个不需要每次根据水印颜色调整回归方程
39楼
Pluie 2022-8-20
这样就要训练模型咯,而且缺点也很明显,水印处不可避免的会有一层模糊遮罩,对于图不多的情况来说,不如直接ps顺手[滑稽]
40楼
往事种种 2022-8-20
好帖,收藏有时间慢慢看

评论

登录后才可发表内容
  • 主题

    18

  • 帖子

    426

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.0431s Mem:2166Kb