【图像隐写】基于DWT和DCT的鲁棒图像水印系统附Matlab实现
✅作者简介热爱科研的Matlab仿真开发者擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。完整代码获取 定制创新 论文复现点击Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条做科研博学之、审问之、慎思之、明辨之、笃行之是为博学慎思明辨笃行。 内容介绍一、引言在当今数字化信息飞速发展的时代图像作为重要的信息载体其版权保护和信息安全问题日益凸显。基于 DWT离散小波变换和 DCT离散余弦变换的鲁棒图像水印系统为解决这些问题提供了有效的途径。该系统融合多种算法不仅能将水印信息隐蔽地嵌入到原始图像中还具备强大的抗鲁棒攻击能力确保水印在各种恶意攻击下仍能被准确提取从而实现图像版权的有效保护。二、核心算法原理一预处理算法Arnold 置乱算法Arnold 变换是一种基于混沌理论的图像置乱方法。它通过对图像像素位置进行重新排列改变像素之间的空间相关性。其核心思想是在二维空间中对图像的坐标进行特定的线性变换使得原始图像的结构被打乱呈现出看似随机的图案。这种置乱操作在水印处理中能有效消除水印像素之间的相关性提高水印信息的安全性和鲁棒性。例如对于一幅 N×N 的图像Arnold 变换的公式为二DWT 加密及解密算法离散小波变换DWT是一种将图像分解为不同频率子带的数学工具。在水印嵌入过程中对原始图像进行二级小波分解将其分解为低频子带 LL1、水平高频子带 HL1、垂直高频子带 LH1 和对角高频子带 HH1。低频子带包含了图像的主要能量和大部分视觉信息对其进行操作对图像质量影响较小。通过对低频子带 LL1 进行处理来嵌入水印能够增强水印的鲁棒性。在提取水印时通过对含水印图像进行相同的小波分解依据嵌入水印时的规则从相应子带中提取水印信息完成解密过程。三DCT 加密及解密算法离散余弦变换DCT将图像从空间域转换到频率域。在频率域中图像的能量主要集中在低频部分而中频部分包含了图像的重要纹理和结构信息。通过对原始图像的低频子带 LL1 进行分块并对每个块进行 DCT 变换修改中频系数来嵌入预处理后的水印信息。这种方法兼顾了水印的鲁棒性和不可见性。在水印提取时对含水印图像进行同样的 DCT 变换根据嵌入水印时对中频系数的修改规则提取水印实现解密。三、系统实现步骤一水印预处理Logistic 加密根据设定的初始值和控制参数利用 Logistic 混沌序列算法对二进制水印进行加密生成加密后的水印序列。这个过程通过对水印信息进行打乱和混淆增加水印的安全性。Arnold 置乱对加密后的水印图像应用 Arnold 置乱算法对水印图像的像素位置进行重新排列进一步提高水印信息的鲁棒性消除像素之间的相关性。二水印嵌入DWT 分解对原始图像进行二级小波分解得到不同频率子带。重点关注低频子带 LL1因为它包含了图像的主要能量对其进行操作对图像视觉质量影响相对较小。DCT 变换与嵌入对低频子带 LL1 进行分块处理对每个块进行 DCT 变换将预处理后的水印信息嵌入到 DCT 变换后的中频系数中。通过这种方式在保证水印鲁棒性的同时尽量减少对原始图像质量的影响确保水印的不可见性。三抗鲁棒攻击仿真实验攻击类型对嵌入水印后的图像进行多种恶意攻击仿真包括滤波攻击、噪声攻击、缩放攻击、旋转攻击和剪切攻击。这些攻击模拟了实际应用中可能遇到的各种干扰和破坏情况以测试水印系统的鲁棒性。攻击参数设置对于噪声攻击设置噪声强度为 0.05模拟不同程度的噪声干扰对于缩放攻击设置不同的缩放比例对于旋转攻击设定不同的旋转角度对于剪切攻击确定不同的剪切区域大小。通过调整这些参数全面评估水印系统在不同攻击强度下的表现。四水印提取与评价水印提取针对经过各种攻击后的含水印图像利用与嵌入过程相对应的逆操作进行水印提取。通过对含水印图像进行 DWT 分解和 DCT 变换依据嵌入水印时对系数的修改规则从相应子带和系数中提取水印信息。评价指标计算采用 PSNR峰值信噪比和 NC归一化互相关作为评价指标。PSNR 用于衡量原始图像与含水印图像之间的失真程度数值越高表示图像失真越小水印的不可见性越好NC 用于评估提取的水印与原始水印之间的相似度NC 值越接近 1说明提取的水印与原始水印越相似水印系统的鲁棒性越强。通过计算这两个指标全面评价算法在抗鲁棒攻击方面的性能。⛳️ 运行结果 部分代码function [Wg1,nc]attgetdwtwatermark(Ia,W,rngseed,flag,k1,k2) %遭受攻击后的小波水印提取[mW,nW]size(W);if mW~nWerror(GETDWTWATERMARK:ARNOLD,ARNOLD置乱要求水印图像长宽必须相等)endIwdouble(Ia);Wlogical(W);ca1wdwt2(Iw,haar);ca2wdwt2(ca1w,haar);WaW;rng(rngseed);%idxrandperm(numel(ca2w),numel(Wa));%for i1:numel(Wa)% cca2w(idx(i));% zmod(c,nW);% if znW/2% Wa(i)0;% else% Wa(i)1;% end%end%%%%%%%%%%%%%%%% 提取水印 %%%%%shuiyin imread(已Arnold置乱水印.bmp);dimIsize(shuiyin);%rmdimI(1);cmdimI(2);M1 ca2w;psnr_watermarkedM1;% [LL1,ch1,cv1,cd1]dwt2(M1,haar);% [LL2,ch2,cv2,cd2]dwt2(LL1,haar);dca1blkproc(M1,[8,8],dct2);pzeros(1,8);for i1:dimI(1)for j1:dimI(2) % j1:32x(i-1)*8;y(j-1)*8;p(1)dca1(x1,y8);p(2)dca1(x2,y7);p(3)dca1(x3,y6);p(4)dca1(x4,y5);p(5)dca1(x5,y4);p(6)dca1(x6,y3);p(7)dca1(x7,y2);p(8)dca1(x8,y1);if corr2(p,k1)corr2(p,k2),warning off MATLAB:divideByZero;mark1(i,j)1;elsemark1(i,j)0;endendendWgWa;Wamark1;% end%提取和原始水印相关系数的计算ntimes 24;H[1,1;1,2]^ntimes;for i1:nWfor j1:nWidxmod(H*[i-1;j-1],nW)1;Wg(idx(1),idx(2))Wa(i,j);endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%logitic映射产生混沌序列e1Wg;[m1,n1]size(e1);q3.9;x(1)0.3001;for n1:n1m1100x(n1)q*x(n)*(1-x(n));endfor n101:1:n1100y1(n-100)x(n);endfor n101:1:m1100y2(n-100)x(n);end%b1b2矩阵分别是为了构造图像矩阵的列和行的编号的一个等差数列b1zeros(1,n1);b2zeros(1,m1);for e1:n1b1(1,e)e;endfor e1:m1b2(1,e)e;end%b1for f1:n1-1for hf:n1if y1(f)y1(h)ky1(f);y1(f)y1(h);y1(h)k;tb1(f);b1(f)b1(h);b1(h)t;endendend%b2for f1:m1-1gf;for hg:m1if y2(f)y2(h)ky2(f);y2(f)y2(h);y2(h)k;tb2(f);b2(f)b2(h);b2(h)t;endendend%对每行混乱解密for f1:m1-1gf;for hg:m1if b2(f)b2(h)kb2(f);b2(f)b2(h);b2(h)k;c2e1(f,:);e1(f,:)e1(h,:);e1(h,:)c2;endendend%对每列混乱解密for f1:n1-1for hf:n1if b1(f)b1(h)kb1(f);b1(f)b1(h);b1(h)k;c1e1(:,f);e1(:,f)e1(:,h);e1(:,h)c1;endendendWg1e1;if flagendncsum(Wg(:).*W(:))/sqrt(sum(Wg(:).^2))/sqrt(sum(W(:).^2));if flagimwrite(Wg,getmark6.bmp)end 参考文献更多免费数学建模和仿真教程关注领取