登录论坛

查看完整版本 : [求助]关于数字水印的嵌入和提取matlab程序


loto1213
2008-05-27, 15:53
大哥大姐们小弟在此求助了,毕业论文是基于小波技术的数字水印技术的研究,要求实现matlab仿真,可以实现水印的嵌入和提取
小弟不才,经过网上拼凑得出下面的三级haar小波嵌入和提取程序,但是提取出来的水印是漆黑一片,我改了一级haar小波之后,提取是可以了,但是就是不明白具体的原理过程和程序语句意义,指导老师又不给指点,估计他也是不怎么知道的,每次都说自己回去查资料....我都无奈了....要求全部弄清,我哪里搞的懂啊:cry: 望高手指点下啊....
这个是三级haar小波分解的
嵌入:
clear all;
% save start time
start_time=cputime;
k=0.1; % set the gain factor for embeding
% read in the cover object
file_name='lena256.bmp';
cover_object=double(imread(file_name));
% determine size of watermarked image
Mc=size(cover_object,1); %Height
Nc=size(cover_object,2); %Width
% read in the message image and reshape it into a vector
file_name='c.bmp';
message=double(imread(file_name));
Mm=size(message,1); %Height
Nm=size(message,2); %Width
message_vector=fix(reshape(message,Mm*Nm,1)./2);
% read in key for PN generator
file_name='_key.bmp';
key=double(imread(file_name))./2;%256
%reset MATLAB's PN generator to state "key"
rand('state',16);
%三层harr小波变换
[cA1,cH1,cV1,cD1] = dwt2(cover_object,'haar');
[cA2,cH2,cV2,cD2] = dwt2(cA1,'haar');
[cA3,cH3,cV3,cD3] = dwt2(cA2,'haar');
[r1,c1] = size(cA3);
pn_sequence_h1=round(2*(rand(r1,c1)-0.5));
cA3=cA3+20*pn_sequence_h1;
% add pn sequences to H1 and V1 componants when message = 0
pn_sequence_h=round(2*(rand(Mc/2,Nc/2)-0.5));
pn_sequence_v=round(2*(rand(Mc/2,Nc/2)-0.5));
for (kk=1:length(message_vector))
if (message(kk) == 0)
cH1=cH1+k*pn_sequence_h;
cV1=cV1+k*pn_sequence_v;
end
end
% perform IDWT
cA2 = idwt2(cA3,cH3,cV3,cD3,'haar',[Mc/4,Nc/4]);
cA1 = idwt2(cA2,cH2,cV2,cD2,'haar',[Mc/2,Nc/2]);
watermarked_image = idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);
% convert back to uint8
watermarked_image_uint8=uint8(watermarked_image);
% write watermarked Image to file
imwrite(watermarked_image_uint8,'dwt_watermarked.bmp','bmp');
% display processing time
elapsed_time=cputime-start_time,
% display watermarked image
figure(1)
imshow(watermarked_image_uint8,[])
title('Watermarked Image')
figure(2)
subplot(2,2,1);
imshow(cA1,[]);
subplot(2,2,2);imshow(cA2,[]);
subplot(2,2,3);imshow(cA3,[]);
subplot(2,2,4);imshow(cD1,[]);
figure(3)
imshow(cA3,[]);

提取:
clear all;

% save start time
start_time=cputime;

% read in the watermarked object
file_name='dwt_watermarked.bmp';
watermarked_image=double(imread(file_name));

% determine size of watermarked image
Mw=size(watermarked_image,1); %Height
Nw=size(watermarked_image,2); %Width

% read in original watermark
file_name='c.bmp';
orig_watermark=double(imread(file_name));

% determine size of original watermark
Mo=size(orig_watermark,1); %Height
No=size(orig_watermark,2); %Width

% read in key for PN generator
file_name='_key.bmp';
key=double(imread(file_name))./256;

% reset MATLAB's PN generator to state "key"
rand('state',16);

% initalize message to all ones
message_vector=ones(1,Mo*No);
[cA1,cH1,cV1,cD1] = dwt2(watermarked_image,'haar');

% add pn sequences to H1 and V1 componants when message = 0
pn_sequence_h=round(2*(rand(Mw/2,Nw/2)-0.5));
pn_sequence_v=round(2*(rand(Mw/2,Nw/2)-0.5));

