当我在图像上应用该函数dwt2()
时,我得到了四个子带系数。通过选择四个子带中的任何一个,我使用有符号数的二维矩阵。
在这个矩阵的每个值中,我想在最后 3 个最低有效位中嵌入 3 位信息,即十进制数字 0 到 7。但是,当我处理负数时,我不知道该怎么做。如何修改系数?
当我在图像上应用该函数dwt2()
时,我得到了四个子带系数。通过选择四个子带中的任何一个,我使用有符号数的二维矩阵。
在这个矩阵的每个值中,我想在最后 3 个最低有效位中嵌入 3 位信息,即十进制数字 0 到 7。但是,当我处理负数时,我不知道该怎么做。如何修改系数?
首先,您想使用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