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