数字水印 | 盲水印嵌入:量化索引机制 QIM

目录

    • 1 什么是量化索引调制?
      • 1.1 为什么使用 QIM?
      • 1.2 QIM 的算法思想
      • 1.3 什么是量化操作?
      • 1.4 论文中对 QIM 的介绍
    • 2 盲水印论文中的实际应用
      • 2.1 均匀量化器
      • 2.2 对论文的分析


😇说明:本文中的载体信息 == 原始信息



1 什么是量化索引调制?

量化索引调制 是一种基于量化思想的非线性信息隐藏技术。基于量化思想的水印嵌入模型的主要目的是为了实现水印信息的 盲检测,即不需要原始载体就可以直接从载体中提取水印信息。其主要思想是根据水印信息的不同将原始载体数据量化到不同的量化区间,提取水印信息时根据载体数据所属的量化区间来识别对应的水印信息。

Quantization Index Modulation,QIM



1.1 为什么使用 QIM?

基于量化思想的水印嵌入模型旨在实现水印信息的盲检测,使得我们可以直接从载体信息中提取水印信息,而无需依赖原始的载体信息。其核心思想是根据水印信息的差异,将原始的载体信息量化到不同的量化区间。在提取水印信息时,通过识别载体信息所处的量化区间来确定相应的水印信息。

注意:不加前缀的 “载体信息” 指的是嵌入水印后的载体信息,“原始的载体信息” 指的是嵌入水印前的载体信息。



1.2 QIM 的算法思想

假设水印信息是一个二进制信息,即仅由 0 0 0 1 1 1 组成。我们设置两个量化器 Q 0 Q_0 Q0 Q 1 Q_1 Q1,分别对应水印信息为 0 0 0 1 1 1 的情况。

个人理解:量化器听起来高级,但感觉本质上就是若干数值的集合,即一个值域。

在嵌入水印信息时,我们根据水印信息为 0 0 0 还是为 1 1 1,分别选择量化器 Q 0 Q_0 Q0 Q 1 Q_1 Q1 对载体信息进行量化,得到量化后的载体信息。

你没有看错!虽然量化器是根据水印信息选择的,但它处理的是载体信息,而非水印信息。

在提取水印信息时,让 Q 0 Q_0 Q0 Q 1 Q_1 Q1 分别对载体信息进行量化,相应地得到两个量化的结果。

注意:载体信息在信道传输中可能发生变化,不一定等于嵌入水印时的量化结果。

Q 0 Q_0 Q0 所对应的量化结果与载体信息之间的距离为 d 0 d_0 d0,令 Q 1 Q_1 Q1 所对应的量化结果与载体信息之间的距离为 d 1 d_1 d1。如果 d 0 < d 1 d_0<d_1 d0<d1,那么认为被嵌入的水印信息为 0 0 0;如果 d 0 > d 1 d_0>d_1 d0>d1,那么认为被嵌入的水印信息为 1 1 1

个人理解:所谓的距离,其实就是两个数值之间的差值。



1.3 什么是量化操作?

画二维图只是为了方便说明,并不代表 Q 0 Q_0 Q0 Q 1 Q_1 Q1 的值域就很复杂

现在需要将一个水印信息嵌入到载体信息当中。假设 A A A 点代表的是一个载体信息,黄色的点表示量化器 Q 0 Q_0 Q0 所包含的元素,绿色的点表示量化器 Q 1 Q_1 Q1 所包含的元素。如下图所示:

在这里插入图片描述

如上图所示, 1 1 1 号点是 Q 0 Q_0 Q0 中距离 A A A 最近的元素, 2 2 2 号点是 Q 1 Q_1 Q1 中距离 A A A 最近的元素。如果待嵌入的水印信息是 0 0 0,那么使用 1 1 1 号点的值替换掉 A A A 的值;如果待嵌入的水印信息是 1 1 1,那么使用 2 2 2 号点的值替换掉 A A A 的值。

