【原创】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

沙发
Pluie 2022-8-16
啊我忘了发开源地址了,稍等下
地板
昵称181186 2022-8-16
ᴾʸᵀʰ⁰ⁿ
4楼
Pluie 2022-8-16
[茶杯]还行吧,主要的实现是C++,py只是语法简单,库还多,充当应用层胶水了
5楼
水啊 2022-8-16
大佬[玫瑰]
6楼
Pluie 2022-8-16
[玫瑰]过誉了,我只是对这块感兴趣,算业余的吧,只是可能研究这块的相对较少(/_\),凯特社区里不常见
7楼
Pluie 2022-8-16
【补充】已更新路径输入
8楼
昵称930654 2022-8-17
255是白色吧,0是黑色
9楼
Pluie 2022-8-17
[玫瑰]嗯对,我文章写错了么?我去看看
10楼
Pluie 2022-8-17
确实写错了,感谢提醒[玫瑰]

评论

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

    18

  • 帖子

    426

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.0317s Mem:2158Kb