本文参考自:
观察下面两幅图像,请问这两幅图是相同的吗?
你的答案一定是“没错!”,因为这两幅图确实不存在任何的区别,即使是左下角的文字(浏览器下载时导致的,请忽略哈哈哈)。但是我却要说,第二幅图里面其实藏着一个二维码
怎么样,是不是非常不可思议,那么下面我就来介绍一下这项令人瞠目结舌的技术。并且对其代码的基本原理和部署方式做一个介绍,看完本篇博客,结合附件的代码,你就可以使用这项技术去完成一些你想要应用的场景了~
图片盲水印是一种隐秘信息嵌入技术,能够将水印嵌入到图像中,而不影响其外观和质量。该技术的独特之处在于,嵌入的水印在人眼无法察觉的情况下嵌入,并且在提取过程中无需原始图像。这种方法广泛应用于版权保护、数字内容验证和信息安全等领域,通过复杂的算法确保水印的稳健性和抗攻击性,即使图像经过压缩、裁剪或其他处理,水印仍然能够有效提取和识别。
注意提取关键字,图片盲水印并不需要原图就可以解码出水印信息和原图片。并且还有更神奇的一点就是我们对加有水印的图像进行攻击(例如裁剪,缩放,旋转等)操作后,仍然可以得到盲水印的内容。怎么样,是不是十分神奇?那么接下来我们就一起看看应该如何部署并应用这项技术。
当然再次之前,我们先来看一下核心代码的逻辑。
bwm_core.py 文件实现了一个用于图像盲水印嵌入和提取的核心类 WaterMarkCore。以下是这个文件的主要功能和实现细节:
这个文件提供了一个完整的框架,用于将水印嵌入到图像中并从中提取水印,主要利用了图像处理和信号处理中的 DWT、DCT、SVD 等技术,保证了水印的鲁棒性和隐蔽性
好了,接下来我们就来一步步地部署,实现文本和图片水印的加入~
在正式部署前需要安装以下的库:
numpy>=1.17.0
opencv-python
setuptools
PyWavelets
首先是进行安装,在终端输入如下的pip指令
pip install blind-watermark
或者链接到相应的gihub库,使用git命令进行clone操作:
git clone git@github.com:guofei9987/blind_watermark.git
cd blind_watermark
pip install .
然后介绍如何添加文本水印,在这里为了便捷,可以直接使用命令行的方式来添加水印和解水印,具体的命令如下:
# 嵌入水印:
blind_watermark --embed --pwd 1234 examples/pic/ori_img.png "watermark text" examples/output/embedded.png
# 提取水印:
blind_watermark --extract --pwd 1234 --wm_shape 111 examples/output/embedded.png
其中,密码自己设置,'examples/pic/ori_img.png’换为要添加水印的图片,密码和相应的文本信息自己设置。
解水印的话输入密码,'–wm_shape’为文本信息的字节流长度,‘examples/output/embedded.png’,更换为输出图片的路径和相应的名称。
接下来展示如何将一幅图片作为水印嵌入到另一幅图片中去。
import cv2
from blind_watermark import WaterMark
import os
os.chdir(os.path.dirname(__file__))
bwm = WaterMark(password_wm=1, password_img=1)
# 读取原图
bwm.read_img(filename='pic/Lena_512x512.jpg')
# 读取水印
bwm.read_wm('pic/watermark.png')
# 打上盲水印
bwm.embed('output/embedded.png')
wm_shape = cv2.imread('pic/watermark.png', flags=cv2.IMREAD_GRAYSCALE).shape
# %% 解水印
bwm1 = WaterMark(password_wm=1, password_img=1)
# 注意需要设定水印的长宽wm_shape
bwm1.extract('output/embedded.png', wm_shape=wm_shape, out_wm_name='output/wm_extracted.png', mode='img')
在使用的时候将相应的图片和路径名称进行更改即可。
好了,以上就是整个的部署和代码的使用流程,如果感兴趣的话,就赶快下载附件进行尝试吧!
为了实现用户的便捷操作,我在原有的代码基础上开发相应的UI界面。
可以帮助用户在不调用命令行或者手动运行程序的基础上进行快速的添加水印以及解水印的操作,具体的展示页面如下图所示,相关代码位于附件的UI文件夹下。
首先选择想要嵌入水印的图像,然后选择嵌入的水印格式。以图片水印为例,依次选择图像和水印图片后,点击“嵌入水印”,选择好保存的位置以及为添加水印后的图片命名。
很多小伙伴可能会误认为盲水印就是图片隐写术,实际上二者还是有很大区别的,下面我就进行详细地介绍。
盲水印和图片隐藏(隐写术)虽然都涉及将信息嵌入到图像中,但它们的目的、应用和实现方式有一些显著区别:
总结来说,盲水印和图片隐藏虽然在技术上有一些重叠,但它们的核心目的和应用领域不同。盲水印注重稳健性和版权保护,而图片隐藏则注重隐蔽性和秘密通信。
编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有