个人理解:所谓的量化过程,就是使用相应量化器中距离载体信息最近的值,替换掉载体信息原始的值。比如,由于我们在 1.2 节规定 Q 0 Q_0 Q0 中的元素都对应着 0 0 0,而现在又把载体信息的值替换成了 Q 0 Q_0 Q0 中的一个元素,因此在提取水印时我们就能通过载体信息知道水印信息是 0 0 0 了。至于为什么要选择距离载体信息最近的值,当然是因为我们希望图像的质量不要受到太大的改动。



1.4 论文中对 QIM 的介绍

Q I M \mathsf{QIM} QIM 是将一个水印信息嵌入到一个原始信息中,从而产生一个复合信息的方法。例如,将一个比特信息 m m m 嵌入到原始信息 x x x 中,得到的复合信息可以表示为如下形式:

s ( x , m ) = { Q 0 ( x ) ,   i f   m = 0 Q 1 ( x ) ,   i f   m = 1 s(x,m)= \left\{\begin{matrix} Q_{0}(x),\ \mathrm{if}\ m=0 \\ \\ Q_{1}(x),\ \mathrm{if}\ m=1 \end{matrix}\right. s(x,m)= Q0(x), if m=0Q1(x), if m=1

其中 Q 0 Q_0 Q0 Q 1 Q_1 Q1 是值域不相交的两个量化器, m m m 是待嵌入的水印信息,复合信息 s ( x , m ) s( x , m) s(x,m) 在本质上是一个隐写信息。

量化器对原始信息进行量化处理,使得处理后的原始信息成为该量化器中的一员。

嵌入的水印信息可以使用最小距离解码器提取:

m ′ = a r g m ∥ y − s ( y , m ) ∥ m'=\mathrm{arg}_m\left \| y-s(y,m) \right \| m=argmys(y,m)

其中 m ′ m' m 是根据接收到的信息 y y y 提取出的水印信息, a r g m \mathrm{arg}_m argm 是用于产生 m m m 的参数,即 ∥ y − s ( y , m ) ∥ \left \| y-s(y,m) \right \| ys(y,m) 取最小值时 m m m 的取值。

注意:理论上 y y y 应该等于 s ( x , m ) s(x,m) s(x,m),其值位于某个量化器的值域中。但是 y y y 在传输的过程中可能发生了变化而不再等于 s ( x , m ) s(x,m) s(x,m),从而无法直接通过 y y y 的值来判断嵌入的水印信息到底是 0 0 0 还是 1 1 1。因此我们对 y y y 进行量化 s ( y , m ) s(y,m) s(y,m),以得到两个量化器中离 y y y 最近的元素,分别是 Q 0 ( y ) Q_0(y) Q0(y) Q 1 ( y ) Q_1(y) Q1(y),然后再看 y y y 离哪个量化器的元素更近。“更近” 在某种程度上意味着 y y y 原本的值应该就是这个值。

可以看出,论文中对 Q I M \mathsf{QIM} QIM 的介绍和前文的介绍是一致的。在嵌入水印时,根据水印信息选择相应的量化器对原始信息进行处理;在提取水印时,通过判断原始信息距离哪个量化器的元素更近,来判断嵌入的水印信息是 0 0 0 还是 1 1 1



2 盲水印论文中的实际应用

在第 1 节中,我们讲的都是 Q I M \mathsf{QIM} QIM 的抽象概念,没有落实具体的做法。比如:我们并没有介绍 Q ( ⋅ ) Q(\cdot) Q() 量化器的函数公式是什么。接下来,我将介绍我在论文中看到的真实做法。



2.1 均匀量化器

论文中具体采用的是均匀量化器。

量化器 Q 0 Q_0 Q0 Q 1 Q_1 Q1 的元素之间的最小距离 d m i n d_{min} dmin 通常被称为 Δ \Delta Δ 量化步长:

在这里插入图片描述

量化步长 Δ \Delta Δ 可以用于衡量算法的鲁棒性,一般来说 Δ \Delta Δ 越大,算法的鲁棒性越强。

个人理解:均匀步长是指任意且相邻的两个元素之间的距离是相同的。

我们在 1.4 节提到, Q 0 Q_0 Q0 Q 1 Q_1 Q1 是值域不相交的两个量化器。

通常采用如下方式来为两个量化器分配值域:

在这里插入图片描述

这是一个实数数轴,任意两个端点之间的距离均为 Δ \Delta Δ,即每个区间的长度均为 Δ \Delta Δ

然后再将一个一个的区间分别分配给两个量化器,作为它们的值域:

  • Q 0 Q_0 Q0 的值域为 [ − 2 Δ , − Δ ) , [ 0 Δ , 1 Δ ) , [ 2 Δ , 3 Δ ) [-2\Delta,-\Delta),[0\Delta,1\Delta),[2\Delta,3\Delta) [,Δ),[,),[,)
  • Q 1 Q_1 Q1 的值域为 [ − 3 Δ , − 2 Δ ) , [ − Δ , 0 Δ ) , [ 2 Δ , 3 Δ ) [-3\Delta,-2\Delta),[-\Delta,0\Delta),[2\Delta,3\Delta) [,),[Δ,),[,)

呈现出了间隔分布的美感。同时,这样的分配是有一定的巧妙之处的。

Q 0 Q_0 Q0 [ − 2 Δ , − Δ ) , [ 0 Δ , 1 Δ ) , [ 2 Δ , 3 Δ ) [-2\Delta,-\Delta),[0\Delta,1\Delta),[2\Delta,3\Delta) [,Δ),[,),[,) 举例,这些区间上的任意数值整除 Δ \Delta Δ 后再对 2 2 2 取余,余数一定等于 0 0 0,从而对应到水印信息 0 0 0 Q 1 Q_1 Q1 的值域同理,其值域上的任意数值整除 Δ \Delta Δ 后再对 2 2 2 取余,余数一定一定等于 1 1 1,从而对应到水印信息 1 1 1



2.2 对论文的分析

后文中的量化值 Q Q Q 其实就是前文中的量化步长 Δ \Delta Δ

论文原文

基于给定的量化值 Q Q Q,通过以下公式构造一个包含 L H 1 LH1 LH1 子带调整系数的新矩阵 S S S
S ( i , j ) = ⌊ L H 1 ( i , j ) Q ⌋ S(i,j)=\left \lfloor \frac{LH1(i,j)}{Q} \right \rfloor S(i,j)=QLH1(i,j)

将加密后的水印图像 E W EW EW 按照下以下规则嵌入到 L H 1 LH1 LH1 子带中,从而得到 L H 1 ′ LH1' LH1

if mod(S(i, j), 2) = EW(k) then
	LH1(i, j) = S(i, j) * Q + Q / 2
End if

if mod(S(i, j), 2) != EW(k) then
	if LH1(i, j) - S(i, j) * Q ∈ [0, Q/2] then
		LH1(i, j) = (S(i, j) - 1) * Q + Q / 2
	Else
		LH1(i, j) = (S(i, j) + 1) * Q + Q / 2
	End if
End if



论文分析

首先,一上来就是原始信息 L H 1 LH1 LH1 对量化步长 Q Q Q 的整除。由于 S S S 是整数,因此 S ⋅ Q S\cdot Q SQ 一定等于某端点的值,但是该端点可能是 Q 0 Q_0 Q0 的元素,也可能是 Q 1 Q_1 Q1 的元素。因此,我们需要根据待嵌入的水印信息对 S ⋅ Q S\cdot Q SQ 进行调整,以得到符合要求的 L H 1 ′ LH1' LH1



情况一

假设 L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 且待嵌入的水印信息为 1 1 1。由于整除的结果是 1 ∈ Q 1 1\in Q_1 1Q1,因此我们不需要调整 S ⋅ Q S\cdot Q SQ。但是为了防止 S ⋅ Q S\cdot Q SQ 在传输过程中发生微小偏移而落入到 Q 0 Q_0 Q0 的区间中,我们将 S ⋅ Q S\cdot Q SQ 移动到当前 Q 1 Q_1 Q1 区间的中心。如下图所示:

在这里插入图片描述
对应以下代码:

if mod(S(i, j), 2) = EW(k) then
	LH1(i, j) = S(i, j) * Q + Q / 2
End if


情况二

假设 L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 且待嵌入的水印信息为 0 0 0。由于整除的结果是 1 ∈ Q 1 1\in Q_1 1Q1,因此我们需要调整 S ⋅ Q S\cdot Q SQ,使其移动到 Q 0 Q_0 Q0 的值域中。我们既可以往左边的 Q 0 Q_0 Q0 区间移动,也可以往右边的 Q 0 Q_0 Q0 区间移动。如下图所示:

在这里插入图片描述

由于我们希望 L H 1 ′ LH1' LH1 L H 1 LH1 LH1 的差值不要太大,以保证图像的质量,因此我们选择向距离 L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 更近的区间移动。在代码中,使用了以下条件进行判断:

if LH1(i, j) - S(i, j) * Q ∈ [0, Q/2] then
	LH1(i, j) = (S(i, j) - 1) * Q + Q / 2
Else
	LH1(i, j) = (S(i, j) + 1) * Q + Q / 2
End if

即如果 L H 1 LH1 LH1 距离所处区间的左端点超过 0.5 Δ 0.5\Delta 0.5Δ,那么往右边的 Q 0 Q_0 Q0 区间移动;否则往左边的 Q 0 Q_0 Q0 区间移动。如下图所示:

在这里插入图片描述

上述距离是通过 LH1(i, j) - S(i, j) * Q 求得的。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VS远程调试步骤

1、背景 生产环境是没有开发环境的&#xff0c;&#xff0c;那生产环境上运行的程序&#xff0c;出了问题&#xff0c;如何远程调试它&#xff1f; 可以借助VS的远程调试。 2、步骤 1&#xff09;将E:\VS2019\install\Common7\IDE\Remote Debugger目录整体拷贝到生产环境机器…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 、auto 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长&#xff0c;再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析&#xff0c;注释。 &#xff08;1 探讨一&#xff09;当独占指针指向数组时&#xff0c;其默认的删除器是…

微服务-Nacos-安装-集成SpringBoot

微服务-SpringCloud-ALibaba-Nacos Nacos 是阿里巴巴推出的 SpringCloud的组件 官网:什么是 Nacos 主要是为了解决微服务的架构中 服务治理的问题服务治理就是进行服务的自动化管理&#xff0c;其核心是服务的注册与发现。 服务注册&#xff1a;服务实例将自身服务信息注册…

【vue】vue2项目将npm包管理器修改为yarn包管理器

【vue】vue2项目将npm包管理器修改为yarn包管理器 1.删除node_modules文件夹、package-lock.json文件 2.全局安装yarn npm install -g yarn3.安装项目依赖 yarn install如果执行yarn install 报类似以下这种版本不兼容错误&#xff0c;执行 yarn config set ignore-engines …

[SWPUCTF 2023 秋季新生赛]Junk Code

方法一&#xff1a;手动去除 将所有E9修改为90即可 方法二&#xff1a;花指令去除脚本 start_addr 0x0000000140001454 end_addr 0x00000001400015C7 print(start_addr) print(end_addr) for i in range(start_addr,end_addr):if get_wide_byte(i) 0xE9:patch_byte(i,0x9…

【激光雕刻机上位机的成品软件】核心功能 - 参考wecreat

Software | WeCreat MakeIt! https://wecreat.com/pages/software 体验软件如上&#xff0c;自行下载体验。 价格5W&#xff0c;本人为 wecreat 创立之初上位机软件开发的核心员工&#xff0c;详细内容私信我。 由于该公司快3个月未给我竞业补偿了&#xff0c;对我不仁那我…

华为昇腾310 ATC模型转换、CPP推理案例使用

参考: https://cnloong.blog.csdn.net/article/details/139293689 https://gitee.com/ascend/samples/tree/master/inference/modelInference/sampleResnetQuickStart/cpp https://developer.huawei.com/consumer/cn/forum/topic/0203148227811150357 官方图像分类案例下载: …

数据结构与算法笔记:基础篇 - 链表(上):如何实LRU缓存淘汰算法

概述 本章聊聊 “链表” 这个数据结构。学习链表有什么作用&#xff1f; 我们先来讨论一个经典的链表应用场景&#xff0c;那就是 LRU 缓存淘汰算法。 缓存是一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中有着非常广泛地应用&#xff0c;比如场景的 CPU 缓…

字符串-将str1编辑成str2所需最小代价(hard)

一、题目描述 二、解题思路 该题目使用动态规划的思想来解决问题 刚开始我还在想&#xff0c;删除添加的操作可以等价为替换操作&#xff0c;如果替换操作的Cost大于删除添加组合操作的Cost之和就需要把 rcdcic。 但是在动态规划中&#xff0c;如果对三种不同的操作方式进行…

C++ 的 Tag Dispatching(标签派发) 惯用法

目录 1.概述 2.标准库中的例子 3.使用自己的 Tag Dispatching 3.1.使用 type traits 技术 3.2.使用 Type_2_Type 技术 4.Tag Dispatching的使用场景 5.总结 1.概述 一般重载函数的设计是根据不同的参数决定具体做什么事情&#xff0c;编译器会根据参数匹配的原则确定正确…

域内攻击--->基于资源的约束委派(RBCD)

不同于约束和非约束委派&#xff0c;基于资源的约束性委派可以就难的多了&#xff01;&#xff01; 前方高能 &#xff0c;准备上车&#xff01;&#xff01; 目录 1.基于资源的约束性委派(RBCD) 2.谁能设置RBCD 3.机器入域账号的普及 4.域树的搭建 5.配置RBCD 6.通过域创…

【前端部署——vercel】部署next.js使用了prisma的项目

部署流程参考 https://blog.csdn.net/qq_51116518/article/details/137042682 问题 PrismaClientInitializationError: Prisma has detected that this project was built on Vercel, which caches dependencies. This leads to an outdated Prisma Client because Prisma’s …

kali系统baopoWiFi密码

kali系统baopoWiFi密码,仅供学习 取决强大的密码字典,如果别人密码设置的足够安全,也无法破解成功,并不是100%破解 一、准备一个无线网卡&#xff0c;需要免驱动&#xff0c;最好知道频率2.4HGZ还是5.0GHZ 二、插上USB接口&#xff0c;vmware模拟器选择连接虚拟机 三、输入命…

Java Spring Boot 从必应爬取图片

获取图片主要就是通过必应图片页面控制台的元素&#xff0c;确认图片和标题在哪个类中&#xff08;浏览器 F12&#xff09; 引入依赖 这里需要引入两个依赖 jsoup 和 hutool maven依赖网站地址&#xff1a;Maven Repository: Search/Browse/Explore (mvnrepository.com) 挑选…

Java如何读取resources目录下的文件路径(九种代码示例教程)

本文摘要&#xff1a;Java如何读取resources目录下的文件路径 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f91…

翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL)

What a drag: Dragging a Uniform Resource Locator (URL) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p23133 Raymond Chen 2008年03月12日 麻烦的拖拽&#xff1a;拖拽统一资源定位符&#xff08;URL&#xff09; 简要 …

HALCON-从入门到入门-图像格式的互相转换

1.废话 上次说到了图片的读取和写入到本地&#xff0c;这次说一下图片的格式相关。 位图和矢量图 photoshop处理出来的图片肯定叫做图片&#xff0c;那么coreDraw处理出来的图片是不是也叫图片。 之间就有区分&#xff0c;一种叫做位图&#xff0c;一种叫做矢量图 位图和矢…

STM32作业实现(四)光敏传感器

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

曝光超1.5亿,迪丽热巴“抖音直播首秀”解锁德施曼智能锁科技革命

作为中国电商行业年中最大的消费狂欢节点&#xff0c;今年的618大促热闹依旧&#xff1b;各大品牌在今年极简的现货模式下展开了周期最长的品牌实力比拼。其中&#xff0c;高端智能锁领军品牌德施曼在618大促期间&#xff0c;携手代言人迪丽热巴&#xff0c;再次掀起智能锁消费…

【前端】Vuex笔记(超详细!!)

最近花了两周时间&#xff0c;完完全全的跟着Vuex官方的视频学完了Vuex并且详详细细的做了笔记&#xff0c;其中总结部分是我对于整个视频课程的总结&#xff0c;视频部分是跟着视频做的笔记&#xff0c;如果总结部分有不懂的话&#xff0c;直接去视频部分查找对应的笔记即可&a…