使用隐写术将数据嵌入 DWT 子带系数

Using steganography to embed data in DWT subband coefficients

我一直在做更多关于 DWT 隐写术的研究。我在网上看到了下面的代码。这是我第一次遇到指定的子带系数。我知道代码的作用,但我希望有人验证它!

steg_coeffs = [4, 4.75, 5.5, 6.25, 7];

for jj=1:size(message,2)+1
    if jj > size(message,2)
        charbits = [0,0,0,0,0,0,0,0];
    else
        charbits = dec2bin(message(jj),8)';
        charbits = charbits(:)'-'0';
    end

    for ii=1:8
        bit_count = bit_count + 1;

        if charbits(ii) == 1
            if HH(bit_count) <= 0
                HH(bit_count) = steg_coeffs(randi(numel(steg_coeffs)));
            end
        else
            if HH(bit_count) >= 0
                HH(bit_count) = -1 * steg_coeffs(randi(numel(steg_coeffs)));
            end
        end
    end

我认为 steg_coeffs 是 HH 子带的选定系数,其中位将嵌入这些选定的系数中。我用谷歌搜索了 randi 并相信它会在循环的每次迭代中随机化这些指定的系数并嵌入随机选择系数中。我是对的??谢谢

键入 help randi,您会发现 randi(IMAX) 将 return 一个标量,它将是一个在 [=33= 范围内均匀分布(基于 prng)的整数].简单来说,就是在1到IMAX之间随机选择一个整数。

numel(matrix) returns矩阵中的元素总数。

因此,steg_coeffs(randi(numel(steg_coeffs))) 通过在 1 和 5 之间选择一个随机索引,从 steg_coeffs 中选择一个随机元素。

嵌入算法在以下块中实现。

if charbits(ii) == 1
    ...
else
    ...
end

基本上,如果要嵌入 1,则 HH 系数必须为正。如果不是,请将其替换为 steg_coeffs 中的一个。同样,如果要嵌入 0,则 HH 系数必须为负。如果不是,请将其替换为 steg_coeffs.

中的负数

这个想法是,当你提取秘密时,你只需要检查HH系数是正还是负,就可以知道该位必须是1还是0。