2016-11-14 7 views
0

画像にdwt2()関数を適用すると、4つのサブバンド係数が得られます。 4つのサブバンドのいずれかを選択することにより、符号付き数の2次元行列を扱う。符号付き数値の最後の3ビットを変更する方法

この行列の各値では、最後の3つの最下位ビットに3ビットの情報、つまり10進数の0から7を埋め込みたいと考えています。しかし、私は負の数を扱うときにそれをする方法を知らない。どのように係数を修正できますか?

+0

ようこそ。英語はあなたの母国語ではないかもしれませんが、あなたの質問は現時点では不明です。この問題に対処するために言い換えてください。あなたは文章を終わらせるために多くの疑問符を使用していますが、それは非常に混乱しますが、あなたの質問に対する私の理解はこれです: "私は係数値37を持っています。どうすればいい? "これがあなたが本当に求めていると仮定するのは正しいですか? – Reti43

+0

申し訳ありませんが私は正しく書いていない場合は、それはほぼ正しいです。私はサブバンド係数の1つのLSBにビット値を埋め込みたい。それらは負または小数です。どうやったらよいかわかりません。私はこれをexatlyしたい:秘密のメッセージを埋め込むために1つのサブバンドを選択してください。選択されたサブバンドの係数行列として 'f'を寄与すると、以下の式を使用して、ウェーブレット係数の3つの最下位ビットがビットストリームの3ビットに置き換えられる。 – mersana

+0

あなたの最後のセンテンスは、「私たちが「f '...」を寄付した場合、不明です。この命令を別の場所からコピーした場合は、ソースを共有してコンテキストを理解するのに役立ちます。しかし、仮説的な質問からの正の整数と比較して、ビットを負または小数の値で埋めたいという質問があれば、それは簡単に答えることができます。それはあなたが欲しいものですか? – Reti43

答えて

0

まず、Integer Wavelet Transformを使用したいので、整数を扱うだけです。これにより、浮動小数点数を丸めることなく、2つのスペースの間のロスレスな変換が可能になります。

ビットを整数に埋め込むことは、バイナリ操作の簡単な問題です。一般的に、あなたはbitwise AND操作がmaskによって指定されているnumberの所望のビットを、クリアするパターン

(number AND mask) OR bits 

を使用します。たとえば、numberが8ビットの数値で、最後の3ビットをゼロにしたい場合は、マスク11111000を使用します。numberの希望ビットがクリアされたら、我々はそれらをbitsに置き換えることができますbitwise OR操作を使用して埋め込みます。

次に、符号付きの数字がrepresented in binaryであることを知る必要があります。 2の補数節を必ず読んでください。最後の3ビットをクリアしたい場合は、... 11111000というマスクを使用したいと思います。これは常に-8です。これは、8,16,32、または64ビットを使用して符号付き数値を表すかどうかにかかわらずです。通常、符号付き数値の最後のkビットをクリアする場合、マスクは-2^kでなければなりません。

単純な例ですべてをまとめましょう。まず、係数サブバンドと埋め込みビットストリームにいくつかの数を生成します。係数値は[-510,510]に任意の値を取ることができるので、操作には'int16'を使用します。ビットストリームは[0、7]の範囲の数値の配列です。これは10進数の[000、111]の範囲です。

>> rng(4) 
>> coeffs = randi(1021, [4 4]) - 511 

coeffs = 

    477 202 -252 371 
    48 -290 -67 494 
    483 486 285 -343 
    219 -504 -309 99 

>> bitstream = randi(8, [1 10]) - 1 

bitstream = 

    0  3  0  7  3  7  6  6  1  0 

私たちは必要な係数を上書きしてビットストリームを埋め込みます。スタックオーバーフローの私たちは、単純なマスクを使用することにより、当社のビットストリームを抽出することができます

>> coeffs(1:numel(bitstream)) = bitor(bitand(coeffs(1:numel(bitstream)), -8, 'int16'), bitstream, 'int16') 

coeffs = 

    472 203 -255 371 
    51 -289 -72 494 
    480 486 285 -343 
    223 -498 -309 99 

... 00000111は= 7

>> bitand(coeffs(1:numel(bitstream)), 7, 'int16') 

ans = 

    0  3  0  7  3  7  6  6  1  0 
関連する問題