关于去除图片上的水印

· 浏览次数 : 0

小编点评

随着互联网的普及,水印在图片和视频中越来越常见,有时为了保护版权,需要去除水印。本文介绍了几种常用的去水印方法和工具,并分享了一些经验和技巧。 ### 基于图像修复算法的去水印方法 图像修复算法是一种常见的去水印方法。它将损坏的图像视为图像的一部分,从相邻像素中选取合适的值进行修复。OpenCV和TensorFlow等开源框架都提供了相应的图像修复方法。 #### OpenCV去水印 OpenCV是一种广泛使用的开源计算机视觉库,提供了多种图像处理功能。其中,`cv.inpaint()`方法是基于2004年Alexandru Telea撰写的快速行进方法,以及Bertalmio, Marcelo, Bertozzi和Gillermo Sapiro在2001年的论文实现的。 #### TensorFlow去水印 TensorFlow是谷歌开发的开源深度学习框架,也提供了图像修复功能。可以参考GitHub上的相关项目,如Watermark-Removal-Pytorch和IOPaint。 ### 使用机器学习修复算法 近年来,深度学习技术在图像修复方面的应用逐渐增多。通过训练卷积神经网络(CNN),可以更准确地识别和修复图像中的水印。 #### PyTorch去水印 PyTorch是Facebook的开源深度学习平台,提供了丰富的预训练模型。可以参考GitHub上的Watermark-Removal-Pytorch项目进行尝试。 #### IOPaint去水印 IOPaint是一个基于Web的图像修复工具,可以在本地运行。它可以下载预训练的模型,直接对图片进行去水印操作。具体使用方法可以参考其GitHub页面的介绍。 ### 总结 去水印的方法多种多样,可以根据实际情况选择合适的方法。同时,需要注意的是,使用这些工具时要遵守相关法律法规,尊重原创者的权益。

正文

现在有很多去除水印的工具,但基本上都需要你花钱。作为资深白嫖党,想让我花钱,那是不可能的。

于是我做了下research(search, search, research…),我发现现在的“去水印”基本上都是一个思路:利用图像修复算法。把有水印的地方看作是图像损坏的地方,用相邻像素替换那些损坏的地方。

现在看看有什么开源工具可以用来去除图片上的水印。

1. openCV 图像修复

openCV中就有图像修复的方法,提供了两种算法分别基于_2004 年由 Alexandru Telea 撰写的“基于快速行进方法的图像修复技术”_ 和 Bertalmio,Marcelo,Andrea L. Bertozzi 和 Guillermo Sapiro 在 2001 年的论文“Navier-Stokes,流体动力学和图像和视频修补” 实现。调用cv.inpaint方法时,前者用cv.INPAINT_TELEA标记后者用cv.INPAINT_NS,openCV修复图像的方法使用起来很简单,只需要几行代码:

import numpy as np
import cv2 as cv

img = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png',0)
dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)
# dst = cv.inpaint(img,mask,3,cv.INPAINT_NS)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

上面messi_2.jpg是需要修复的图片,而mask2.png是掩模图片,这张图片的作用是指定图片损坏的位置,该图片只有黑白两色,白色就是损坏的地方。掩模图片和原图的大小(即宽高)必须完全一致,否则会报错。

图片

第一张图像是原图。第二个图像是mask(掩模)。第三个图像是第一个算法的结果,最后一个图像是第二个算法的结果。

对于轻微损坏,或者说只有很少一两个水印的图片,这种方法还是可以的。可是,对于满屏水印的图片怎么办呢?

像这样的:

图片

2. mask图像怎么创建

用openCV去除上面这样图片的水印,首先要面临的问题是mask图片怎么办?

new Bing是这样回答的:

创建掩模图像是图像修复过程中的一个重要步骤。掩模图像用于指示原始图像中需要修复的区域。以下是创建掩模图像的基本步骤:

_1. 打开图像编辑软件:你可以使用任何图像编辑软件,如Photoshop、GIMP或者Paint.NET。
_

2. 导入原始图像:将需要修复的原始图像导入到图像编辑软件中。

3. 创建新图层:在原始图像上创建一个新的图层,用于绘制掩模。

