• 大小: 126KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Matlab
  • 标签: DCT  水印算法  MATLAB  

资源简介

基于DCT的水印算法实现,MATLAB版。附带实验图片,可以直接运行。

资源截图

代码片段和文件信息

%图片加水印,提取出水印,并进行攻击测试
%林多   CSDN
%http://blog.csdn.net/zxc024000
%%%%%%%%%%%%
M=256; %原图像长度
N=32; %水印图像长度
K=8; %8x8的分块
I=zeros(MM);%创建一个MxM矩阵,元素全是0
J=zeros(NN);
BLOCK = zeros(KK);
%显示原图像
subplot(521);%显示多幅图像,在第一个位置显示
I=imread(‘23.bmp‘);%将23.bmp读入I中
imshow(I);%显示图像
title(‘原始公开图像‘);%标题
%显示水印图像
subplot(522);
J=imread(‘21.bmp‘);
imshow(J);
title(‘水印图像‘);
%水印嵌入算法
for p=1:N %从1到32循环
 for q=1:N %从1到32循环
  x=(p-1)*K+1; y=(q-1)*K+1;
  BLOCK=I(x:x+K-1y:y+K-1);%取相应元素保存到BLOCK中
  BLOCK=dct2(BLOCK);%二维离散余弦变换
  if J(pq)==0 %如果元素为0
    a=-1;
  else
    a=1;
  end
  BLOCK=BLOCK*(1+a*0.03);  BLOCK=idct2(BLOCK);%反二维离散余弦变换
  I(x:x+K-1y:y+K-1)=BLOCK;
 end
end
%显示嵌入水印后的图像
subplot(523);
imshow(I);
title(‘嵌入水印后的图像‘);
imwrite(I‘watermarked.bmp‘‘bmp‘);%将I中的数据保存成watermarked.bmp
%从嵌入水印的图像中提取水印
I=imread(‘23.bmp‘);%未加水印的原图像
P=imread(‘watermarked.bmp‘);%水印图像
%提取水印算法
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1=I(x:x+K-1y:y+K-1);%赋给BLOCK1元素
BLOCK2=P(x:x+K-1y:y+K-1);%赋给BLOCK2元素
BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
a=BLOCK2(11)/BLOCK1(11)-1;
if a<0
W(pq)=0;
else
W(pq)=1;
end
end
end
%显示提取的水印
subplot(524);
imshow(W);
title(‘从含水印图像中提取的水印‘);

%----------攻击测试-----------------------%

%----------中值攻击----------%
P1=imread(‘watermarked.bmp‘);
P1=double(P1(::1));
P1=medfilt2(P1);%中值滤波
subplot(525);
imshow(P1[]);
title(‘中值滤波攻击‘);
I1=imread(‘23.bmp‘);%未加水印的原图像
%提取水印算法
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1=I1(x:x+K-1y:y+K-1);%赋给BLOCK1元素
BLOCK2=P1(x:x+K-1y:y+K-1);%赋给BLOCK2元素
BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
a=BLOCK2(11)/BLOCK1(11)-1;
if a<0
W1(pq)=0;
else
W1(pq)=1;
end
end
end
subplot(526);
imshow(W1);
title(‘从含中值滤波图像中提取的水印‘);

%----------变小攻击----------%
P2=imread(‘watermarked.bmp‘);
P2=imresize(P20.5);%变为0.5倍,从256x256到128x128
subplot(527);
imshow(P2[]);%显示变小后图像
title(‘变小攻击,变为128x128像素‘);
I2=imread(‘23.bmp‘);%未加水印的原图像
I2=imresize(I20.5);%原图像一样变小
%提取水印算法
for p=1:32
for q=1:32
x=(p-1)*4+1;
y=(q-1)*4+1;
BLOCK1=I2(x:x+4-1y:y+4-1);%赋给BLOCK1元素
BLOCK2=P2(x:x+4-1y:y+4-1);%赋给BLOCK2元素
BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
a=BLOCK2(11)/BLOCK1(11)-1;
if a<0
W2(pq)=0;
else
W2(pq)=1;
end
end
end
subplot(528);
imshow(W2);
title(‘从128x128图像中提取水印‘);

%-------旋转攻击-------%
P3=imread(‘watermarked.bmp‘);
P3=imrotate(P390);%逆时针旋转90度;
subplot(529);
imshow(P3[]);
title(‘旋转攻击‘);
I3=imread(‘23.bmp‘);%未加水印的原图像
I3=imrotate(I390); %原图像逆时针旋转90度;
%提取水印算法
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1=I3(x:x+K-1y:y+K-1);%赋给BLOCK1元素
BLOCK2=P3(x:x+K-1y:y+K-1);%赋给BLOCK2元素
BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
a=BLOCK2(11)/BLOCK1(11)-1;
if a<0
W3(pq)=0;
else
W3(pq)=1;
end
end
end
subplot(5210);
imshow(W3);
title(‘从含旋转图像中提取的水印‘);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2102  2015-05-12 19:10  水印\21.bmp
     文件      196662  2015-05-12 15:29  水印\23.bmp
     文件        3508  2015-10-26 20:23  水印\dct.m
     文件      196662  2015-10-26 19:53  水印\watermarked.bmp
     目录           0  2015-10-26 20:23  水印\

评论

共有 条评论