我们已经提出并模拟了一种LSB插入方法,它比常规LSB的位数减少了10%。然而令我们惊讶的是,所提方法的PSNR值非常接近常规LSB(约增加约1%)
这实在令人困惑,因为我们提出的方法会减少LSB的变化,但PSNR值仍然相同。非常感谢任何帮助。
我们正在使用Matlab并对RGB图像进行测试(嵌入所有三个RGB通道的LSB上)
答案 0 :(得分:0)
我认为你的结果并不出乎意料,而且你可能高估了效果,因为PSNR是一个对数函数。我会插入一些数字来向你展示这种效果,但我会对你未提及的细节作出一些假设。
我假设您每个像素只嵌入1位,并且位于最低位,而不是第2位,第3位或任何其他位。
这意味着如果有一个位翻转,原始像素和修改像素之间的平方误差为1.如果我们假设一个随机位流,我们希望改变我们嵌入信息的一半像素。所有这些都可以封装在以下两个函数中。
mse = @(bits, x, y) (0.5 * bits) / (x * y)
psnr = @(signal, noise) = 10 * log10(signal^2 / noise)
bits
是嵌入位的总数,x
和y
图像的大小,signal
是原始图像中的最大强度值(I使用255)和noise
是mse。
我们假设一个512x512的图像。为简单起见,我们还只计算一个颜色分量的PSNR。
5,000位:68.3368 db
4,500位:68.7944 db
PSNR增加:0.6696%
100,000位:55.3265 db
90,000位:55.7841 db
PSNR增加:0.8271%
事实上,你可以推导出一般的符号形式。
mse_orig = (bits / 2) / (x * y) = bits / (2 * x * y)
mse_steg = (0.9 * bits / 2) / (x * y) = 0.9 * mse_orig
psnr = 10 * log10(signal^2 / mse)
percent_change = 100 * (psnr_steg - psnr_orig) / psnr_orig
通过使用属性log(a / b) = log(a) - log(b)
,上述内容可以简化为:
percent_change = 100 * (-log10(0.9) / log10(2* x * y * signal^2 / bits))
其中bits
是您使用常规lsb嵌入嵌入的位数(即5,000和非4,500)。