4. 选择画笔工具:使用画笔工具,在新图层上绘制需要修复的区域。通常,我们使用白色来标记这些区域。

5. 填充损坏区域:确保所有需要修复的区域都被白色完全覆盖。如果区域很小,可以使用放大工具来帮助精确>绘制。

6. 保存掩模图像:完成绘制后,只保存包含掩模的图层(通常为白色损坏区域和黑色背景)为一个新的图像文>件,格式可以是PNG或BMP,以保留二值信息。在OpenCV中使用掩模图像时,掩模应该是一个二值图像,其中白色代表需要修复的区域,黑色代表不需要修复的区域。如果你有任何疑问或需要进一步的帮助,请告诉我!

学会了吧?然后,让我展示一下真正的技术:

图片

呐,这就是我根据上面的图片创建的掩模图像。

import cv2

def remove_watermark(image_path, watermark_path, output_path):
    # 读取原始图像和水印图像
    original_image = cv2.imread(image_path)
    watermark = cv2.imread(watermark_path, cv2.IMREAD_GRAYSCALE)
    # 去除水印
    watermark_removed = cv2.inpaint(original_image, watermark, 3, cv2.INPAINT_NS)
    # 保存去除水印后的图像
    cv2.imwrite(output_path, watermark_removed)
# 使用示例
remove_watermark("original_image.jpg", "mask.png", "output_image.jpg")

看一下效果吧:

图片

这效果,真是一言难尽,你说它没去吧,它的确没有水印了;你说它去了吧,这还不如不去…

什么原因呢?难道是因为我涂鸦涂得不好?需要更精确?我想过一个鸡贼的办法:往这网站上传一个纯黑的图片,它加了水印我直接下载下来当mask,但这有点冒险…

于是,让我再展示一下真正的技术:

图片

我把水印提取出来做mask这下够精确了吧。

再看效果:

图片

这玩意,不能说跟原图一模一样,那也的确是没啥差别。我觉得这不是mask文件的问题,mask文件太精确不是好事,应该还是修复算法的问题。

3.机器学习修复算法

既然是算法不行,那,有没有更好的修复算法呢?有,就是使用卷积神经网络(CNN)来提取图像的特征,如边缘、纹理、颜色等信息然后修复。现成的也有:

https://github.com/braindotai/Watermark-Removal-Pytorch 这个是使用Pytorch来训练;

https://github.com/zuruoke/watermark-removal 这个用的是tensorflow。

遗憾的是:这两个,无论用哪一个,你都逃不掉创建mask。为什么不能通过机器学习自己识别水印创建mask呢?Watermark-Removal-Pytorch项目的README中也给出了解释:

图片

总的来说: 做水印识别代价太大,而且效果不好。

当我想试试这两个项目的时候,又发现了另外一个项目:iopaint!这个有web界面可以直接在本地跑起来,而且可以下载训练好的模型直接用!于是我装起来试了一下:

图片

直接涂在水印上就可以去除水印,可以涂一个去一个,也可以全部涂好一起去,一起去除要花得时间长一些。

去除的结果是这样的:

图片

这个效果在我看来已经是非常不错了。还有一个让人惊喜的地方是,它还可以下载mask文件!

图片

有了mask文件你就可以批量去除水印了,当然了,你所有图片水印的位置要都一样。我试了一下,某房产网站的图片水印的位置也都是一样的。如果它不升级更新,你可以用一个mask文件去除水印

iopaint run --model=lama --device=cpu \
--image=/path/to/image_folder \
--mask=/path/to/mask_folder \
--output=output_dir

这个命令的解释:

–image is the folder containing input images,–mask is the folder containing corresponding mask images. When –mask is a path to a mask file, all images will be processed using this mask.

iopaint真的是个不错的项目,可是要用起来,你多少要有点编程知识。不过,iopaint有个机智的地方是:它有windows的一键安装包,但是,你得花钱买。哈哈哈。

声明:文中的水印图片来自互联网,我仅拿来做学习交流的。如果侵权了,可以联系我,我先给您磕一个,然后马上删掉。

参考:

https://apachecn.github.io/opencv-doc-zh/#/docs/4.0.0/9.2-tutorial_py_inpainting

https://github.com/zuruoke/watermark-removal

