0

だからここに私がやろうとしていたことがあります。私はmatlabが初めてです。使ってまだ 1 日ほどしか経っていません。LSB アルゴリズムを使用して、イメージ内にステートメントまたは文字列のグループを埋め込みます。文字列はファイルから読み取られます。今のところ、ファイル操作は使用していません。1 つの文字を使用してこれを試していますが、何が問題なのかわかりません。アルゴは単純に見えますが、私の出力、つまりカバー ピクセルとステグ ピクセルの両方が同じ値を示しています。:(

cover=imread('D:\l.jpg');
steg=cover;
l=1;
LSB=0;
height = size (cover, 1);
width = size (cover, 2);
message = 'J' ;
mdec = uint8(message);
mbin = dec2bin(mdec, 8);
mbins= mbin(:);
len=length(mbins);

for  i  = 1:height
for j = 1:width
        if(l<=len)
            LSB = mod(cover(i,j), 2);
            if(mbins(l)==LSB)
                steg(i,j) = cover(i,j);
            else if (mbins(l)~=LSB &&    LSB==1 && mbins(l)==0)
                steg(i,j) = cover(i,j)-1;
            else if (mbins(l)~=LSB &&    LSB==0 && mbins(l)==1)
                steg(i,j) = cover(i,j)+1;

                end
                end
                end
                    l=l+1;  
        end
end

end
imwrite(steg,'D:\hidden.jpg');
%imshow(steg)
cover(1, 1:8)
steg(1, 1:8)
4

1 に答える 1

1

ああ、ネストされたループ...それは行くべき道ではありません。

最初のピクセルの最下位ビットを、l入力文字列のバイナリ ASCII 表現に置き換えたいとします。


最初に失敗したこと - 文字をバイナリに
変換: 文字をバイナリ表現に変換するには、bitget

>> bitget( uint8('J'), 1:8 )
0    1    0    1    0    0    1    0

を使用して、1 行 8 列のバイナリ配列dec2binを返します。

>> dec2bin( uint8('J'), 8 ) 
01001010

1 行 8列の文字列を返します。この配列の実際の数値は次のとおりです。

>> uint8(dec2bin( uint8('J'), 8 ))
48   49   48   48   49   48   49   48

2 つの方法の違いを理解できますか?

の使用を主張する場合はdec2bin、検討してください

>> dec2bin( uint8('J'), 8 ) - '0'
0     1     0     0     1     0     1     0

2 番目のポイント - ネストされたループ:
Matlab は、ループよりもベクトル/行列のベクトル化された操作を優先します。

coverが type のグレースケール画像 (つまり、3 つではなく 1 つのカラーチャンネルを持つ) であると仮定して、ループなしでそれを行う良い方法を次に示しuint8ます。

NoLsb = bitshift( bitshift( cover, -1 ), 1 ); %// use shift operation to set lsb to zero 
lsb = cover - NoLsb; %// get the lsb values of ALL pixels
lsb( 1:l ) = mbins; %// set lsb of first l pixels to bits of message
steg = NoLsb + lsb; %// this is it!
于 2014-12-24T18:18:37.307 に答える