for (kk=1:length(message_vector))
correlation_h(kk)=corr2(cH1,pn_sequence_h);
correlation_v(kk)=corr2(cV1,pn_sequence_v);
correlation(kk)=(correlation_h(kk)+correlation_v(kk))/2;

end

for (kk=1:length(message_vector))
if (correlation(kk) > mean(correlation))
message_vector(kk)=0;
end
end

% reshape the message vector and display recovered watermark.
figure(1)
message=reshape(message_vector,Mo,No);
imshow(message,[])
title('Recovered Watermark')

% display processing time
elapsed_time=cputime-start_time,

这个是一级haar小波分解的
嵌入:
clear all;

%读入原图像
cover_object=double(imread('lena.bmp'));

%原图像的行数和列数
Mc=size(cover_object,1); %行数
Nc=size(cover_object,2); %列数

%进行dwt小波变换
[cA1,cH1,cV1,cD1]=dwt2(cover_object,'haar');

%读入水印图像
file_name='_copyright.bmp';
message=double(imread(file_name));

%水印的行数与列数
Mm=size(message,1); %行数
Nm=size(message,2); %列数
water_vector=reshape(message,Mm*Nm,1);
k=0.01; %嵌入强度
[r1,c1]=size(cD1);
cD1_vector=reshape(cD1,r1*c1,1);

%检查水印信息是否过大
if (Mm*Nm> r1*c1)
error('水印太大')
end

%将随机数发生器的状态置为1100
randn('state',1100);

%嵌入水印
x=1;
y=1;
h=waitbar(0,'水印嵌入中,请等待');
for j=1:Mm*Nm
cD1_vector(j,1)=cD1_vector(j,1)+0.01*water_vector(j,1);
end
cD1=reshape(cD1_vector,r1,c1);

close(h);

%idwt
waternarked_image_x=idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);

%转换为unit8并写入dwt_watermarked.bmp
watermarked_image_uint=uint8(waternarked_image_x);
imwrite(watermarked_image_uint,'dwt_watermarked.bmp','bmp');

%显示图像
figure(1)
imshow(waternarked_image_x,[])
title('嵌入水印图像');
figure(2)
I=imread('lena.bmp');
imshow(I,[])
title('原始图像')
figure(3)
subplot(2,2,1);
imshow(cA1,[]);
subplot(2,2,2);imshow(cA2,[]);
subplot(2,2,3);imshow(cA3,[]);
subplot(2,2,4);imshow(cD1,[]);
title('haar小波分解')

提取:
clear all;

%读入嵌入水印图像
watermarked_object=double(imread('dwt_watermarked.bmp'));
cover_object=double(imread('lena.bmp'));
Mc=size(cover_object,1); %行数
Nc=size(cover_object,2); %列数

%读入原始水印
file_name='_copyright.bmp';
message=double(imread(file_name));


%原始水印的行数与列数
Mm=size(message,1); %行数
Nm=size(message,2); %列数

%对水印进行dwt变换
[cA1,cH1,cV1,cD1]=dwt2(cover_object,'haar');
[wcA1,wcH1,wcV1,wcD1]=dwt2(watermarked_object,'haar');
[r1,c1]=size(cD1);
cD1_vector=reshape(cD1,r1*c1,1);
cD2_vector=reshape(wcD1,r1*c1,1);

%提取水印
x=1;
y=1;
h=waitbar(0,'水印提取中,请等待');
for j=1:Mm*Nm
water_vector(j,1)=(cD2_vector(j,1)-cD1_vector(j,1))/0.01;
end
close(h);

%将水印message重新排列
water=reshape(water_vector,Mm,Nm);
marked=uint8(water);
imwrite(marked,'recovermarked.bmp','bmp');

%显示提取水印与原始水印
figure(1)
imshow(marked,[])
title('提取出的水印');
figure(2)
I=imread('orig_watermark.bmp');
imshow(I,[])
title('原始水印')

leiwardmeng
2008-07-17, 18:26
读一些相关的论文吧。
基于DWT的音频水印研究。。。

Matlabya
2008-07-23, 21:14
牛呀
学习!

HY020416
2009-03-05, 21:26
好东西呀 学啦

未注册
2012-04-30, 10:07
为什么我的还是运行不起来呢?就是楼主的一级小波那个啊。。说我的reshape有问题。。请问。。对图像有什么要求么