图像数字水印

  • e8_399344
    了解作者
  • matlab
    开发工具
  • 299.8KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 2
    下载次数
  • 2022-02-22 11:09
    上传日期
可直接运行的数字图像水印嵌入的matlab代码,简单易懂,绝对实用
图像数字水印
  • 图像水印嵌入 matlab
  • shuiyin.bmp
    2.6KB
  • tiqu.asv
    2.8KB
  • psnr.m
    447B
  • nc.m
    442B
  • ProductRoots
    212B
  • save.yuv
    371.3KB
  • lena.jpg
    155KB
  • worker.bat
    2.1KB
  • qianru_tuxiang.m
    5KB
  • tiqu_tuxiang.m
    2.8KB
内容介绍
%水印嵌入源码 %基于傅立叶域的数字水印 %注意:水印必须为40*40的二值图像 %因为40阶的二维arnold置乱周期为30,所以嵌入时置乱8次,提取时置乱22.可以根据自己的需要更改. %嵌入源码 clc clear all; % 保存开始时间 start_time=cputime; iTimes=8; %置乱次数 k=1.1; % 设置嵌入强度系数 blocksize=8; % 块的大小 filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵 1,1,1,1,1,1,1,1; 1,1,0,0,0,0,1,1; 1,1,0,0,0,0,1,1; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0;]; % 读入原始图像 file_name='lena.jpg'; cover_object=double(imread(file_name))/255; % 原始图像矩阵的行数与列数 Mc=size(cover_object,1); Nc=size(cover_object,2); % 最大嵌入信息量 max_message=Mc*Nc/(blocksize^2); % 读入水印图像 file_name='shuiyin.bmp'; message=double(imread(file_name)); %水印图像矩阵的行数与列数 Mm=size(message,1); Nm=size(message,2); % 检查水印信息是否过大 if Mm*Nm>max_message error('水印信息过大') end %对水印图像进行Arnold置乱 if Mm~=Nm error('水印矩阵必须为方阵'); end if Mm~=40 error('必须为40*40大小,或者修改置乱次数'); end tempImg=message; for n=1:iTimes % 置乱次数 for u=1:Mm for v=1:Nm temp=tempImg(u,v); ax=mod(u+v,Mm)+1; ay=mod(u+2*v,Nm)+1; outImg(ax,ay)=temp; end end tempImg=outImg; end message_vector=reshape(outImg,1,Mm*Nm) % 将cover_object(原图矩阵)写入watermarked_image watermarked_image=cover_object; %置随机数发生器的状态为1100 key=1100; rand('state',key); % 产生伪随机序列 pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5)); pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5)); % 将图像分块 x=1; y=1; h=waitbar(0,'嵌入水印,请等待'); for (kk = 1:length(message_vector)) % 做傅立叶变换 fft_block=fft2(cover_object(y:y+blocksize-1,x:x+blocksize-1)); %计算幅值 abs_block=fftshift(abs(fft_block)); %计算相位 angle_block=angle(fft_block); % 当message_vector=0且filter_m=1时用伪随机序列pn_sequence_zero叠加abs_block % 当message_vector=1且filter_m=1时用伪随机序列pn_sequence_one叠加abs_block ll=1; if (message_vector(kk)==0) for ii=1:blocksize for jj=1:blocksize if (filter_m(ii,jj)==1) abs_block_o=abs_block(ii,jj); abs_block(ii,jj)=abs_block(ii,jj)*(1+k*pn_sequence_zero(ll)); abs_block(blocksize-ii+1,blocksize-jj+1)=abs_block(blocksize-ii+1,blocksize-jj+1)+abs_block(ii,jj)-abs_block_o; ll=ll+1; end end end else for ii=1:blocksize for jj=1:blocksize if (filter_m(ii,jj)==1) abs_block_o=abs_block(ii,jj); abs_block(ii,jj)=abs_block(ii,jj)*(1+k*pn_sequence_one(ll)); abs_block(blocksize-ii+1,blocksize-jj+1)=abs_block(blocksize-ii+1,blocksize-jj+1)+abs_block(ii,jj)-abs_block_o; ll=ll+1; end end end end % 进行傅立叶逆变换 abs_block=fftshift(abs_block); watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=abs(ifft2(abs_block.*exp(i*angle_block))); % 移动到下一块 if (x+blocksize) >= Nc x=1; y=y+blocksize; else x=x+blocksize; end waitbar(kk/length(message_vector),h); end close(h); % 转换为uint8,并写入 watermarked_image_int=uint8(watermarked_image*255); imwrite(watermarked_image_int,'dft2_watermarked.bmp','bmp'); % 计算运行时间 elapsed_time=cputime-start_time, % 计算psnr psnr=psnr(cover_object,watermarked_image), % 显示水印,嵌入水印图像与原始图像 figure(1) subplot(1,2,1) imshow(message,[]); title('原始水印'); subplot(1,2,2); imshow(tempImg,[]); title('置乱水印'); figure(2) subplot(1,2,1) imshow(watermarked_image,[]); name='嵌入水印图像'; title(strcat(num2str(name),' k=',num2str(k),' psnr=',num2str(psnr))); subplot(1,2,2) imshow(cover_object,[]) title('原始图像'); %%%%%%%%%%%%%% 进行攻击测试 %%%%%%%%%%% disp('1-->加入白噪声'); disp('2-->剪切图像'); disp('3-->直接检测') begin=input('请选择攻击(1-3):') switch begin %%%%%%% 加入白噪声 %%%%%%%% case 1 figure(3) Aimage1=watermarked_image; Wnoise=0.01*randn(size(Aimage1)); Aimage1=Aimage1+Wnoise; subplot(1,3,1),imshow(Aimage1,[]),title('加入白噪声后的图象'); att=Aimage1; imwrite(att,'chulihouimage.bmp'); %%%%%%%% 剪切攻击 %%%%%%%% case 2 figure(3) Aimage3=watermarked_image; Aimage3(1:128,1:128)=256; subplot(1,3,1),imshow(Aimage3,[]),title('剪切后的图象'); att=Aimage3; imwrite(att,'chulihouimage.bmp'); %%%%%%% 没有受到攻击 %%%%%%% case 3 figure(3) subplot(1,3,1),imshow(wimage,[]),title('未遭到攻击的图像'); att=watermarked_image; imwrite(att,'chulihouimage.bmp'); end
评论
    相关推荐
    • Matlab合集
      冈萨雷斯数字图像处理MATLAB版.中文版+数字图像处理第二版中文版(冈萨雷斯)+MATLAB-R2014a完全自学一本通+MATLAB R2016a完全自学一本通 素材文件+[模式识别与智能计算:MATLAB技术实现(第2版)].杨淑莹.扫描版
    • MATLAB教程
      MATLAB教程MATLAB教程MATLAB教程MATLAB教程MATLAB教程MATLAB教程
    • MATLAB
      MATLAB 该项目是在matlab上完成的,涉及创建和移动宇宙飞船和机器人。 太空飞船和机器人是使用Matlab中的简单几何形状创建的,并通过连续变换矩阵进行移动。 这个项目教我如何使用变换矩阵(旋转,平移等)的概念...
    • MATLAB基础
      一本学习matlab的一本好书
    • MATLAB编译器
      基于MATLAB 2018b版本介绍MATLAB编译器。介绍如何利用编译器将MATLAB代码编译为独立应用程序或组件,并在没有安装MATLAB的计算机上进行部署。
    • matlabruntime
      通过奇点容器运行您的matlab项目 可以在没有MATLAB的容器中运行matlab代码。 为此,我们首先需要通过Matlab编译器在本地构建相应的Matlab代码的独立应用程序,然后使用具有Matlab运行时( 的容器)运行该应用程序 )...
    • matlab实现
      matlab实现 matlab实现matlab实现matlab实现matlab实现
    • matlab 教程
      matlab 信号处理资料,里面包含信号处理pdf文档,一些杂乱的程序和命令等
    • matlab教程
      matlab教程,PPT格式,包含 matlab基本知识、matlab入门、matlab作图、线性规划、无约束优化、非线性规划、统计工具箱、差值、微分方程等多项知识点,并且每个知识点独立成为PPT,内还含有matlab信号处理详解等文档...
    • matlab简介
      1.MATLAB 开发环境 1.1 MATLAB 的视窗环境 进入MATLAB之后,会看到一个视窗MATLAB Command Window称为指令视窗,它是你键入指令的地方同时 MATLAB也将计算结果显示在此。 1.2 简易计算 我们先从MATLAB的...