资源简介
基于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 水印\
- 上一篇:谐波恢复中的SVD_TLS算法
- 下一篇:叠加平均去噪matlab仿真程序
相关资源
- 基于小波变换的数字水印算法115024
- matlab_OFDM调制解调(来自剑桥大学)
- Matlab路面裂缝识别69319
- 高灵敏度GPS接收机MATLAB仿真,附捕获
- 基于MATLAB的质点弹道计算与外弹道优
- 阵列天线的matlab仿真
- MATLAB 经典程序源代码大全
- MATLAB小波软阈值去噪代码33473
- 天线阵的波束形成在MATLAB仿真程序及
- 非线性SVM算法-matlab实现
- 《MATLAB 智能算法超级学习手册》-程序
- 组合导航matlab程序
- 读取txt文件内容matlab代码实现
- Matlab实现基于相关的模板匹配程序
- matlab优化工具箱讲解
- 基于MATLAB的快速傅里叶变换
- 光纤传输中的分布傅立叶算法matlab实
- 基于matlab的图像处理源程序
- matlab 椭圆拟合程序
- 算术编码解码matlab源代码
- optical_flow 光流法 matlab 实现程序
- 引导图像滤波器 Matlab实现
- 分形几何中一些经典图形的Matlab画法
- OFDM系统MATLAB仿真代码
- SVM工具箱(matlab中运行)
- 图像小波变换MatLab源代码
- LU分解的MATLAB实现
- 冈萨雷斯数字图像处理matlab版(第三
- 替代数据法的matlab程序
- 用matlab实现的多站定位系统性能仿真
评论
共有 条评论