LSB密写分析-信息量估计法

2020-07-18  本文已影响0人  科科Cole

信息量估计法的实现,简单说,先计算原图像F1,F2判断是否经过密写,再二次密写,在不同密写率下计算不同的F1,F2,将得到的点进行直线拟合,求得f1,f2两直线交点,由交点横坐标计算出密写率p。

  1. 信息量估计法主程序
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
  1. 信息量估计法中求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
  1. 信息量估计法中引用到的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
上一篇下一篇

猜你喜欢

热点阅读