https://github.com/braindotai/Watermark-Removal-Pytorch

https://github.com/Sanster/IOPaint

https://www.iopaint.com/

-------------------------------

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文: https://wangxuan.me/tech/2024/06/04/watermark-removal.html

与关于去除图片上的水印相似的内容:

关于去除图片上的水印

现在有很多去除水印的工具,但基本上都需要你花钱。作为资深白嫖党,想让我花钱,那是不可能的。 于是我做了下research(search, search, research…),我发现现在的“去水印”基本上都是一个思路:利用图像修复算法。把有水印的地方看作是图像损坏的地方,用相邻像素替换那些损坏的地方

基于Web3.0的区块链图片上传

开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点 什么是Web3.0,和区块链又有什么关系?(上回的文章不就派上用场了) 需求:开发一个基于Python的Web 3.0图片上传系统。这个系统将允许用户上传图片,并将图片存储在去中心化的网络上,同时记录交易信息在区块链上。 本就是写着玩的,

Fake权限验证小例子

前言 关于本地测试如何进行Fake权限验证 正文 在我们使用swagger调试本地接口的时候,我们常常因为每次需要填写token而耽误工作,不可能每次调试的时候都去本地测试环境请求一个token进行验证吧。 上图可能是我们本地测试的时候需要填写的一个token位置,本地测试不方便。 那么怎么伪造权限

联邦学习:联邦异构知识图谱数据划分

在联邦场景下,C个知识图谱位于不同的客户端上。知识图谱拥的实体集合之间可能会存在重叠,而其关系集合和元组集合之间则不会重叠。我们联系一下现实场景看这是合理的,比如在不同客户端对应不同银行的情况下,由于不同银行都有着自己的业务流程,所以关系集合不重叠。本文我们来看具体在实验环节怎么去划分联邦异构知识图谱数据。

C#数据去重的这几种方式,你知道几种?

前言 今天我们一起来讨论一下关于C#数据去重的常见的几种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式。当然欢迎你在评论区留下你觉得更好的数据去重的方式。 使用HashSet去重 HashSet的唯一性: HashSet 中的元素是唯一的,不允许重复值。如果试图添加重复的元素,

关于时间管理的一点建议

在成为 Tech Lead 之后我发现时间变得极度不够用,甚至会成为了我焦虑和殚精竭虑的源泉。因为我无法主动的去做我应该(定方向、做定期回顾)做和想做的事情,而总是被动的被他人牵着鼻子走:无穷无尽的决策请求、寻求帮助、会议邀约。

关于docker-compose up -d 出现超时情况处理

由于要搭建一个ctf平台,用docker一键搭建是出现超时情况 用了很多办法,换源,等之类的一样没办法,似乎它就是只能用官方那个一样很怪。 只能用一种笨办法来处理了,一个个pull。 打个比如: 打开相对应docker-compose.yml文件 可以看到image就是需要去下载的。那么此时你就可以

开源!开源一个flutter实现的古诗拼图游戏

去年(2023年)年底我初学flutter,看了一些文档和教程,想找个东西*练练手。 小时候看过一个关于历史名人儿时事迹的短片,有一集是讲*总理的,有一个细节我记得很清楚:幼年***经常要做一个游戏--有一堆纸片,每片纸上一个字,他要一个一个字拼起*拼成一首诗。 很多年前我就想,或许可以把这个游戏做

如何3分钟,快速开发一个新功能

背景 关于为什么做这个代码生成器,其实主要有两点: 参与的项目中有很多分析报表需要展示给业务部门,公司使用的商用产品,或多或少有些问题,这部分可能是历史选型导致的,这里撇开不不谈;项目里面也有很多CRUD的功能,而这些功能的实现代码基本上差不多,这些功能都去手写,也比较浪费时间而且效率很低,还可能会

ElasticSearch 实现分词全文检索 - 复合查询

boosting 查询可以帮助我们去影响查询后的 score - positive:只有匹配上positive的查询的内容,才会被放到返回的结果中 - negative:如果匹配上和positive并且也匹配上了negative,就可以降低这样的文档 score. - negative_boost:指定系数,必须小于 1.0 关于查询时,分数是如何计算的: - 搜索的关键字在文档中出现的频次越高,