资源简介
基于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仿真程序
相关资源
- 叠加平均去噪matlab仿真程序
- k近邻matlab代码
-
BP神经网络+PID控制simuli
nk仿真 - MATLAB海杂波模型仿真
- BP神经网络MATLAB实现不使用工具箱
- DBSCAN聚类算法matlab代码
- 维纳自适应滤波器设计及Matlab实现
- GA算法优化支持向量机
- GRU的matlab时间序列神经网络
- matlab去除处理背景
- matlab实现图像的旋转变换
- 程序-MATLAB-小波分解6层,通过编译,
- 三相永磁同步电机SVPWM控制算法MATLA
- 基于模糊控制的路径规划算法的仿真
- 三角高程控制网平差
- PSCAD_EMTDC与Matlab接口
- 飞行器惯性导航Matlab仿真实现
- job shop matlab
- matlab2009a反复要求激活解决方案——亲
- 模拟退火的方法解TSP问题--matlab
- matlab航天工程工具箱相信对航天卫星
- matlab双对数坐标及拟合
- 基于LCL的单相有源阻尼并网逆变器的
- matlab 曲柄滑块机构仿真 程序
- Matlab图像处理模板匹配完整程序小飞
- SMOTE算法 MATLAB代码
- MIMO-OFDM系统的Matlab仿真代码
- 时间序列预测及matlab代码
- matlab 源代码 线性规划
- 基于matlab比例导引做的三维弹道
评论
共有 条评论