LSB水印嵌入算法

1、加载原始图像和需要嵌入的信息

%读取载体图像
orig_image=imread('cameraman.tif');
%读取秘密信息
message=imread('text.png');
figure('Position',[0,0,700,300])
subplot(1,2,1);
imshow(orig_image);
title('原始信息');
subplot(1,2,2);
imshow(message);
title('需要嵌入的消息');
基于最低有效位LSB的方法,原理为将水印直接嵌入到原始信号表示数据的最不重要 的位置(最低有效位)中。从下图可以看出,将水印嵌入到最低位B0位对图像影响很小,B0位可以称为最低有效位
figure();
for i=1:8
subplot(2,4,i)
b=bitget(orig_image,i);
imshow(255*b);
title(sprintf("第%d位平面 B_%d",i,i-1))
end
sgtitle("图像的各个位平面B_7B_6B_5B_4B_3B_2B_1B_0")

2、水印嵌入算法

%确定载体图像大小
Hc=size(orig_image,1);
Nc=size(orig_image,2);
%确定秘密信息大小
Hm=size(message,1);
Wm=size(message,2);
%确定秘密信息生成载体图像大小的水印信息
watermark=zeros(Hc,Nc);
for i=1:Hc
for j=1:Nc
watermark(i,j)=message(mod(i,Hm)+1,mod(j,Wm)+1);
end
end
%将水印信息嵌入载体图像
watermarked_image=orig_image;
for i=1:Hc
for j=1:Nc
watermarked_image(i,j)=bitset(watermarked_image(i,j),1,watermark(i,j));
end
end
figure();
imshow(watermarked_image);
title('带有数字水印的图片');

3、提取水印算法

% 水印图像的大小
[Hw,Ww,~]=size(watermarked_image);
% 水印信息提取过程
watermark2=zeros(Hw,Ww);
for i=1:Hw
for j=1:Ww
watermark2(i,j)=bitget(watermarked_image(i,j,1),1);
end
end
watermark2=2*double(watermark2);
%显示水印
figure();
subplot(1,2,1);
imshow(watermark)
title("原水印")
subplot(1,2,2)
imshow(watermark2);
title('恢复出来的水印');
注:
  1. MATLAB 自带图片一般位于路径如/Applications/MATLAB_R2021a.app/toolbox/images/imdata/