• 大小: 5KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: Matlab
  • 标签: 数字水印  

资源简介

关于MATLAB数字水印的实验代码,课程设计可以用,可以运行。

资源截图

代码片段和文件信息

clear all;
clc;
start_time=cputime;%;%计算cpu所用时间,当前的时间赋值给star_time
%%%%%%%%%%%%读取水印图像%%%%%%%%%%%
I=imread(‘nupt.bmp‘);
%%%%%%%%%%%%显示水印图像%%%%%%%%%%%
figure(1);
subplot(231);
imshow(I)title(‘水印图像‘)
dimI=size(I);%I的大小宽*高
rm=dimI(1);cm=dimI(2);%rm为宽,cm为高
%%%%%%%%%%以下生成水印信息%%%%%%%%%
mark=I;%把I赋值给mark
alpha=15%表示幅值设置在当前坐标轴上设置对象的透明度属性15表示半透明
k1=randn(18);%产生1行8列的随机数
k2=randn(18);
a0=imread(‘yuanyuan.bmp‘);
a0=rgb2gray(a0);%将图形的颜色变成灰色,把彩图转换为灰色
psnr_cover=double(a0);%大于256会失真,a0转为双精度不会失真
subplot(232)imshow(a0[])title(‘载体图像‘);%绘制子图2x3的第二个,以及图像及标题
[rc]=size(a0);%获得a0的维数
cda0=blkproc(a0[88]‘dct2‘);%对a0分成8*8的块并进行二维离散余弦变换
%把它分成64*64个8*8小块是为了dct2变换后,每一个中频都集中在对角线上(纸上红色线),如果直接不分再dct2后
%中频不分就在大的384*384图像像素的对角线部分,但是对着一部分进行水印嵌入修改后(由不同的k值改),
%中间不分的确会变,但是肉眼看不出来,只有化成64个小块对中间对角线变换后这么多像素才能被识别。
%%%%%%%%%%%%%%%%%%进行DCT变换并嵌入水印%%%%%%%%%%
cda1=cda0;%cda1 = 384_384
for i=1:rm %i=1:64
for j=1:cm %j=1:64 
x=(i-1)*8;y=(j-1)*8;
if mark(ij)==1%如果水印图片的此块没有字(白为1黑为0)则采用第一个随机矩阵
k=k1;
else
k=k2;
end
cda1(x+1y+8)=cda0(x+1y+8)+alpha*k(1);%对每一个8*8的小块的对角线像素的二位余弦dct值进行变换
cda1(x+2y+7)=cda0(x+2y+7)+alpha*k(2);%低频在左下角 高频在右上角
cda1(x+3y+6)=cda0(x+3y+6)+alpha*k(3);%从左上到右下dct的绝对值是依次递减的
cda1(x+4y+5)=cda0(x+4y+5)+alpha*k(4);
cda1(x+5y+4)=cda0(x+5y+4)+alpha*k(5);
cda1(x+6y+3)=cda0(x+6y+3)+alpha*k(6);
cda1(x+7y+2)=cda0(x+7y+2)+alpha*k(7);
cda1(x+8y+1)=cda0(x+8y+1)+alpha*k(8);
end
end
%%%%%进行DCT反变换得到嵌入水印后图像%%%%%%%%%%%%%%
a1=blkproc(cda1[88]‘idct2‘);%a1为对经过水印嵌入后的图像进行二维dct反变换
a_1=uint8(a1);%将a1转化为uint8格式
imwrite(a_1‘withmark.bmp‘‘bmp‘);%写入嵌入后的图片
subplot(233)imshow(a1[])title(‘嵌入水印后的图像‘);
disp(‘嵌入水印处理时间‘);
embed_time=cputime-start_time%运行时间
%%%%%% 攻击实验测试鲁棒性 %%%%%%%%%%%
disp(‘对嵌入水印的图像的攻击实验,请输入选择项:‘);%disp是输出函数
disp(‘1--添加白噪声‘);
disp(‘2--高斯低通滤波‘);
disp(‘3--JPEG压缩‘);
disp(‘4--图像剪切‘);
disp(‘5--旋转10度‘);
disp(‘6--直接检测水印‘);
disp(‘其他--不攻击‘);
d=input(‘请输入选择(1-6):‘);
start_time=cputime;
figure(1);
switch d
case 6
subplot(234);
imshow(a1[]);
title(‘未受攻击的含水印图像‘);
M1=a1;
case 1 %加入白噪声
WImage2=a1;
noise0=20*randn(size(WImage2));
WImage2=WImage2+noise0;
subplot(234);
imshow(WImage2[]);
title(‘加入白噪声后图像‘);
M1=WImage2;
M_1=uint8(M1);%无符号取整
imwrite(M_1‘whitenoise.bmp‘‘bmp‘);
case 2 %高斯低通滤波
WImage3=a1;
H=fspeci

评论

共有 条评论