我有一张六色 512x512 的灰度图像。因此,每个像素包含 8 位。我可以在我希望嵌入数据的像素中嵌入总共 8 位吗?这可能吗?(我只需要图像来嵌入数据)。如果我想在总共 512*512 像素中的 10,000 像素中嵌入数据,那么我可以总共嵌入 80,000 位数据或 10kB 数据吗?
2 回答
每个像素有 256 级的标准灰度图像需要每个像素 8 位。这是因为需要 8 位来编码 256 个不同的级别。如果您的图像尺寸为 512 x 512,则整个图像中的像素总数为 262,144 像素。因此,整个图像包含 8 位 * 262,144 = 2,097,152 位的信息。
如果您要获取这些像素的子集并编码 8 位“不同”信息,请注意生成的图像可能会在外观上发生变化。每个像素坐标的 8 位信息先前编码了像素强度(从 0 到 255)。如果您将此值替换为其他值,则强度会有所不同,整体图像也会有所不同。
如果您想在 512x512 图像中嵌入 10KiB 的数据,其中位深为 8 位,我建议通过更改每个像素的 LSB 仅在每秒像素中存储 1 位数据。
仅从其他每个像素更改 1 位数据即可存储 (512*512*1)/2 位数据,或 16KiB 数据。通过这种方式,您可以存储您需要的所有数据,同时仅以非常有限的方式更改图像。
例如,这是一张嵌入了不同数量的白噪声的图像(通过每个像素嵌入n
字节数),您可以在下表中看到嵌入了多少噪声(数据):
X | Y | bits used | data(KiB)
0 | 0 | 0 | 0
1 | 0 | 1 | 32
0 | 1 | 2 | 64
1 | 1 | 3 | 96
0 | 2 | 4 | 128
1 | 2 | 5 | 160
0 | 3 | 6 | 192
1 | 3 | 7 | 224
_ | _ | 8 | 256 (image omitted as just white noise)
可以看出,将高达 64KiB 的数据嵌入到 512x512x8 图像中是完全合理的,通过编辑每个像素的 2 LSB,图像中几乎没有明显变化,因此像素被编码为:
XXXX XXYY
来自X
原始图像的位置,Y
是存储数据的 2 位。