📄 嵌入代码.txt
字号:
clear all; % 清除工作空间中的所有对象
k=20; % 设置水印强度
blocksize=8; % 设定图像的分块大小为8×8
midband=[0,0,0,1,1,1,1,0;
0,0,1,1,1,1,0,0;
0,1,1,1,1,0,0,0;
1,1,1,1,0,0,0,0;
1,1,1,0,0,0,0,0;
1,1,0,0,0,0,0,0;
1,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0];
message=double(imread('copyright.bmp')); % 读入水印图像“copyright.bmp”,
% 并转换为双精度数组
Mm=size(message,1); % 计算图像高度
Nm=size(message,2); % 计算图像宽度
n=Mm*Nm;
message=round(reshape(message,1,n)./256); % 将水印图像转换为1维行向量,
% message由0,1构成
cover_object=double(imread('lena.bmp')); % 读入原始宿主图像“lena.bmp”,
% 并转化为双精度数组
Mc=size(cover_object,1);Nc=size(cover_object,2); % 计算原宿主图像的高度和宽度
c=Mc/8;d=Nc/8;m=c*d; % 计算图像划分的图像块
% 计算宿主图像的每一块的方差
xx=1;
for j=1:c
for i=1:d
pjhd(xx)=1/64*sum(sum(cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8))); % 求灰度
fc(xx)=1/64*sum(sum((cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)-pjhd(xx)).^2)); % 求方差
xx=xx+1;
end
end
A=sort(fc);B=A((c*d-n+1):c*d); % 取出方差最大的前n块
% 将水印信息嵌入到方差最大的前n块
fc_o=ones(1,c*d);
for g=1:n
for h=1:c*d;
if B(g)==fc(h)
fc_o(h)=message(g); % 图像覆盖
h=c*d;
end
end
end
message_vector=fc_o;
watermarked_image=cover_object;
rand('state',7); % 设置MATLAB随机生成器状态J=7,作为系统密钥
pn_sequence_zero=round(rand(1,sum(sum(midband)))); % 根据当前生成器状态J,生成0,1的伪随机序列
% 嵌入水印
x=1;y=1;
for(kk=1:m)
% 分块DCT变换
dct_block=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
%纹理大(方差最大的前n块)且被标示的水印信息为0的块在其DCT中频系数嵌入伪随机序列
ll=1;
if(message_vector(kk)==0)
for ii=1:blocksize
for jj=1:blocksize
if(midband(jj,ii)==1)
dct_block(jj,ii)=dct_block(jj,ii)+k*pn_sequence_zero(ll);
ll=ll+1;
end
end
end
end
% 分块DCT反变换
watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=idct2(dct_block);
% 换行
if(x+blocksize)>=Nc
x=1;y=y+blocksize;
else
x=x+blocksize;
end
end
watermarked_image_int=uint8(watermarked_image);
% 生成并输出嵌入水印后的图像
imwrite(watermarked_image_int,'dct2_watermarked.bmp','bmp');
% 显示峰值信噪比
xsz=255*255*Mc*Nc/sum(sum((cover_object-watermarked_image).^2));
psnr=10*log10(xsz)
% 显示嵌入水印后的图像
figure(1)
imshow(watermarked_image_int,[])
title('Watermarkd Image')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -