资源简介
自己写的基于dwt和svd结合的水印嵌入的MATLAB代码,有注释,自己的东西,希望引用的注明
代码片段和文件信息
%嵌入水印的函数
%参数说明
%origne_source--原始图像(载体图像)
%watermark_source--水印图像(灰色图像或二值图像)
%单位:江大大学信安0602班
%导师:Ms.sun
%作者:寒星
function [UV]=in(origne_sourcewatermark_sourcewatermarked_source)
%N=512;
%先处理水印图像(128x128),如下:
arnold_image=Arnold(watermark_source100);%读入水印图像并且进行arnold变换,10表示进行的次数(可作密钥)
%arnold_image是uint8的格式
%[cachcvcd]=dwt2(arnold_image‘haar‘);%进行一级dwt变换
%然后处理载体图像,如下:
origne_image=imread(origne_source);%读入载体图像
dims=ndims(origne_image);
if(dims==2)
[image_rolimage_col]=size(origne_image);
if(image_rol<512)
if(image_col<512)
disp(‘载体图像的高度和宽度都必须大于512‘);
return;
end
end
origne_image2=double(origne_image);
%part_origne_image2=zeros(N);
%for i=1:N
% for j=1:N
% part_origne_image2(ij)=origne_image2(ij);
% end
%end
part_origne_image2=origne_image2;
[LL1LH1HL1HH1]=dwt2(part_origne_image2‘haar‘);%对载体图像先进行一级dwt变换(320x256)
[LL2LH2HL2HH2]=dwt2(LL1‘haar‘);%对LL1进行dwt变换(160x128)
[LL3LH3HL3HH3]=dwt2(LL2‘haar‘);%变成80x64,水印图像为64x64
%水印嵌入过程,如下:
%嵌入分两个部分
%a1=0.15;a2=0.15;
%cv,cd的存放
arnold_image=double(arnold_image);
[UWSWVW]=svd(arnold_image);%对水印作svd分解
%size(SW)
[ULSLVL]=svd(LL3);%对3级低频分量作svd分解80x64
SLL=SL;
%size(SL)
[UHSHVH]=svd(HH3);%对3级高频分量作svd分解
SHH=SH;
%[ULHSLHVLH]=svd(LH3);
%[UHLSHLVHL]=svd(HL3);
U=UW;V=VW;%128x128
g1=0.7;g2=0.7;g3=0.5;
%由于第一个奇异值很大,改变一点,图像失真很多,所以强度不应很大
[ab]=size(LL3);
col=min(ab);
SL(11)=SL(11)+g3*SW(11);
for i=2:col
SL(ii)=SL(ii)+g1*SW(ii);
end
SH(11)=SH(11)+g3*SW(6565);
for i=2:col
SH(ii)=SH(ii)+g2*SW(i+64i+64);
end
%欠两下
%SLH(11)=SLH(11)+g3*SW(11);
%col=64;
%for i=2:col
% SLH(ii)=SLH(ii)+g1*SW(ii);
%end
%SHL(11)=SHL(11)+g3*SW(i+64i+64);
%for i=2:col
% SHL(ii)=SHL(ii)+g2*SW(i+64i+64);
%end
LL3=UL*SL*VL‘;
HH3=UH*SH*VH‘;
%LH3=ULH*SLH*VLH‘;
%HL3=UHL*SHL*VHL‘;
LL2=idwt2(LL3LH3HL3HH3‘haar‘);%小波逆变换
LL1=idwt2(LL2LH2HL2HH2‘haar‘);
watermarked_image1=idwt2(LL1LH1HL1HH1‘haar‘);
%for i=1:N
% for j=1:N
% origne_image2(ij)=watermarked_image1(ij);
% end
%end
watermarked_image=uint8(watermarked_image1);
imwrite(watermarked_image
评论
共有 条评论