针对LSB 信息隐藏的卡方分析算法实现

Posted 图图奇遇记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了针对LSB 信息隐藏的卡方分析算法实现相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、实验背景

1.实验目的

(×)了解什么是隐写分析、隐写分析与信息隐藏和数字水印的关系。掌握基于图像的 LSB 隐写的分析方法,设计并实现一种基于图像的 LSB 卡方隐写分析方法。
(√)实现一种基于图像的 LSB 卡方隐写分析方法

2.实验环境

(1) Windows 11 操作系统;
(2) Matlab R2020b 科学计算软件;
(3)图像文件test.bmp;

二、原理介绍

1.隐写分析技术

隐写术和隐写分析技术即是互相矛盾、又是相互促进的。隐写分析是指对可疑的载体信息进行攻击,以达到检测、破坏、甚至是提取秘密信息的技术,它的主要目标是为了揭示媒体中隐蔽信息的存在性,甚至只是指出媒体中存在秘密信息的可能性。

2.针对LSB的图像隐写分析技术

图像LSB信息隐藏的方法是用嵌入的秘密信息取代载体图像的最低比特位,原来图像的7个高位平面与代表秘密信息的最低位平面组成含隐蔽信息的新图像。算法详细内容及相关实现代码可以参考下面这篇博客:

基于matlab实现的LSB 图像信息隐藏算法(含源码)

虽然LSB隐写在隐藏大量信息的情况下依然保持良好的视觉隐蔽性,但使用有效的统计分析工具仍可判断一幅载体图像中是否含有秘密信息。
目前对于图像LSB信息隐藏主要分析方法有卡方分析、信息量估算法、RS分析法和GPC分析法等,此处仅介绍卡方分析方法的算法并进行相关实验。

3.卡方分析

①原理
灰度直方图是关于图像灰度级分布的函数,它将数字图像中的所有像素,按照灰度值的大小,统计其出现的次数,即图像中具有某种灰度级的像素的个数。在原始图像(灰度值为0-255)中,相邻灰度值的像素块数目一般差别很大。但在LSB信息隐藏中,秘密信息在嵌人之前往往经过加密,可以看作是0、1随机分布的比特流,而且值为0与1的可能性都是1/2。如果秘密信息完全替代载体图像的最低位,那么伪装对象相邻灰度值的像素块数目将会比较接近,我们就可以根据这个性质判断图像是否经过隐写。
此处,我们定量分析载体图像最低位完全嵌入秘密信息的情况。在这种情况下,我们可以将相邻的灰度值两两分组(灰度值一奇一偶),因为嵌入信息总是嵌入载体图像的最低比特位,其像素值要么不变,要么出现由奇数到相邻偶数(减一)、或由偶数到相邻奇数(加一)的改变,这种改变会改变直方图的分布(由差别很大变得近似相等),但是却不会改变这组整体的像素块数目之和。
此外,卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。

②算法

设图像中灰度值为 j 的像素数为 h(j) , 其中 0 ≤ j ≤ 255。灰度直方图横坐标为 j ,纵坐标为 h (j) 。如果载体图像未经隐写,h(2i) 和 h(2i+1) 的值会相差得很远,如果秘密信息完全替代载体图像的最低位,那么 h(2i) 和 h(2i+1) 的值会比较接近。嵌入信息会改变灰度直方图的分布,由差别很大变得近似相等,但是却不会改变 h(2i) + h(2i+1) 的值,因为样值要么不改变,要么就在h(2i) 和 h(2i+1) 之间改变。设以下两个参数,显然 h(2i)* 在隐写前后是不会变的,而 q 则会改变。

如果样值(伪装对象的像素值)为 2i ,那么它对参数q 的贡献为 1/2 ;如果样值为 2i+1 ,那么它对参数q的贡献为 -1/2。载体音频中共有 2h(2i)* 个样点的值为 2i 或 2i+1,若所有样点都包含 1 bit的秘密信息,那么每个样点为 2i 或 2i+1 的概率就是 0.5,当2h(2i)较大时,根据中心极限定理,下式成立:

其中,—>N(0,1)表示近似服从正态分布。因此 随机变量 r 服从卡方分布:

其中,k 等于h(2i) 和 h(2i+1) 所组成数字对的数量,2h(2i)* 为 0 的情况不计在内。r 越小表示载体含有秘密信息的可能性越大。结合卡方分布的密度计算函数计算载体被隐写的可能性为:

如果p接近于1,则说明载体图像含有秘密信息。

三、实验内容及源码

1.LSB嵌入和直方图变化

对图像进行LSB嵌入,比较嵌入秘密信息前后的直方图的变化。
源代码hist_change.m如下:

[fn,pn]=uigetfile('*.jpg','JPEG files(*.jpg)';'*.bmp','BMP files(*.bmp)','Select file to hide');
name=strcat(pn,fn);
I=rgb2gray(imread(name)); %对灰度图像进行隐藏
sz=size(I);
% generate msg
rt=1;%隐写率为 100%
row=round(sz(1) *rt);
col=round(sz(2) *rt);
msg=randsrc(row,col,[0 1;0.5 0.5]);
% LSB hide
stg=I;
stg(1:row,1:col)=bitset(stg(1:row,1:col),1,msg);
nI=sum(hist(I,[0:255]),2)';
nS=sum(hist(stg,[0:255]),2)';
x=[80:99];
figure;
stem(x,nI(81:100));figure;
stem(x,nS(81:100));

运行代码,选择准备好的jpeg或bmp图像进行测试,得到嵌入前和嵌入后的灰度直方图:

2.LSB嵌入和直方图变化

代码 StgPrb.m如下:

function p=StgPrb(x)
%对数据进行分析 对一个二维数组进行分析,数组里面的值在0-255 之间
n=sum(hist(x,[0:255]),2);
h2i=n([3:2:255]);
h2is=(h2i+n([4:2:256]))/2;
filter=(h2is~=0);
k=sum(filter);
idx=zeros(1,k);
for i=1:127
    if filter(i)==1
        idx(sum(filter(1:i)))=i;
    end
end
%compute statistics
r=sum(((h2i(idx)-h2is(idx)) .^2)./(h2is(idx)));
%compute probility 
p=1-chi2cdf(r,k-1);
% p = chi2cdf(r , k); 

3.LSB卡方分析

源代码 test.m如下:

clear all;
[fn,pn]=uigetfile('*.jpg','JPEG files(*.jpg)';'*.bmp','BMP files(*.bmp','Select file to hide');
name=strcat(pn,fn);
t=imread(name);
I=t(1:512,1:512);
sz=size(I);
for k=1;3
    %据隐写率大小生成秘密信息,隐写率为 0.3 0.5 0.7三种
    rt=0.3+0.2*(k-1);
    row=round(sz(1)*rt);
    col=round(sz(2)*rt);
    msg=randsrc(row,col,[0 1;0.5 0.5]);
    %LSB信息隐写
    stg=I;
    stg(1:row,1:col)=bitset(stg(1:row,1:col),1,msg);
    imwrite(stg,strcat(pn,strcat(sprintf('stg_%d_',floor(100*rt)),fn)),'bmp');
    i=1;
    for rto=0.1:0.01:1
        row=round(sz(1)*rto);
        col=round(sz(2)*rto);
        p(k,i)=StgPrb(stg(1:row,1:col));
        i=i+1;
    end
end

四、实验结果及分析

从结果p值我们可以看出,当隐写率为0.3时(第一行),p[1]–p[22]的值都接近1;当隐写率为0.5时,p[1]–p[42]的值都接近1;当隐写率为0.7时,p[1]–p[62]的值都接近1;
因此我们可以得到结论:卡方分析可以判定载体图像中是否含有秘密信息,但这要求秘密信息必须嵌满所有像素。





以上是关于针对LSB 信息隐藏的卡方分析算法实现的主要内容,如果未能解决你的问题,请参考以下文章

语音隐写基于 LSB语音隐藏matlab源码

用C或C++怎样提取出bmp图像的像素点信息值?用LSB算法做信息隐藏,位图是24位的。

图像隐写基于LSB+DCT实现数字水印嵌入提取带攻击测试matlab源码含GUI

Python-LSB隐写算法

关于rc列联表的卡方检验 求助!!!

卡方分布与卡方检验