信息量估计法的实现,简单说,先计算原图像F1,F2判断是否经过密写,再二次密写,在不同密写率下计算不同的F1,F2,将得到的点进行直线拟合,求得f1,f2两直线交点,由交点横坐标计算出密写率p。
- 信息量估计法主程序
image='ste_cover.bmp';
ste_cover=imread(image);
ste_cover=double(ste_cover);
[f1(1),f2(1)]=CalF(ste_cover); %得到初始f1,f2
fprintf('F1=%d,F2=%d\n',f1(1),f2(1));
%判断f2是否显著性大于f1(0.05)
if f2(1)<=(f1(1)*1.05) %判断是否含秘密信息
fprintf('不含秘密信息\n');
else
fprintf('含有秘密信息\n');
rate(1)=0;
i=2;
for r=0.1:0.1:1 %二次嵌入
ste2_cover=LSB(ste_cover,r);
[f1(i),f2(i)]=CalF(ste2_cover);
rate(i)=r;
i=i+1;
end
%对f1,f2线性拟合,F=a*rate+b
f1s=polyfit(rate,f1,1); %一次方程
f2s=polyfit(rate,f2,1);
a1=f1s(1);
b1=f1s(2);
a2=f2s(1);
b2=f2s(2);
plot(rate,f1,'o',rate,polyval(f1s,rate));
hold on;
plot(rate,f2,'o',rate,polyval(f2s,rate));
legend('F1','F1','F2','F2');
xlabel('Embedding rate alpha');
ylabel('Values of F1 and F2');
syms x y; %将x y设为符号变量
eq1=y==a1*x+b1;
eq2=y==a2*x+b2;
p=solve([eq1,eq2],[x,y]); %求y1,y2两直线交点
pb=p.x;
pf=p.y;
alpha=(abs(pb))/(1+abs(pb));
alpha=double(alpha);
format bank;
fprintf('嵌入率为%d\n',alpha);
end
- 信息量估计法中求F1,F2值的程序
function [f1,f2]=CalF(matrix)
n=hist(matrix(:),[0:255])'; %得到matrix的直方图
h2i=n([1:2:255]); %h(2i)
h2ip1=n([2:2:256]); %h(2i+1)
h2ip2=n([3:2:255]); %h(2i+2)
f1=0;
f2=0;
for i=1:127
f1=f1+abs(h2ip1(i)-h2i(i));
i=i+1;
end
for i=1:126
f2=f2+abs(h2ip2(i)-h2ip1(i));
i=i+1;
end
- 信息量估计法中引用到的LSB密写程序
function ste_cover=LSB(cover,rate)
ste_cover=double(cover); %将图像矩阵的类型转换成双精度型,便于后续的运算
[m,n]=size(ste_cover); %读取ste_cover的行和列
%根据rate计算秘密信息位的长度并生成秘密信息
msg_len=floor(m*n*rate);
msg=randsrc(1,msg_len,[0 1;0.5 0.5]);
p=1; %p为秘密信息的位计数器
%按照产生的秘密信息依次将图片层的最后一位替换为秘密消息
for f2=1:n
for f1=1:m
if p>=msg_len
break;
end
ste_cover(f1,f2)=ste_cover(f1,f2)-mod(ste_cover(f1,f2),2)+msg(1,p);
p=p+1;
end
if p==msg_len
break;
end
end
网友评论