较少的位更改但相同的PSNR值

时间:2015-02-15 15:21:24

标签: image-processing rgb steganography

我们已经提出并模拟了一种LSB插入方法,它比常规LSB的位数减少了10%。然而令我们惊讶的是,所提方法的PSNR值非常接近常规LSB(约增加约1%)

这实在令人困惑,因为我们提出的方法会减少LSB的变化,但PSNR值仍然相同。非常感谢任何帮助。

我们正在使用Matlab并对RGB图像进行测试(嵌入所有三个RGB通道的LSB上)

1 个答案:

答案 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是嵌入位的总数,xy图像的大小,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)。