数字水印 改进的patchwork算法 实现
一、算法原理
1、参考论文
甘霖,杨榆.基于变换域的Patchwork水印改进算法[J].成都信息工程大学学报,2017,32(06):623-627.
2、理论基础
(1)离散余弦变换
在水印算法中引入图像的变换域用于嵌入水印,以此增强水印的透明性。
(2)人类视觉系统特性
人类的视觉系统对不同颜色的敏感程度不同。由亮度方程 y = 0.299R+0.587G+0.144B可知,人眼对绿色光最为敏感,对红色光的敏感程度次之,对于蓝色光最不敏感。人眼对红色光和蓝色光的敏感程度之和与对绿色光的敏感程度较为接近。该论文使用红色和蓝色光部分作为 Pacthwork 算法的 A 集合,绿色光作为 B 集合,两个集合在嵌入信息时使用相逆的操作,可以在一定程度上互相抵消嵌入信息引起的图像视觉上的变化,提高水印透明性。
3、具体算法
(1)水印的嵌入
1)图片预处理
载体图像 I 与水印图像W选取正方形的 RGB 图像,并满足载体图像的边长为 8 的倍数且载体图像边长为水印图像边长的 8 倍。将载体图像 I 的 3 个颜色通道分离,得到 IR、IG、IB 3 个颜色分量; 将水印图像W 的 3 个颜色通道分离,得到 WR、WG、WB 3 个颜色分量。
2)对水印Arnold置换
对WR、WG、WB三个颜色分量进行Arnold变换,变换的过程可以看作是拉伸、压缩、折叠及拼接的过程,经过变换得到WRA、WGA、WBA。Arnold变换过程如下:
其中(x,y)为图像上点坐标。
3)对载体图像进行DCT变换并提取直流分量。
载体图像的各分量以8×8的大小为一个单位划分为若干子块。将子块视为一个整体,最左上角的子块位置坐标为(1,1),其相邻的右边的子块位置坐标为( 1,2) ,依此类推。对每一个子块分别应用DCT 变换,然后取出变换后的每一个子块左上角的直流分量组成一个新矩阵,位置坐标为( 1,1) 的子块的直流分量作为新矩阵( 1,1) 位置的元素,位置坐标为 (1,2) 的子块的直流分量作为新矩阵( 1,2) 位置的元素,依此类推。最终所得的矩阵称为直流分量矩阵IRD、IBD、IGD。
4)在直流分量矩阵中嵌入水印
在直流分量矩阵上嵌入水印,嵌入方法是增加/减去置乱的水印图像分量k倍的亮度。分量提取公式如下:
其中绿色分量在亮度处理时使用减操作,红色分量和蓝色分量使用加操作。由人类视觉系统的特性知这两个互逆的操作可以在一定程度上互相抵消嵌入信息引起的图像视觉上的变化,提高水印透明性。
5)合成嵌入水印图像
嵌入水印后的直流分量矩阵 IRDE、IBDE、IGDE按照对应位置替换各个子块的直流分量,再对各个子块分别应用反DCT 变换完成各颜色分量的水印嵌入。
最后将三个分量合成为水印图像。
(2)水印的提取
1)预处理
将含有数字水印的载体图像 P 的 3 个颜色通道分离,得到PR、PG、PB 3 个颜色分量; 将原始载体图像 I 的 3 个颜色通道分离,得到IR、IG、IB 3 个颜色分量。
2)对含有水印的图像进行分块 DCT 变换并提取直流分量
对带水印载体图像P使用和水印嵌入时相同直流分量提取方式,得到PRD、PBD、PGD。
3)从直流分量矩阵中提取置乱的水印
提取方法如下:
将三个分量进行逆Arnold变换后组合成提取出的水印。
二、算法实现
1、代码展示(matlab2018)
%中国地质大学 信息安全 2018 朱靖宇
%% 初始化
clc;
clear ;figure(1); %打开窗口
%% 载入数据
I=imread("I.png");
%I=imresize(I,[512,512],'nearest');
subplot( 2,2,1) ,imshow(I),title('载体图像');
W=imread("W.png");
%W=imresize(W,[64,64],'nearest');
subplot(2,2,2),imshow(W),title('水印图像');
[row,col,t] = size(W);%% 嵌入水印部分
%分离R,G,B通道
IR=I(:,:,1);
IG=I(:,:,2);
IB=I(:,:,3);
WR=W(:,:,1);
WG=W(:,:,2);
WB=W(:,:,3);
%设置k,不同图片k值不同
k=0.162;%% 使用Arnold变换置乱水印
WRA=arnold(WR,1,1,1);
WRA=double(WRA);
WGA=arnold(WG,1,1,1);
WGA=double(WGA);
WBA=arnold(WB,1,1,1);
WBA=double(WBA);
%%
% 对载体图像进行8*8分块处理,然后对每块分别DCT变化
IRD=blkproc(IR,[8,8],'dct2');
IGD=blkproc(IG,[8,8],'dct2');
IBD=blkproc(IB,[8,8],'dct2');
IRDE=IRD;
IGDE=IGD;
IBDE=IBD;%% 提取直流分量,并向矩阵中嵌入水印for i=0:(row-1)for j=0:(col-1)x=i*8;y=j*8;IRDE(x+1,y+1)=IRD(x+1,y+1)+k*WRA(i+1,j+1);IBDE(x+1,y+1)=IBD(x+1,y+1)+k*WBA(i+1,j+1);IGDE(x+1,y+1)=IGD(x+1,y+1)-k*WGA(i+1,j+1);end
end%% 对载体图像进行分块反DCT变换
IR2=blkproc(IRDE,[8,8],'idct2');
IG2=blkproc(IGDE,[8,8],'idct2');
IB2=blkproc(IBDE,[8,8],'idct2');
IR2=uint8(IR2);
IG2=uint8(IG2);
IB2=uint8(IB2);%% 合成
I_embed = I;
I_embed(:,:,1) = IR2;
I_embed(:,:,2) = IG2;
I_embed(:,:,3) = IB2;
subplot( 223) ,imshow(I_embed),title('嵌入水印后的载体图像');%% 提取水印
%% 分离通道
P=I_embed;
PR=P(:,:,1);
PG=P(:,:,2);
PB=P(:,:,3);%% 将带水印图像进行DCT变换
PRD=blkproc(PR,[8,8],'dct2');
PGD=blkproc(PG,[8,8],'dct2');
PBD=blkproc(PB,[8,8],'dct2');
WR2=WR;
WB2=WB;
WG2=WG;
%% 提取水印
for i=0:(row-1)for j=0:(col-1)x=i*8;y=j*8;WR2(i+1,j+1)=(PRD(x+1,y+1)-IRD(x+1,y+1))/k;WB2(i+1,j+1)=(PBD(x+1,y+1)-IBD(x+1,y+1))/k;WG2(i+1,j+1)=(IGD(x+1,y+1)-PGD(x+1,y+1))/k;end
end
%% 逆arnold
WR2=uint8(WR2);
WG2=uint8(WG2);
WB2=uint8(WB2);
WR2=rearnold(WR2,1,1,1);
WG2=rearnold(WG2,1,1,1);
WB2=rearnold(WB2,1,1,1);
%% 合成水印
W2=W;
W2(:,:,1)=WR2;
W2(:,:,2)=WG2;
W2(:,:,3)=WB2;
subplot( 224) ,imshow(W2),title('提取出的水印');
imwrite(I_embed,'I_embed.png');
imwrite(W2,'W2.png');
%% arnold变换
function arnoldImg = arnold(img,a,b,n)
[h,w] = size(img);
N=h;
arnoldImg = zeros(h,w);
for i=1:nfor y=1:hfor x=1:w%防止取余过程中出现错误,先把坐标系变换成从0 到 N-1xx=mod((x-1)+b*(y-1),N)+1;yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1; arnoldImg(yy,xx)=img(y,x); endendimg=arnoldImg;
end
arnoldImg = uint8(arnoldImg);
endfunction img = rearnold(arnoldImg,a,b,n)
[h,w] = size(arnoldImg);
img = zeros(h,w);
N = h;
for i=1:nfor y=1:hfor x=1:w xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1;yy=mod(-a*(x-1)+(y-1),N)+1 ; img(yy,xx)=arnoldImg(y,x); endendarnoldImg=img;
end
img = uint8(img);
end
2、实现效果
该算法实现的效果如下:
3、算法评估
(1)隐蔽性
直观上来看,可以发现嵌入载体后和嵌入载体前图像肉眼无法分辨差异,但是提取出的水印图像和原水印间存在一定失真。
通过计算后可以得到,嵌入载体后图像与嵌入载体前图像峰值信噪比为50.454,互相关系数为0.9919,提取出的水印图像和原图像间互相关系数为0.9944。
(2)容量
从容量上来看,假设该算法载体图像大小为mm,水印图像可为(m/8)(m/8)。
(3)鲁棒性
1)jpeg压缩攻击
压缩后的图像和提取出的水印如下图:
攻击后提取出的水印与原水印间互相关系数为0.913
2)放大攻击
该攻击对图片先放大2倍再缩小2倍
攻击后提取出的水印图像
攻击后提取出的水印与原水印间互相关系数为0.9836
3)缩小攻击
该攻击对图片先缩小2倍再放大2倍
攻击后提取出的水印图像
攻击后提取出的水印与原水印间互相关系数为0.8195
4)裁剪攻击
裁剪掉图片中心的25 %的面积。
攻击后的载体图像和提取出的水印图像如下所示
攻击后提取出的水印与原水印间互相关系数为0.8547
5)高斯滤波攻击
对载体图像进行高斯滤波
攻击后提取出的水印与原水印间互相关系数为0.9434
从上述各实验效果可看出该算法具有一定鲁棒性。
三、隐写分析
1、攻击前提
攻击者仅拥有载有水印图片,但是攻击者知道隐写方法为patchwork类及其拓展
2、分析方法
提取图片各分量的灰度图,并对其进行分类,由于正常图片三通道未发生过变换,与载入水印后图片存在一定差异
图片互相关系数见https://blog.csdn.net/qq_44465615/article/details/115461113
代码最下方
数字水印 改进的patchwork算法 实现相关推荐
- 改进的Patchwork数字水印算法——C++实现
Patchwork数字水印算法基础原理 Patchwork原意为一种用各种颜色和形状拼接成的布料. Patchwork算法最早由麻省理工学院研发,在空间域上通过大量的模式冗余来实现鲁棒的数字水印技术, ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- matlab优化算法案例分析与应用_最优化计算与matlab实现(18)——粒子群优化算法——权重改进的粒子群算法...
参考资料 <精通MATLAB最优化计算(第二版)> 编程工具 Matlab 2019a 目录 石中居士:最优化计算与Matlab实现--目录zhuanlan.zhihu.com 权重改进 ...
- 面试官:怎么改进哈希算法实现负载均衡的扩展性和容错性?我:...
面试官:怎么改进哈希算法实现负载均衡的扩展性和容错性? 什么是哈希算法 数据结构中我们学习过哈希表也称为散列表,我们来回顾下散列表的定义. 散列表,是根据键直接访问在指定储存位置数据的数据结构.通过计 ...
- 基于改进正弦余弦算法的函数寻优算法
文章目录 一.理论基础 1.基本正弦余弦算法 2.改进正弦余弦算法 (1)基于双曲正弦调节因子和动态余弦波权重的位置更新 (2)基于拉普拉斯分布和高斯分布的动态混合变异 二.算法流程图 三.仿真实验与 ...
- 求解高维优化问题的改进正弦余弦算法
文章目录 一.理论基础 1.正弦余弦算法 2.改进的正弦余弦算法 (1)反向学习初始化 (2)修改个体位置更新方程 (3)算法步骤 二.仿真实验与结果分析 1.测试函数 2.实验结果 (1)和原始SC ...
- 论文阅读三:基于改进人工蜂群算法的SDN负载均衡策略研究
名词解释: Artificial Bee Colony Algorithm, ABC:人工蜂群算法 Load balancing algorithm based on improved artific ...
- 基于拉丁超立方抽样与自适应策略的改进鲸鱼优化算法
文章目录 一.理论基础 1.基本鲸鱼优化算法 2.改进的鲸鱼优化算法 (1)LHS方法初始化种群 (2)收敛因子的改进 (3)非线性惯性权重 (4)改进的鲸鱼优化算法流程 二.仿真实验测试与分析 三. ...
- 基于觅食生境选择的改进粒子群算法-附代码
基于觅食生境选择的改进粒子群算法 文章目录 基于觅食生境选择的改进粒子群算法 1.粒子群优化算法 2. 改进粒子群算法 3.实验结果 4.参考文献 5.Matlab代码 6.Python代码 摘要:在 ...
- 结合黏菌觅食行为的改进多元宇宙算法
文章目录 一.理论基础 1.多元宇宙优化算法 2.混合多元宇宙优化算法 (1)黏菌觅食行为 (2)混合多元宇宙算法 二.实验结果及分析 三.参考文献 一.理论基础 1.多元宇宙优化算法 请参考这里. ...
最新文章
- android studio不自动生成r.java_Android 添加构建依赖
- 编程软件python中的if用法-python 函数式编程工具
- java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext崩溃解决
- eureka同步原理_eureka原理剖析
- jenkins 使用LDAP认证
- Java可靠性测试fit_Java ParagraphVectors.fit方法代码示例
- 20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结
- python交换两个变量的值
- 大型网站技术架构:核心原理与案例分析
- 协鑫:把绿色能源带进千家万户
- springboot系列(5) -- 整合 logback 彩色日志输
- 16个最佳WordPress登录页面插件
- 博弈论的一些基础知识(参考网络资料,学习总结,很好,分享并保存)
- 双相机 单目三维重建
- 数据库候选关键词怎么求_数据库中候选码求法.(比较全的哦)
- win10 3D viewer
- 汉源高科2个万兆光口16个千兆光口工业级以太网交换机机架式光纤自愈环网以太网交换机
- 想按最低税率3%缴纳个税,月薪和年终奖最高多少最为合适?
- 模拟产生modbus数据工具
- 照片秒变卡通风!教你用PaddleGAN快速生成你的专属卡通头像