分享

Mathematica给图片去水印

 非线性co7vtwr8 2018-09-10
  1. Photoshop:这个网上搜索教程一大堆。。

  2. 使用去水印专用软件

关于专用软件,由于我的这方面的需求极少,我才不会为了这种破事儿去专门搞一个软件呢。至于Photoshop,我电脑里装有这个,但是一般只用于两件事,有人(比如老板)叫我用photoshop修一下图或者做一个什么图标,还有就是把博客里面上传的图的背景搞成透明(考虑到以后可能博客主题背景不是白色,所以一般图片我都会把背景弄成透明的以适应背景颜色,比如本文下面的大部分图片其实背景都是透明而不是白色的。。),至于PS用于去水印嘛,以前学习PS的时候试过,但是效果感觉不好,果然我就是和PS气场不和。。

对我而言,最幸运的事就是Mathematica正好有一个Inpaint函数可以来修图去水印,更加幸运的是,Mma语法支持直接把图片当做参数直接传进去,这样就把使用的便捷程度Level MAX了!!

对于这个函数,先看几个官方文档里面的几个例子:

e.g. 


e.g. 



e.g. 3



可以看出这个函数本身就很强大,需要两个参数,原图片和抠图的MASK,而且事实上还可以添加第三个参数说明用什么算法来修图,这个我们就不管了,感兴趣的可以去看Mma的文档。


为了实现轻而易举的去水印,我们可以先看一下下面这个极具启发性的例子

它完美地去掉了图片右下的日期标记,而且和上面相比最大的区别是,没有出现黑白的MASK图片了,我给大家解释一下思路,其实它是有Mask的,用的是二值化函数Binarize来生成二值黑白图片,生成的准则是把原图片分成RGB三层(ColorSeparate),然后把所有R层像素值大于255×0.93的设成白色,其余黑色,所以本质还是和上面的一样。【由于考虑到图片可能有损压缩导致边缘模糊,所以最后用了一个形态学处理函数Dilation

以此为基础,我就想到了一个操作上很简单的去水印的方法,比如我们要对下面这幅图去掉左上角的文字和图片中间的人,显然的,还要去掉倒影

然后我们用最传统的工具——————QQ截图,然后在上面用画刷涂抹我们想要去掉的部分,请不要问我是怎么截到QQ截图的画面的

这里涂抹的原则有三个,第一,画刷区域宜大不宜小,第二,请尽量不要不小心在画刷区域留下空洞,哪怕一个像素点!除非你本身刻意而为之,第三,画刷颜色一定要挑图片中没出现过的颜色,比如上图中用到的红色。

然后要做的事情就很简单了,首先和之前一样把纯红色(RGB=#F00)的部分用Binarize扣出来做成模板,然后考虑到QQ截图出来的图不一定可以做到和原图大小一样,所以再来一个缩放MASK图片到与原图一样就可以了。

之后去水印就是一行代码的事儿,最后两个参数分别就是原图和QQ截图画刷处理的图:

Inpaint[#1,ImageResize[Binarize[#2,#=={1,0,0}&], ImageDimensions@#1]]&[img,mask]

结果如下

所以一般我去除水印的方法就是:打开Mma,然后Ctrl C,Ctrl V上面一行代码,把待处理图片直接贴上去,QQ截图抹两下,运行,收工。

没用过Mathematica的同学是不是觉得可以直接把图片作为参数来编程简直爽炸天?!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多