作业帮 > 综合 > 作业

麻烦帮我解释下matlab数字水印程序

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/23 23:09:33
麻烦帮我解释下matlab数字水印程序
这是所有的程序:
M=256; N=32; K=8; I=zeros(M,M); J=zeros(N,N);
BLOCK=zeros(K,K);
subplot(1,8,2); J=imread('C:\new\3.jpg'); imshow(J); title('水印图像'); subplot(1,3,2); I=imread('C:\new\2.jpg'); imshow(I); title('原始图像');
tem=1;
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);
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK(2,1)=BLOCK(2,1)*(1+a*0.01);
BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
subplot(1,3,3);
imshow(I); title('嵌入水印后的图像'); imwrite(I,'C:\new\4.bmp');
麻烦主要解释下这几段:
tem=1;
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);
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK(2,1)=BLOCK(2,1)*(1+a*0.01);
BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
麻烦帮解释下上面的主要几段
麻烦帮我解释下matlab数字水印程序
对256*256大小的图像进行8*8DCT分块,就是把图像分成32*32个8*8大小的图像块,
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表示,
BLOCK=dct2(BLOCK); 是对每块进行DCT变换,这时候的BLOCK表示的是每块经过DCT变换后的系数块
if J(p,q)==0
a=-1;
else
a=1;
end
这段程序是,J(p,q)代表的二值水印图像,二值水印图像的像素值只有0和1,所以if J(p,q)==0,a=-1 ,是如果水印图像像素值是0的话,让a=-1,当水印像素值为1的话,让a=1,我个人认为是为了提取时候好提取,因为下面的这句 BLOCK(2,1)=BLOCK(2,1)*(1+a*0.01)是水印嵌入的一个公式,是将水印信息嵌入到每块的低频系数(2,1)里,0.01是嵌入强度,是个固定值,你可以自己取,取太大的话对图像影响比较大,效果不太好,嵌入水印后的图像不清晰了,a代表的是水印信息,这句就是个嵌入公式的套用,BLOCK=idct2(BLOCK); 这个是你开始对图像进行DCT变换了,现在需要反变换才能得到原来的图像,I(x:x+K-1,y:y+K-1)=BLOCK; 这句是用变换后的区域取代原先的区域,这样水印才算嵌入进去了,这是我的理解,希望说明白了