0

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

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

4

1 回答 1

0

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

在整数中嵌入位是二进制运算的一个简单问题。通常,您要使用该模式

(number AND mask) OR bits

按位与运算清除 的所需位,number由 指定mask。例如,如果number是一个 8 位数字,并且我们想要将最后 3 位清零,我们将使用掩码 11111000。在我们的所需位number被清除后,我们可以用它们替换bits我们想要嵌入的按位或运算。

接下来,您需要知道带符号的数字在 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
于 2016-11-14T18:45:50.080 回答