《小波实验报告dwt水印(共7页).doc》由会员分享,可在线阅读,更多相关《小波实验报告dwt水印(共7页).doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上一、题目:dwt水印二、目的:编程实现水印的嵌入与还原三、算法及其实现:水印的嵌入与还原小波变换具有空间-频率的多尺度性,对图像的分解可以连续地从低分辨率过渡到高分辨率,也可以对图像整体进行变换,DWT还具有多分辨率特性,可以很好地与人类视觉系统(HVS)特性相匹配。本算法将载体图像进行小波分解,利用公式实现水印信息的嵌入。将2值图像中0和1的值变成-1和1。将水印入宿主图形重要的小波系数上。水印的提取完全是水印嵌入的逆过程。四、实现工具:Matlab五、程序代码:(1)dwt1_embed.m%嵌入源码clcclear all;% 保存开始时间start_time=
2、cputime;k=20; blocksize=8; % 设置块的大小% 读入原图像file_name=zimu.bmp;cover_object=double(imread(file_name);% 原图像的行数与列数Mc=size(cover_object,1); %原图像行数Nc=size(cover_object,2); %原图像列数% 最大嵌入信息量max_message=Mc*Nc/(blocksize2);% 读入水印图像file_name=c.bmp;message=double(imread(file_name);%水印图像的行数与列数Mm=size(message,1);
3、%水印行数Nm=size(message,2); %水印列数message_vector=reshape(message,1,Mm*Nm);% 检查水印信息是否过大if (Mm*Nm max_message) error(水印太大)end%将随机数发生器的状态置为1100randn(state,1100);% 产生watermarked_image,并写入原图信息watermarked_image=cover_object;% 将图像分块嵌入% 当 (2,2) (2,3) 且 message_pad(kk)=0% 当 (2,2) cD1(2,3)便是嵌入了水印的黑色像素,%反之则是嵌入了白色像
4、素x=1;y=1;h=waitbar(0,嵌入水印,请等待);for (kk = 1:length(message_vector) % 对块进行DWT变换 cA1,cH1,cV1,cD1 = dwt2(cover_object(x:x+blocksize-1,y:y+blocksize-1),haar); a=cD1; % 如果 message_pad(kk)= 0 if (message_vector(kk) = 0) % 且(2,2) (2,3) ,交换它们 if (cD1(2,2) (2,3) ,交换它们 if (cD1(2,2) = cD1(2,3) temp=cD1(2,3); cD
5、1(2,3)=cD1(2,2); cD1(2,2)=temp; end end % 检查(2,2) , (2,3)的差是否= k if cD1(2,2) cD1(2,3) if cD1(2,2) - cD1(2,3) k cD1(2,2)=cD1(2,2)+(k/2); cD1(2,3)=cD1(2,3)-(k/2); end else if cD1(2,3) - cD1(2,2) = Nc x=1; y=y+blocksize; else x=x+blocksize; end waitbar(kk/length(message_vector),h);endclose(h);% 转换为uint
6、8并写入dwt_watermarked.bmpwatermarked_image_uint=uint8(watermarked_image);imwrite(watermarked_image_uint,dwt_watermarked.bmp,bmp);% 显示运行时间elapsed_time=cputime-start_time,% 计算psnr值psnr=psnr(cover_object,watermarked_image), % 显示图像figure(1)imshow(message);title(水印);figure(2)subplot(1,2,1);imshow(watermark
7、ed_image,)title(嵌入水印图像)subplot(1,2,2);imshow(zimu.bmp);title(原图);(2)dwt1_recover.m%DWT源码%提取源码clear all;% 保存开始时间start_time=cputime;blocksize=8; % 设置块的大小% 读入嵌入水印图像file_name=dwt_watermarked.bmp;watermarked_image=double(imread(file_name);% 嵌入水印图像的行数与列数Mw=size(watermarked_image,1); %嵌入水印图像的行数Nw=size(wate
8、rmarked_image,2); %嵌入水印图像的列数% 最大嵌入信息量max_message=Mw*Nw/(blocksize2);% 读入原始水印file_name=c.bmp;orig_watermark=double(imread(file_name);% 原始水印的行数与列数Mo=size(orig_watermark,1);%原始水印的行数No=size(orig_watermark,2);%原始水印的列数% 将图像分块提取水印x=1;y=1;h=waitbar(0,水印提取中,请等待);for (kk = 1:max_message) % 对块进行dwt变换 cA1,cH1,c
9、V1,cD1 = dwt2(watermarked_image(x:x+blocksize-1,y:y+blocksize-1),haar); % 如果cD1(2,2) cD1(3,3) 那么 message_vector(kk)=0 % 否则 message_vector(kk)=1 if cD1(2,2)cD1(3,3) message_vector(kk)=0; else message_vector(kk)=1; end % 移动到下一块 if (x+blocksize) = Mw x=1; y=y+blocksize; else x=x+blocksize; end waitbar(
10、kk/max_message,h);endclose(h);% 将message重新排列message_vector=message_vector(1,1:Mo*No); %只需前Mo*No个message=reshape(message_vector,Mo,No);% 显示运行时间elapsed_time=cputime-start_time,% 显示提取水印与原始水印 figure(3)subplot(1,2,1);imshow(message,);title(提取水印)subplot(1,2,2);imshow(orig_watermark,)title(原始水印);六、 运行结果: 1、把C嵌入到图形中把c从水印图形中提取出来并对比七:结果分析:专心-专注-专业