较少的比特变化但相同的 PSNR 值

Less bits changes but same PSNR value

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

这真的很令人困惑,因为我们提出的方法对 LSB 的更改较少,但 PSNR 值仍然相同。非常感谢任何帮助。

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

我认为您的结果并不意外,您可能高估了效果,因为 PSNR 是对数函数。我将插入一些数字来向您展示这种效果,但我将对您未提及的细节做出一些假设。

我假设您每个像素仅嵌入 1 位,并且是最低有效位,而不是第二位、第三位或任何其他位。

这意味着如果一个位翻转,原始像素和修改后的像素之间的平方误差为 1。如果我们假设一个随机位流,我们期望改变我们嵌入信息的像素的一半.所有这些都可以封装在下面两个函数中。

mse = @(bits, x, y) (0.5 * bits) / (x * y)
psnr = @(signal, noise) = 10 * log10(signal^2 / noise)

其中bits是嵌入的总位数,xy是图像的大小,signal是原始图像中的最大强度值(我用了 255),noise 是 mse。

让我们假设一张 512x512 的图片。为简单起见,我们也只计算一种颜色分量的 PSNR。

5,000 位:68.3368 分贝

4,500 位:68.7944 分贝

PSNR 增加:0.6696%


100,000 位:55.3265 分贝

90,000 位:55.7841 分贝

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)。