dct数字水印算法
① DCT域图像数字水印算法,新手,这个水印嵌入程序看不明白,谁能帮我把每条注释下Q282092728,谢谢了
M=256;%原图像长度
N=32;%水印图像长度
K=8; %图像分块大小
I=zeros(M,M);%创建一个零矩阵,用于存放载体图像
J=zeros(N,N); %创建一个零矩阵,用于存放水印图像
BLOCK=zeros(K,K);%创建一个零矩阵,用于存放图像分块
%显示水印图像
subplot(1,8,2);
J=imread('14','bmp'); %读入水印图像
imshow(J); %显示水印图像
title('水印图像');
%显示原图像
subplot(1,3,2);
I=imread('11','bmp'); %读入原始图像
imshow(I); %显示原始图像
title('原始公开图像');
%嵌入水印
tem=1;%创建变量tem,没用
for p=1:N%水印图像行循环
for q=1:N%水印图像列循环
x=(p-1)*K+1; %x为载体图像行坐标
y=(q-1)*K+1; %y为载体图像列坐标
BLOCK=I(x:x+K-1,y:y+K-1); %BLOCK为载体图像I的分块,分块大小为K*K,
%初始值为I(0:K-1,0:K-1)
BLOCK=dct2(BLOCK);%对BLOCK进行二维DCT变换,得到新的BLOCK即%DCT系数矩阵BLOCK
if J(p,q)==0%如果水印图像的第(p,q)个像素为0
a=-1;%嵌入参数为-1
else
a=1; %若如果水印图像的第(p,q)个像素为1嵌入参数为1
end
BLOCK(2,1)=BLOCK(2,1)*(1+a*0.01); %对载体图像的分块的DCT系数矩阵
%BLOCK
BLOCK=idct2(BLOCK);%对DCT系数矩阵进行反变换,得到嵌入水印后的载体
%图像分块BLOCK
I(x:x+K-1,y:y+K-1)=BLOCK;%用嵌入水印后的图像分块BLOCK代替载体图像
%的对应分块
End%水印图像列循环结束
End%水印图像行循环结束
%显示嵌入水印后的图像
subplot(1,3,3);
imshow(I);%显示嵌入水印后图像
title('嵌入水印后的图像');
imwrite(I,'embedded.bmp','bmp');%将嵌入水印后图像写成bmp文件
够详细吧,希望对你有用。
② 基于DCT数字水印算法的Matlab实现源代码
读取图片
读取水印图片(二维码)
原图片做成灰度
水印图做成二值图
原图做8*8DCT处理
选择DC成分以外的元素(每个8*8块里选择1个元素)
生成伪随机乱数
根据乱数做成密钥
将水印图根据密钥与算法嵌入到第6步骤
嵌入后将每个元素替换原来的第6步元素
做反变换
图片保存,嵌入完毕
提取
读取嵌入水印后的图片
生成嵌入时的伪随机乱数(生成乱数之前可以加一些几何攻击)
根据乱数做成密钥
嵌入水印后的图片做8*8DCT处理
选择DC成分以外的元素(选取跟原来嵌入时相同)
根据算法与密钥提取水印图
提取的水印图与原水印图做比较
保存提取的水印图,提取完毕