一:代码
%LSB顺序替换嵌入和提取
%输入:载体图像C,秘密消息M
%显示:载体图像、载密图像、LSB平面分布情况
%嵌入消息明文message.txt,提取消息为secret.txt
C='Lena.bmp';
M='message.txt';
C1=imread(C);
%调用嵌入函数lsbshide
[C_M,C_C,L]=lsbshide(C,M);
%调用提取函数lsbsget
lsbsget('Lena_S.bmp',L);
%画图展示
subplot(1,3,1);imshow(C1);title('载体图像','FontSize',20);
subplot(1,3,2);imshow(C_M);title('载密图像','FontSize',20);
subplot(1,3,3);imshow(mat2gray(C_C));title('LSB平面分布情况图','fontsize',20);
调用的子函数:lsbshide.m
% LSB顺序替换嵌入算法--2016年6月24日
% 输入:载体C、秘密消息M。
% 输出:载密图像C_M、位平面C_C
% 1、将秘密消息M转化为二进制M1;
% 2、将转化为二进制的秘密消息M1嵌入到载体图像的LSB平面
%3、将载密图像C_M减去载体图像C,查看嵌入信息情况
% ---------------------------------------------------
% 函数功能介绍:实现LSB顺序替换嵌入
% 使用示例:function [C_M,C_C,L]=lsbshide('Lena.bmp','message.txt');
%输入输入参数介绍:
%C:载体图像
%M:秘密消息
%C_M:载密图像
%C_C:lsb平面
function [C_M,C_C,L]=lsbshide(C,M)
C=imread(C);%读取图像并存放到C中
C_M=C;
fileID=fopen(M,'r');%打开文件
[M,L]=fread(fileID,'ubit1');%读取文件的内容,并以二进制方式存放到向量M中
%将二进制的秘密消息M嵌入到载密图像的LSB面
[m,n]=size(C);
p=1;%嵌入计数器
for i=1:m
for j=1:n
C_M(i,j)=C(i,j)-mod(C(i,j),2)+M(p,1);%嵌入方法是先将LSB置零,然后加上秘密消息中的对应的0或1
if L==p %嵌入终止条件:当嵌入的个数为秘密消息的长度时,跳出循环,不再嵌入
break;
end
p=p+1;
end
if L==p %嵌入终止条件:当嵌入的个数为秘密消息的长度时,跳出循环,不再嵌入
break;
end
end
imwrite(C_M,'Lena_S.bmp','bmp');
%查看嵌入信息情况:将载密图像减去载体图像
for i=1:m
for j=1:n
C_C(i,j)=C_M(i,j)-C(i,j);
end
end
调用子函数:lsbsget.m
%LSB顺序替换提取--2016年6月27
%输入:载密图像C_M,嵌入长度L
%输出:秘密消息向量S
%输入输出格式:S=lsbsget('Lena_S.bmp',L)
%步骤:
%1、读取载密图像C_M
%2、读出LSB平面中0、1存入S中
%3、将二进制向量S转化为ASCII码并存放到文本文件secret.txt中
function S=lsbsget(C_M,L)
%读取载密图像矩阵
C_M1=imread(C_M);
[m,n]=size(C_M1);
S=zeros(1,L);
%读出LSB平面中0、1存入S中
for i=1:m
for j=1:n
if (i-1)*m+j>L%判断嵌入长度是否大于L,若大于L,则终止循环
break;
end
S(1,(i-1)*m+j)=mod(C_M1(i,j),2);
end
if (i-1)*m+j>L%判断嵌入长度是否大于L,若大于L,则终止循环
break;
end
end
%将二进制向量S转化为ASCII码并存放到文本文件secret中
fileID=fopen('secret.txt','w');
a=L/8;%计算字符个数
SC=zeros(1,a);
for i=1:a
b=0;
for j=1:8
b=b+S(1,(i-1)*8+j)*power(2,j-1);
end
SC(1,i)=b;
fwrite(fileID,SC(1,i),'char');
end
fclose(fileID);
二、实验结果展示
1、载体图像、载密图像、LSB平面分布情况
2、嵌入的消息message.txt,提取的消息secret.txt