改变两个大小相近的像素值,人的肉眼无法察觉出区别,所以将二进制的01作为是否改变的依据进行载体图像的修改,然后再根据修改后的载体图像进行倒推得到嵌入的秘密数据,从而实现无损的嵌入和提取。
误差预测直方图是利用图像中相邻像素值之间的相关性,构建原始图像的预测误差直方图,嵌入秘密信息。中值预测误差直方图的方法,原理是对像素点I(i,j),选取周围点A(i,j+1);B(i+1,j+1);C(i,j+1),算出中值与I的像素差,用像素差相近,即为0/1的点作为载体嵌入数据。
直方图平移法:
嵌入函数:
function [stego_I,emD] = Embed(origin_I,Data,PK,Z)
% 函数说明:根据峰值点和零值点嵌入信息
% 输入:origin_I(原始图像),Data(秘密数据),PK(峰值点),Z(零值点)
% 输出:stego_I(载密图像),emD(嵌入的秘密信息)
[m,n] = size(origin_I); %统计图像的行列数
num = numel(Data); %秘密信息个数
stego_I = origin_I;
%% 根据峰值点PK和零值点Z嵌入信息
t = 0; %计数,嵌入信息的个数
for i=1:m
for j=1:n
if t >= num %秘密信息已嵌完
break;
end
if stego_I(i,j)>PK && stego_I(i,j)<Z %将峰值点PK和零值点Z之间的像素向右平移
stego_I(i,j) = stego_I(i,j) + 1;
elseif stego_I(i,j)==PK
t = t+1;
stego_I(i,j) = stego_I(i,j) + Data(t);
end
end
end
%% 统计嵌入的秘密信息
emD = Data(1:t);
end
提取函数:
function [recover_I,reImg,exD] = Extract(stego_I,bitsnum,PK,Z,test)
% 函数说明:在载密图像中提取信息
% 输入:stego_I(载密图像),num(秘密数据个数),PK(峰值点),Z(零值点)
% 输出:recover_I(回复图像),exD(提取的秘密数据)
[m,n] = size(stego_I); %统计图像的行列数
recover_I = stego_I;
exD = zeros();
%% 根据峰值点PK和零值点Z提取信息
t = 0; %计数,提取信息的个数
for i=1:m
for j=1:n
if t >= bitsnum %秘密信息已提取结束
break;
end
if recover_I(i,j)>PK+1 && recover_I(i,j)<=Z %将峰值点PK+1和零值点Z之间的像素向左平移
recover_I(i,j) = recover_I(i,j) - 1;
elseif recover_I(i,j)==PK %提取0
recover_I(i,j) = recover_I(i,j);
t = t+1;
exD(t) = 0;
elseif recover_I(i,j)==PK+1 %提取1
recover_I(i,j) = recover_I(i,j)-1;
t = t+1;
exD(t) = 1;
end
end
end
[h w] = size(test);
reImg = uint8(zeros(h,w));
k = 0;
for i = 1:h*w
%bin2dec:将一个字符串表示的二进制数转换成一个十进制数
%num2str:将数组exD中的数转换成字符串表示形式
%显示图像,用unit8(无符号8位整型)调整为图像的标准数据格式
reImg(i) = uint8(bin2dec(num2str(exD(