📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹
❀ 你知道什么是图片盲水印吗?
对返回意见的修改内容为:
1、修改内容来源为转载,并附带了相应的gihub链接;
2、为了能够对附件定价,开发了基于python程序的UI界面,可以快速实现图片的盲水印和去水印操作,添加内容为标题“UI界面实现盲水印添加”的部分,以图片加动图的形式进行了展示,可以帮助用户更快更便捷地实现盲水印操作,并且在一定程度上进行了包装和优化。
本文参考自:
- text_blind_watermark (文本盲水印,把信息隐秘地打入文本): >https://github.com/guofei9987/text_blind_watermark
- HideInfo(藏物于图、藏物于音、藏图于文):https://github.com/guofei9987/HideInfo
概述
观察下面两幅图像,请问这两幅图是相同的吗?
你的答案一定是“没错!”,因为这两幅图确实不存在任何的区别,即使是左下角的文字(浏览器下载时导致的,请忽略哈哈哈)。但是我却要说,第二幅图里面其实藏着一个二维码
怎么样,是不是非常不可思议,那么下面我就来介绍一下这项令人瞠目结舌的技术。并且对其代码的基本原理和部署方式做一个介绍,看完本篇博客,结合附件的代码,你就可以使用这项技术去完成一些你想要应用的场景了~
本文所涉及的所有资源的获取方式:这里
图片盲水印
图片盲水印是一种隐秘信息嵌入技术,能够将水印嵌入到图像中,而不影响其外观和质量。该技术的独特之处在于,嵌入的水印在人眼无法察觉的情况下嵌入,并且在提取过程中无需原始图像。这种方法广泛应用于版权保护、数字内容验证和信息安全等领域,通过复杂的算法确保水印的稳健性和抗攻击性,即使图像经过压缩、裁剪或其他处理,水印仍然能够有效提取和识别。
注意提取关键字,图片盲水印并不需要原图就可以解码出水印信息和原图片。并且还有更神奇的一点就是我们对加有水印的图像进行攻击(例如裁剪,缩放,旋转等)操作后,仍然可以得到盲水印的内容。怎么样,是不是十分神奇?那么接下来我们就一起看看应该如何部署并应用这项技术。
核心代码逻辑
当然再次之前,我们先来看一下核心代码的逻辑。
bwm_core.py 文件实现了一个用于图像盲水印嵌入和提取的核心类 WaterMarkCore。以下是这个文件的主要功能和实现细节:
- 类的初始化和配置 (init 方法):
初始化了图像块的大小、密码、模式、进程数量等参数。
初始化了图像和水印相关的各种数据结构。 - 图像预处理 (read_img_arr 方法):
将输入图像转换为 YUV 颜色空间,并添加白边以保证像素数为偶数。
使用离散小波变换(DWT)将图像分成四个频域子带,并将其转换为四维数组以便后续处理。 - 读取水印 (read_wm 方法):
读取水印比特流并存储。 - 水印嵌入 (embed 方法):
初始化图像块的索引。
对图像的每个块进行离散余弦变换(DCT)、奇异值分解(SVD),然后嵌入水印。
将嵌入水印后的块进行逆变换,恢复成完整图像。 - 水印提取 (extract 方法):
从图像中提取嵌入的水印比特流。
使用聚类算法(K-means)对提取的水印比特进行处理,恢复出水印。 - 辅助函数:
one_dim_kmeans:一维 K-means 聚类算法,用于水印比特的二值化处理。
random_strategy1 和 random_strategy2:生成用于块处理的随机策略。
这个文件提供了一个完整的框架,用于将水印嵌入到图像中并从中提取水印,主要利用了图像处理和信号处理中的 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界面。
可以帮助用户在不调用命令行或者手动运行程序的基础上进行快速的添加水印以及解水印的操作,具体的展示页面如下图所示,相关代码位于附件的UI文件夹下。
- 首先展示如何为图片添加水印
首先选择想要嵌入水印的图像,然后选择嵌入的水印格式。以图片水印为例,依次选择图像和水印图片后,点击“嵌入水印”,选择好保存的位置以及为添加水印后的图片命名。
- 解水印的过程如下,首先选择“嵌入水印的照片”,然后选择水印的形式为“图片水印”,输入水印图片的宽和高(中间用英文的逗号隔开),提取水印即可。水印图片会自动保存到代码目录下。
盲水印技术与图片隐写术的区别
很多小伙伴可能会误认为盲水印就是图片隐写术,实际上二者还是有很大区别的,下面我就进行详细地介绍。
盲水印和图片隐藏(隐写术)虽然都涉及将信息嵌入到图像中,但它们的目的、应用和实现方式有一些显著区别:
- 目的:
盲水印:主要用于版权保护、内容验证和防伪。它通过在图像中嵌入不可见的标识来证明所有权或验证内容的真实性。盲水印的设计目标是稳健性,即使图像经过各种操作(如压缩、裁剪、滤波等),水印仍然可以被提取和识别。
图片隐藏(隐写术):主要用于秘密通信或数据隐藏。其目的是在图像中嵌入秘密信息,使其不被察觉。隐写术的设计目标是隐蔽性,即嵌入信息后的图像在视觉上与原图无异,不引起怀疑。 - 应用领域:
盲水印:广泛用于数字版权管理、数字签名、内容认证和防伪等领域。例如,数字图片或视频可以嵌入版权信息,防止未经授权的复制和分发。
图片隐藏(隐写术):通常用于信息安全和隐私保护。例如,隐藏敏感信息以避免被第三方检测到,或者用于秘密传输消息。 - 技术实现:
盲水印:通常使用频域变换(如离散余弦变换DCT、离散小波变换DWT)和奇异值分解(SVD)等技术,将水印嵌入到图像的特定频域系数中。嵌入的水印信息在视觉上不可见,并且具有一定的鲁棒性。
图片隐藏(隐写术):常见的方法包括最低有效位(LSB)替换、扩频技术和变换域技术(如DCT、DWT)。LSB替换是一种简单且广泛使用的方法,将秘密信息嵌入到图像像素的最低有效位中。 - 提取方式:
盲水印:提取水印时通常不需要原始图像,只需知道嵌入水印时使用的密钥或算法。
图片隐藏(隐写术):提取隐藏信息时可能需要知道嵌入信息的具体位置和方法,有时也需要原始图像进行对比。
总结来说,盲水印和图片隐藏虽然在技术上有一些重叠,但它们的核心目的和应用领域不同。盲水印注重稳健性和版权保护,而图片隐藏则注重隐蔽性和秘密通信。
编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!
更多内容详见:这里