📄 dctanddwt.m
字号:
close all;
clear all;
%%%%%%%%%%%******************************************
dat=imread('E:\watermark\use picture\lena256.bmp','bmp'); % 256*256
[m,n]=size(dat);
for i=1:m/64
for j=1:n/64
block(:,:,i,j)=dat((i-1)*64+1:i*64,(j-1)*64+1:j*64);
block2(:,:,i,j)=dct2(block(:,:,i,j));
if mod(i+j,2)==0
block22(:,:,i,j)=block2(:,:,i,j)*1.1;
else
block22(:,:,i,j)=block2(:,:,i,j)/1.1;
end
datdc((i-1)*64+1:i*64,(j-1)*64+1:j*64)=idct2(block22(:,:,i,j));
end
end
[a,h,v,d]=lwt2(double(dat),'bior4.4');
[m,n]=size(d);
for i=1:m/64
for j=1:n/64
block(:,:,i,j)=d((i-1)*64+1:i*64,(j-1)*64+1:j*64);
if mod(i+j,2)==0
block33(:,:,i,j)=block(:,:,i,j)*1.5;
else
block33(:,:,i,j)=block(:,:,i,j)/1.5;
end
dd((i-1)*64+1:i*64,(j-1)*64+1:j*64)=block33(:,:,i,j);
block(:,:,i,j)=h((i-1)*64+1:i*64,(j-1)*64+1:j*64);
if mod(i+j,2)==0
block33(:,:,i,j)=block(:,:,i,j)*2;
else
block33(:,:,i,j)=block(:,:,i,j)/2;
end
hh((i-1)*64+1:i*64,(j-1)*64+1:j*64)=block33(:,:,i,j);
end
end
datdw=ilwt2(a,h,v,double(dd),'bior4.4');
datdw2=ilwt2(a,double(hh),v,d,'bior4.4');
figure(1);
subplot(2,2,1);
imagesc(dat);
axis image;
title('original');
colormap(gray); % 用dct和fft的方法,需要先将原图分块,否则直流分量会很大,
% 但是这样就会在反变换之后产生块噪声,因为各块系数在整图作用中被修改的程度不同
% 解决方法:取中频分量进行水印的修改和嵌入工作,但是由于实际中可能遇到的几何攻击变
% 换,例如旋转攻击,在整体旋转后我们在检测前需要给待检测图像进行反向旋转,并且无法
% 精确还原到原始位置,这时对于整幅图像其实频域的能量分布已经发生变化,检测时的分块
% 和dct(fft)操作后系数值也会有较大改变,无法达到优化效果。
% 如果用小波变换,通过一对小波基构造一个高通滤波器和一个低通滤波器,分别提取出LL
% ,LH,HL,HH的分量,就可以直接选择对应的频率块进行嵌入和修改,省去了fft
% 中选择中频分量点的步骤,同时,在经过几何攻击之后,由于保留了大部分的低频和细节信
% 息,因此只要得到近似的图像位置,无需恢复到原始角度,就可以提取出90%以上的嵌入完整
% 信息,如果再加上纠错机制,就可以得到优化后的水印提取图像。
subplot(2,2,2);
imagesc(datdc);
axis image;
title('dct');
subplot(2,2,3);
imagesc(datdw);
axis image;
title('dwt use hh frequency');
subplot(2,2,4);
imagesc(datdw2);
axis image;
title('dwt use hh frequency');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -