デジタル画像ステガノグラフィーのカイ二乗分布

1. 実験目的

1. カイ二乗解析アルゴリズムを実装します。

2. カイ二乗解析を使用すると、LSB によってステガノグラフィーされた暗号画像と、ステガノグラフィー アルゴリズムによって変更されていない元のキャリア画像を区別できます。

2. 問題の説明

1. 入力形式と入力値の範囲。

bmp 形式の標準画像 84 枚。

2. 出力フォーム。

タスク 1: カイ二乗分析の比較チャートと秘密画像と元の画像の間の境界線。

task2: task1 のセグメンテーション値 T を使用して画像タイプをテストし、予測精度を取得します。

3. プログラムが実現できる機能。

分類された画像と元の画像は、カイ二乗分布検定または固有値検定を通じて区別できます。

タスク 1: 84 枚の標準ライブラリ画像に秘密情報を埋め込むことにより、84 枚の秘密を含む画像を取得しました。合計 168 枚の画像に対して 2 つの異なるカイ二乗解析を実行し、2 つの異なるカイ二乗値の比較チャートとセグメンテーション値を取得しました。平方解析法。T;

タスク 2: 84 枚の標準ライブラリ画像を使用し、最初の 42 枚には秘密情報が埋め込まれて秘密画像を形成し、最後の 42 枚には秘密情報が埋め込まれていないオリジナル画像を作成し、タスク 1 で生成されたセグメンテーション値 T をテストして画像の種類を識別します。 (元の画像または秘密画像) 画像) 予測精度。

3. 実験原理

シンプルな LSB ステガノグラフィー アルゴリズムのピクセル値変更分析:

画素値2iが2i+1に変更される場合、または2i+1が2iに変更される場合、埋め込みデータd=0/1である場合、確率は50%である。

グレー値 j を持つピクセルの数を hj とします。

ステガノグラフィー画像と元の画像の比較:

ステガノグラフィー画像の h2i と h2i+1 の値は近くなります (ヒストグラムはペアで表示されます)。図 1 は元の画像のヒストグラム、図 2 はステガノグラフィー画像のヒストグラムです。

1

2 

統計を満たす最小の画像を見つけます。 と の間のサイズ関係を判断することで、その画像がステガノグラフィー画像であるかオリジナル画像であるかを知ることができます。

4. 実験計画

メイン関数 task1.m と task2.m は、関数 StgPrb.m と関数 Diff.m を呼び出します。

タスク 1 では、84 枚の標準画像を入力として秘密情報を埋め込み、合計 168 枚の秘密画像を取得し、合計 168 枚の画像を用いてカイ二乗解析を行い、予測セグメンテーション値 T とカイ二乗値比較チャートを取得します。

カイ二乗解析法 1 における元画像と分類画像のカイ二乗値の比較を図 3 に示します。

画像3

 図 4 に示すように、カイ二乗解析方法 1 の結果を対数処理して、結果をより明確にし、カイ二乗値の差を減らします。

 

図4 

カイ二乗解析法 2 における元画像と分類画像のカイ二乗値の比較表を図 5 に示します。

図5

task2 では標準画像 84 枚を入力とし、最初の 42 枚には画像埋め込み率 1 となるように秘密情報を埋め込み、最後の 42 枚には情報を埋め込まず、StgPrb 関数を呼び出すことで画像のカードを取得します。 .m と関数 Diff.m 二乗値を使用し、セグメンテーション値 T と比較して、画像の特定のタイプを予測します。予測されたタイプと実際のタイプを比較することで、予測精度が得られます。

関数 StgPrb.m を使用した予測精度は 100%、関数 Diff.m を使用した予測精度は 98.81% です。

以下の図 6 は、検出方法 1 における画像の実際のタイプと予測されたタイプを示しています。ここで、1 は暗号化された画像を表し、0 は元の画像を表します。

 図6

以下の図 7 は、検出方法 2 における画像の実際のタイプと予測されたタイプを示しています。ここで、1 は暗号化された画像を表し、0 は元の画像を表します。

図7

 5. まとめ

Diff.m 関数を設計した後、異なる画像のカイ 2 乗値が大きく異なることが判明しました。log 関数を使用して、異なる画像のカイ 2 乗値の大きさのオーダーを削減しました。さまざまな種類の画像のカイ二乗値の結果がより明白になります。

インターネット上で、より良いカイ 2 乗解析方法を見つけました。それは、chi2cdf 関数を使用して、散乱値をより規則的に巧妙にします。最終的に、ほとんどの秘密画像のカイ 2 乗値は 1 に達し、カイ元の画像の -square 値は 0 です。テストで画像タイプを決定するためのセグメンテーション値として 0.5 を使用した場合、予測精度は 100% もの高さになります。


6.付録コード

task1.m

