如何修改有符号数的最后3位

时间:2016-11-14 14:58:00

标签: matlab bit-manipulation steganography dwt

当我在图像上应用函数dwt2()时,我得到了四个子带系数。通过选择四个子带中的任何一个,我使用带符号的二维矩阵。

在该矩阵的每个值中,我想在最后3个最低有效位中嵌入3位信息,即十进制数0到7。但是,当我处理负数时,我不知道如何做到这一点。如何修改系数?

1 个答案:

答案 0 :(得分:0)

首先,您想使用Integer Wavelet Transform,因此您只需要处理整数。这将允许您在两个空格之间进行无损转换,而无需舍入浮点数。

在整数中嵌入位是二进制运算的直接问题。通常,您希望使用模式

(number AND mask) OR bits

bitwise AND操作会清除由number指定的mask的所需位。例如,如果number是一个8位数字,并且我们想要将最后3位清零,我们将使用掩码11111000.在我们的number的所需位被清除后,我们可以使用bitwise OR操作替换我们想要嵌入的bits

接下来,您需要知道签名号码是represented in binary的方式。请务必阅读两个补充部分。我们可以看到,如果我们要清除最后3位,我们想要使用掩码... 11111000,它总是-8。这与我们是否使用8位,16位,32位或64位来表示我们的签名数字无关。通常,如果要清除已签名号码的最后k位,则掩码必须为-2^k

让我们用一个简单的例子把所有东西放在一起。首先,我们为系数子带生成一些数字并嵌入比特流。由于系数值可以取[-510,510]中的任何值,我们将使用'int16'进行操作。比特流是[0,7]范围内的数字数组,因为这是[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