MATLABスタディノートステガノグラフィ-画像内のメッセージ/画像を非表示

1.ステガノグラフィ

1。概要

        ステガノグラフィは、別のドキュメントや画像に秘密情報を隠し、別の人がそれを抽出する手法です。元の画像の変更に気付かずに、画像内のテキストメッセージまたは画像を非表示にする方法を学習します。

2.プロセスの簡単な説明

(1)そのようなマトリックスがあります

(2)「de2bi」メソッドを使用してバイナリ形式に変換します

        de2biメソッドは、デフォルトで正しいMSB順序になっています。

10進数の場合は7

  (3)「A」と「h」に対応する値はそれぞれ65と104です

        65バイナリ表現

        マトリックスのLSBビットの一部を置き換えます。

 (4)同じ方法でh、104を処理します

 (5)最終的な行列は次のようになります

 2つのmatlabの例の非表示のテキストメッセージ

1.暗号化コード

        暗号化される文字列は「この長さが小さい場合、これはmatlabデモです」であり、暗号化された画像はEncrypt1.pngとして保存されます。メッセージの長さは画像のサイズと一致し、短すぎたり長すぎたりしないことに注意してください。

    %ENCRYPTION

    clear all
    %READ THE INPUT IMAGE
    A = imread('图片/cameraman.tif');

    %
    Output = A;

    %MESSAGE TO BE HIDDEN INSIDE THE IMAGE
    Str = 'this is a matlab demo, if this lenght small';

    %NUMBER OF CHARACTERS IN THE MESSAGE
    numLetters = numel(Str);

    %REPRESENT THE LENGTH OF THE MESSAGE IN BINARY FORMAT
    Bi_Total = de2bi(numLetters,8);
    Bi_Msg = de2bi(double(Str),8)';

    Encrypt_msg = Bi_Msg(:)';

    %FIND THE LENGTH OF THE MESSAGE IN THE BINARY FORMAT
    num_En_msg = numel(Encrypt_msg);


    %DEFINE THE INTERVAL BETWEEN EACH VALUE
    dt=floor(numel(A)/num_En_msg);

    %BINARY VALUE OF THE INTERVAL
    Bi_dt = de2bi(dt,8);

    % FIRST 8 BITS - INTERVAL
    % SECOND 8 BITS - TOTAL LENGTH OF THE BINARY VALUES
    Info_data = [Bi_dt,Bi_Total];
    Output(1:16) = bitset(A(1:16),1,Info_data);

    %REPLACE THE LEAST SIGNIFICANT BIT IN THE IMAGE
    Start_pt =17;
    End_pt = (num_En_msg*dt)+16;
    Output(Start_pt:dt:End_pt) = bitset(A(Start_pt:dt:End_pt),1,Encrypt_msg);


    figure,subplot(121),imshow(A);title('Original Image');
    subplot(122),imshow(Output);title('Image with the hidden message');

    %SHOW THE DIFFERENCE BETWEEN THE ORIGINAL AND THE ENCRYPTED IMAGE
    figure,imagesc(double(A)-double(Output));colormap(jet);colorbar;

    %WRITE THE ENCRYPTED IMAGE IN THE PNG FORMAT
    imwrite(Output,'Encrypt1.png');

    display('Message is hidden inside the image!');

        メッセージは、バイナリ形式に変換し、画像ピクセルの最下位ビットに配置することにより、画像に隠されます。暗号化された画像は、ロスレス圧縮のために「PNG」画像ファイルとして保存されます。可逆圧縮技術では、ピクセル値は変更されないため、LSBに埋め込まれている情報が失われることはありません。

        元の画像と暗号化された画像の最大絶対値の差は1です。画像のLSBビットのみを扱うためです。

左:元の画像、右:メッセージが非表示の画像

        隣接するピクセルを置き換える代わりに、シークレットメッセージのビットを特定のパターンまたは一定の間隔で配置できます。次の図は、これらのビットが特定の間隔値に配置されていることを示しています。

2.復号化コード

%DECRYPT THE MESSAGE
clear all
    clc
    %READ THE ENCRYPTED IMAGE
    A = imread('Encrypt1.png');

    %FIRST 8 BITS REPRESENT THE INTERVAL
    Dt = bitget(A(1:8),1);
    Dt = double(bi2de(Dt));


    %LENGTH OF THE TEXT MESSAGE
    Len = bitget(A(9:16),1);
    Len = double(bi2de(Len));

    %FETCH THE LEAST SIGNIFICANT BIT FROM THE ENCRYPTD IMAGE
    Start_pt = 17;
    End_pt = (Len*Dt*8)+16;
    Decrypt_msg = bitget(A(Start_pt:Dt:End_pt),1);

    %CONVERT THE IMAGE INTO DECIMAL
    Decrypt_msg = reshape(Decrypt_msg,8,[])';
    Dec_Char   = bi2de(Decrypt_msg)';

    display('Text Message inside the image:');
    display(char(Dec_Char));

        コードを実行すると、出力され、正常に復号化されます。

画像内のテキストメッセージ:
この長さが小さい場合、これはMATLABデモです

第三に、matlabの例は画像を非表示にします

1.写真の例

        画像を非表示にするために使用される画像

        非表示にする画像。非表示にする画像は、大きい画像の10%未満である必要があることに注意してください。 

 1.暗号化

         参照コード