%% 清空环境
clc
clear
close all

%% 数据测试(84个训练图像)
cover=cell(84,1);
stego=cell(84,1);
sizes=zeros(84,2);
p1=zeros(84,2);
p2=zeros(84,2);
for k=1:84
    secret=rand(512)<0.5;
    %% 读取图像
    text=['original/',num2str(k),'.bmp'];
    cover{k}=imread(text);
    [sizes(k,1),sizes(k,2)]=size(cover{k});
   
    %% 求卡方值
    p1(k,1)=StgPrb(cover{k});
    %% 求特征值
    p2(k,1)=Diff(cover{k});
    
    %% 嵌入信息
    for i=1:sizes(k,1)
        for j=1:sizes(k,2)
            stego{k}(i,j)=bitset(cover{k}(i,j),1,secret(i,j));
        end
    end
    
    %% 求卡方值
    p1(k,2)=StgPrb(stego{k});
    %% 求特征值
    p2(k,2)=Diff(stego{k});
end

T=max(p2(:,2));

figure();
plot([1:84],p2(:,1),'r+',[1:84],p2(:,2),'b+',[1:84],ones(84,1).*T,'g-');
legend('原始图像','嵌入率为1的载密图像','分割线T');
xlabel('图像编号');
ylabel('特征值');

figure();
p2=log(p2);
T=log(T);
plot([1:84],p2(:,1),'r+',[1:84],p2(:,2),'b+',[1:84],ones(84,1).*T,'g-');
legend('原始图像','嵌入率为1的载密图像','分割线T');
xlabel('图像编号');
ylabel('log(特征值)');

figure();
plot([1:84],p1(:,1),'r+',[1:84],p1(:,2),'b+');
legend('原始图像','嵌入率为1的载密图像');
xlabel('图像编号');
ylabel('卡方值');

save T.mat T

task2.m

clc
clear
close all

load T.mat

%% 数据测试(84个测试图像)
cover=cell(84,1);
p1=zeros(84,1);
p2=zeros(84,1);
predict=zeros(84,2);
for k=1:42
    secret=rand(512)<0.5;
    %% 读取图像
    text=['original/',num2str(k),'.bmp'];
    cover{k}=imread(text);
    [sizes(k,1),sizes(k,2)]=size(cover{k});
    
    %% 嵌入信息
    for i=1:sizes(k,1)
        for j=1:sizes(k,2)
            cover{k}(i,j)=bitset(cover{k}(i,j),1,secret(i,j));
        end
    end
    
    %% 求卡方值
    p1(k)=StgPrb(cover{k});
    %% 求特征值
    p2(k)=Diff(cover{k});
    p2(k)=log(p2(k));
    
    if p1(k)>0.5
        predict(k,1)=1;
    else
        predict(k,1)=0;
    end
    
    if p2(k)>T
        predict(k,2)=0;
    else
        predict(k,2)=1;
    end
end

for k=43:84
    %% 读取图像
    text=['original/',num2str(k),'.bmp'];
    cover{k}=imread(text);
    [sizes(k,1),sizes(k,2)]=size(cover{k});
 
    %% 求卡方值
    p1(k)=StgPrb(cover{k});
    %% 求特征值
    p2(k)=Diff(cover{k});
    p2(k)=log(p2(k));
    
    if p1(k)>0.5
        predict(k,1)=1;
    else
        predict(k,1)=0;
    end
    
    if p2(k)>T
        predict(k,2)=0;
    else
        predict(k,2)=1;
    end
end

%% 求预测准确度
predict_rate1=0;
predict_rate2=0;
for k=1:42
    if predict(k,1)==1
        predict_rate1=predict_rate1+1;
    end
    if predict(k,2)==1
        predict_rate2=predict_rate2+1;
    end
end

for k=43:84
    if predict(k,1)==0
        predict_rate1=predict_rate1+1;
    end
    if predict(k,2)==0
        predict_rate2=predict_rate2+1;
    end
end
predict_rate1=predict_rate1/84
predict_rate2=predict_rate2/84
dx=[1:84];
real=[ones(1,42),zeros(1,42)];
figure();
plot(dx,real,'r*',dx,predict(:,1),'bo');
title("检验方法1");
legend('实际类型','预测类型');
figure();
plot(dx,real,'r*',dx,predict(:,2),'bo');
title("检验方法2");
legend('实际类型','预测类型');

StgPrb.m

function p=StgPrb(x)
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
r=sum(((h2i(idx)-h2is(idx)).^2)./(h2is(idx)));
p=1-chi2cdf(r,k-1);

差分

function p=Diff(x)
p=0;
[n,~]=imhist(x);
for i=0:127
    p=p+(n(2*i+1)-n(2*i+2))^2;
end

おすすめ

転載: blog.csdn.net/HUANGliang_/article/details/125995852