DCT数字图像水印算法MATLAB仿真代码
DCT数字图像水印算法MATLAB仿真代码 大家好:
为了解决很多同学学习数字图像水印技术的需求,整理了matlab图像水印代码,利用matlab提供的强大图像处理数学函数来进行水印的嵌入和提取。
MATLAB程序代码加注释如下(方便大家直接粘贴代码运行程序特整理为DOC
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
):以后本人会陆续把本科的学习资料上传至本人javaewb的百度文库,百度空间博客。
注:本文的水印算法是半盲水印和脆弱水印模型。半盲水印模型提取水印时需要原始图像,而盲水印算法则不需要
m=256;%图像大小,图像格式必须是8位灰度图像,大小是的方阵。 256256,
88,3232,n=32;%水印嵌入块的个数,即256/8=32,即每个图像块的大小是的方阵,一共有个。 k=8; %水印嵌入块的大小
%初始化变量
i=zeros(m,m);j=zeros(n,n);
block=zeros(k,k); %处理块的大小
subplot(3,2,1);i=imread('lena256.bmp','bmp');imshow(i);%读取水印载图即原始图像 title('原始公开图像');
3232,subplot(3,2,2);j=imread('flag32.bmp','bmp');imshow(j);%注水印信号图像必须是的方阵,图像%格式为二值图像
title('水印图像 ');
%% 嵌入过程,本文采用加性水印
for p=1:n
for q=1:n
x=(p-1)*k+1;y=(q-1)*k+1;
block=i(x:x+k-1,y:y+k-1);
block=dct2(block);%对每个块进行DCT
if j(p,q)==0
a=-1;
else
a=1;
end
block=block*(1+a*0.05);%嵌入系数越大越明显且压缩提取效果好 小于0.006提取水印效果不
好%且压缩提取效果差 大于0.012压缩提取可辨认提取水印效果好。
block=idct2(block);
i(x:x+k-1,y:y+k-1)=block; end
end
%%
subplot(3,2,3);imshow(i);title('嵌入水印后的图像 '); % 保存嵌入水印的图像
imwrite(i,'watermarked.bmp','bmp');
%% 提取水印过程
i=imread('lena256','bmp');%原始图像
j=imread('watermarked.bmp','bmp');%嵌入水印的图像
for p=1:n
for q=1:n
x=(p-1)*k+1;
y=(q-1)*k+1;
block1=i(x:x+k-1,y:y+k-1); block2=j(x:x+k-1,y:y+k-1); block1=dct2(block1);
block2=dct2(block2);
%提取水印过程
a=block2(1,1)/block1(1,1)-1; if a<0;
w(p,q)=0;
else
w(p,q)=1;
end
end
end
subplot(3,2,4);
imshow(w);
title('从含水印的图像中提取的水印');
imwrite(w,'withdraw.bmp','bmp');
%% 下面是对嵌入水印的图像进行JPEG压缩攻击的测试过程 m=256;n=32;k=8;
i=zeros(m,m);j=zeros(m,m);w=zeros(n,n);
block1=zeros(k,k);block2=zeros(k,k); l=imread('watermarked.bmp','bmp');
imwrite(l,'attack.jpg','jpeg','quality',70);%matlab的图像写函数可以选择格式和参数,JPFG的格式%
和参数具体参考MATLAB的imwrite帮助
j=imread('attack.jpg','jpeg'); subplot(3,2,5);imshow(j);title('压缩后图像');
i=imread('lena256','bmp'); for p=1:n
for q=1:n
x=(p-1)*k+1;
y=(q-1)*k+1;
block1=i(x:x+k-1,y:y+k-1);
block2=j(x:x+k-1,y:y+k-1);
block1=dct2(block1);
block2=dct2(block2);
a=block2(1,1)/block1(1,1)-1;
if a<0
w(p,q)=0;
else
w(p,q)=1;
end
end
end
subplot(3,2,6);
imshow(w);
title('从经过压缩的图象中提取的水印');
imwrite(w,'yati.bmp','bmp');
完