%ENCRYPTION
    clear all

    %READ THE COVER IMAGE
    I = imread('123.png');

    %READ THE IMAGE TO HIDE
    J = imread('a12345.png');

    %PREALLOCATE THE OUTPUT IMAGE
    Output = zeros(size(I));
    %REPRESENT THE NUMBER OF ROWS AND COLUMNS OF THE SECRET IMAGE
    %IN BINARY FORMAT
    Jsize = de2bi([size(J,1),size(J,2)]);

    %RED,GREEN AND BLUE COMPONENTS OF THE SECRET IMAGE
    Red_Ch = J(:,:,1);
    Green_Ch = J(:,:,2);
    Blue_Ch = J(:,:,3);

    %CONVERT THE RED COMPONENT OF THE SECRET IMAGE INTO BINARY FORMAT
    Encrypt_Red = de2bi(Red_Ch(:),8)';
    Encrypt_Red = Encrypt_Red(:)';

    %CONVERT THE GREEN COMPONENT OF THE SECRET IMAGE INTO BINARY FORMAT
    Encrypt_Green = de2bi(Green_Ch(:),8)';
    Encrypt_Green = Encrypt_Green(:)';

    %CONVERT THE BLUE COMPONENT OF THE SECRET IMAGE INTO BINARY FORMAT
    Encrypt_Blue = de2bi(Blue_Ch(:),8)';
    Encrypt_Blue = Encrypt_Blue(:)';

    %CALCULATE THE INTERVAL AND CONVERT IT INTO BINARY FORMAT
    dt=floor((size(I,1)*size(I,2))/numel(Encrypt_Red));
    Bi_dt = de2bi(dt,8);

    Info_data = [Bi_dt,Jsize(1,:),Jsize(2,:)];

    %RED,GREEN AND BLUE COMPONENT OF THE COVER IMAGE
    Red_mat = I(:,:,1);
    Green_mat = I(:,:,2);
    Blue_mat = I(:,:,3);

    % INTERVAL,NUMBER OF COLUMNS, NUMBER OF ROWS
    Red_mat(1:24) = bitset(Red_mat(1:24),1,Info_data);
    Green_mat(1:24) = bitset(Green_mat(1:24),1,Info_data);
    Blue_mat(1:24) = bitset(Blue_mat(1:24),1,Info_data);

    %%REPLACE THE LEAST SIGNIFICANT BIT OF THE COVER IMAGE
    %WITH THE BINARY FORMAT OF THE SECRET IMAGE
    EndValue = numel(Encrypt_Red)*dt+24;
    Red_mat(25:dt:EndValue) = bitset(Red_mat(25:dt:EndValue),1,Encrypt_Red);
    Green_mat(25:dt:EndValue) = bitset(Green_mat(25:dt:EndValue),1,Encrypt_Green);
    Blue_mat(25:dt:EndValue) = bitset(Blue_mat(25:dt:EndValue),1,Encrypt_Blue);

    %ENCRYPTED IMAGE
    Output(:,:,1) = Red_mat;
    Output(:,:,2) = Green_mat;
    Output(:,:,3) = Blue_mat;
    Output = uint8(Output);

    figure,subplot(121),imshow(I); subplot(122),imshow(Output);

    %DIFFERENCE BETWEEN THE ORIGINAL AND THE ENCRYPTED IMAGE
    figure,imagesc(double(I)-double(Output));colormap(jet);colorbar;

    %WRITE THE ENCRYPTED IMAGE IN THE PNG FORMAT
    imwrite(Output,'Encrypt_Image2.png');

        元の画像と暗号化された画像

         全体像における隠された画像の分布。

 2.復号化

%DECRYPT IMAGE
    clear all
    %READ THE ENCRYPTED IMAGE
    A = imread('Encrypt_Image2.png');
    %RED,GREEN AND BLUE COMPONENTS
    Red_ch = A(:,:,1);
    Green_ch = A(:,:,2);
    Blue_ch = A(:,:,3);
    %INTERVAL
    Dt = bitget(Red_ch(1:8),1);
    Dt = double(bi2de(Dt));
    %NUMBER OF COLUMNS
    Ncols = bitget(Red_ch(9:16),1);
    Ncols = double(bi2de(Ncols));
    %NUMBER OF ROWS
    Nrows = bitget(Red_ch(17:24),1);
    Nrows = double(bi2de(Nrows));
    %FETCH THE LEAST SIGNIFICANT BIT FROM THE ENCRYPTED IMAGE
    EndPoint = (Dt*Nrows*Ncols*8)+24;
    Decrypt_Red = bitget(Red_ch(25:Dt:EndPoint),1);
    Decrypt_Green = bitget(Green_ch(25:Dt:EndPoint),1);
    Decrypt_Blue = bitget(Blue_ch(25:Dt:EndPoint),1);
    Decrypt_Red = reshape(Decrypt_Red,8,[])';
    Decrypt_Red = bi2de(Decrypt_Red);
    Decrypt_Red = reshape(Decrypt_Red,Ncols,Nrows);
    Decrypt_Green = reshape(Decrypt_Green,8,[])';
    Decrypt_Green = bi2de(Decrypt_Green);
    Decrypt_Green = reshape(Decrypt_Green,Ncols,Nrows);
    Decrypt_Blue = reshape(Decrypt_Blue,8,[])';
    Decrypt_Blue = bi2de(Decrypt_Blue);
    Decrypt_Blue = reshape(Decrypt_Blue,Ncols,Nrows);
    Decrypted_Image = zeros([Ncols,Nrows,3]);
    Decrypted_Image(:,:,1)=Decrypt_Red;
    Decrypted_Image(:,:,2)=Decrypt_Green;
    Decrypted_Image(:,:,3)=Decrypt_Blue;
    Decrypted_Image = uint8(Decrypted_Image);
    imwrite(Decrypted_Image,'Decrypted_Image2.png');
    figure,imshow(Decrypted_Image);title('Secret Image');

        復号化された秘密の画像。 

おすすめ

転載: blog.csdn.net/bashendixie5/article/details/123260488