0

テキストを非表示にしたい画像があります

次のようにビットプレーンを取得する必要があると思います。

a=imread('insect.gif');

[m n]=size(a);

for i=1:m,
    for j=1:n,
        b8(i,j)=bitand(a(i,j),128);
        b7(i,j)=bitand(a(i,j),64);
        b6(i,j)=bitand(a(i,j),32);
        b5(i,j)=bitand(a(i,j),16);
        b4(i,j)=bitand(a(i,j),8);
        b3(i,j)=bitand(a(i,j),4);
        b2(i,j)=bitand(a(i,j),2);
        b1(i,j)=bitand(a(i,j),1);
    end
end

そのため、「b1」に最初のビット、「b2」に2番目のビット、「b3」に3番目のビットがあります。

s='class is good'
h=dec2bin(s,8)

各文字のテキストが8ビットで表示されます。画像のマトリックスのLSBでテキストを非表示にする必要があると思いますが、その方法がわかりません。

4

3 に答える 3

0

ファイル交換でLSBSTEGANOGRAPHY送信を確認します。

コードはオープンであり、まさにあなたが必要としているものです。

于 2012-04-28T05:21:04.193 に答える
0

バイトイメージ(8ビット)があると仮定して、最初の3つのエンコードされたバイトまたは24ピクセルを見てみましょう。また、値255、1、および12を非表示にしたいとします。

3つの値をエンコードする前に

  MSB----LSB
1: 00000000  
2: 00000000
3: 00000000
4: 00000000
5: 00000000
6: 00000000
7: 00000000
8: 00000000

9: 00000000
10: 00000000
11: 00000000
12: 00000000
13: 00000000
14: 00000000
15: 00000000
16: 00000000

17: 00000000
18: 00000000
19: 00000000
20: 00000000
21: 00000000
22: 00000000
23: 00000000
24: 00000000

3つの値をエンコードした後

  MSB----LSB
1: 00000001 
2: 00000001
3: 00000001
4: 00000001
5: 00000001
6: 00000001
7: 00000001
8: 00000001

9: 00000000
10: 00000000
11: 00000000
12: 00000000
13: 00000000
14: 00000000
15: 00000000
16: 00000001

17: 00000000
18: 00000000
19: 00000000
20: 00000000
21: 00000001
22: 00000001
23: 00000000
24: 00000000

したがって、必要なのは、各ピクセルのLSBが0または1であることを確認することだけです(つまり b1(i,j)=bitand(a(i,j),1);、最上位ビットを変更すると画像が著しく変更される可能性があるため、必要なだけです) 。

function pixVal = setPixel(pixVal, zeroOne)

   isOdd = mod(pixVal,2);

  if zeroOne == 1
    if ~isOdd 
       pixVal = pixVal +  1;
    end
  else 
    if isOdd
       pixVal = pixVal - 1;
    end
  end

end    



function arr = setTextInArr( arr, text )

 %convert text to binary
 lsb = dec2bin(text,8)';

 for i=1:numel(lsb)
    val = arr(i);
    val = setPixel(val, str2num(lsb(i)));
    arr(i) = val;
 end

end

小さな画像で「こんにちは」をエンコードする

>> img = zeros(8,16, 'uint8')

img =

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

>> s = 'hi'

s =

hi

>> encImg = setTextInArr(img,s)

encImg =

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
于 2012-04-28T07:13:54.147 に答える
0

実際には2つのアプローチがあります。

1つ目は、データと画像に共通点がなく、通常は「ステガノグラフィ」と呼ばれる場合に、データを画像に隠すことです。

2つ目は、データが画像を説明するときに、注釈データを埋め込むことです。この場合、データと画像は密接な空間的関係を持っています。

あなたが参照しているのは「ビットプレーン修正」と呼ばれています。Webで品質要件を確認できますが、ほとんどの場合、バイトごとに最大4ビットを変更することでほとんど節約できます(品質測定にはhttps://ece.uwaterloo.ca/~z70wang/research/iwssim/を使用しました)。

画像がRGB色空間に保存されることはほとんどないため、色空間変換にも注意してください。

于 2014-09-14T10:28:44.193 に答える