我一直在做更多的关于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)
将返回一个标量,该标量将是均匀分布(基于 prng)的整数,范围为 1:IMAX。简而言之,它选择1和IMAX之间的随机整数。
numel(matrix)
返回矩阵中元素的总数。
所以,steg_coeffs(randi(numel(steg_coeffs)))
从steg_coeffs
中选择一个随机元素,通过选择一个介于 1 和 5 之间的随机索引。
嵌入算法在以下块中实现。
if charbits(ii) == 1
...
else
...
end
基本上,如果要嵌入 1,则HH
系数必须为正数。如果不是,请用 steg_coeffs
中的一个替换它。同样,如果要嵌入 0,则HH
系数必须为负数。如果不是,请用 steg_coeffs
中的负数替换它。
这个想法是,当你提取秘密时,你所要做的就是检查HH
系数是正数还是负数,知道位必须是 1 还是 0。