隐写术应用:将水印嵌入图片并解析 - Python 实现
隐写术应用:将水印嵌入图片并解析 - Python 实现
隐写术一般被认为是信息隐藏学的一个重要分支,因为它能将特定信息嵌入信息载体且不易被察觉,因此在著作权保护、数据附加等领域有着广泛应用。
本文将以原图 P.jpg 为例,建立生成嵌入文字 '信息深圳杯数学建模挑战赛'(作为隐藏水印)的图片 SP 的数学模型,使得图片 SP.jpg 在人的视觉上尽可能与原图 P 相近。我们将实现生成图片 SP 的算法,并提供 Python 代码示例。
生成图片 SP 的 Python 程序
以下是一个使用隐写术生成图片 SP 的 Python 程序示例:
from PIL import Image
# 加载原图 P.jpg
original_image = Image.open('P.jpg')
# 获取原图的宽高
width, height = original_image.size
# 创建新的图片 SP,使用原图的模式和尺寸
stego_image = Image.new(original_image.mode, (width, height))
# 嵌入的文字信息
hidden_message = '信息深圳杯数学建模挑战赛'
# 将文字信息转换为二进制形式
binary_message = ''.join(format(ord(char), '08b') for char in hidden_message)
# 遍历原图的每个像素点
for x in range(width):
for y in range(height):
# 获取原图的 RGB 值
r, g, b = original_image.getpixel((x, y))
# 将 RGB 值的最低位替换为文字信息的二进制位
r = (r & 0xFE) | int(binary_message[x * height + y])
# 创建新的像素点,并将修改后的 RGB 值赋值给新像素点
stego_image.putpixel((x, y), (r, g, b))
# 保存生成的图片 SP.jpg
stego_image.save('SP.jpg')
# 解析图片 SP 中的隐藏信息
hidden_message = ''
for x in range(width):
for y in range(height):
# 获取图片 SP 的 RGB 值
r, _, _ = stego_image.getpixel((x, y))
# 提取 RGB 值的最低位作为隐藏信息的二进制位
hidden_message += str(r & 1)
# 将隐藏信息转换为文字形式
hidden_message = ''.join(chr(int(hidden_message[i:i+8], 2)) for i in range(0, len(hidden_message), 8))
# 打印解析出的隐藏信息
print(hidden_message)
请确保已安装 Pillow 库(用于图像处理),并将原图 P.jpg 放在同一目录下。运行上述代码后,将生成图片 SP.jpg,并解析出隐藏的信息。
代码解释
- 加载原图和创建新图片: 使用
Image.open()加载原图 P.jpg,并使用Image.new()创建一个与原图尺寸和模式相同的新图片 SP。 - 将文字信息转换为二进制: 使用
format(ord(char), '08b')将每个字符转换为 8 位二进制表示,并使用''.join(...)将所有二进制字符串拼接成一个完整的二进制字符串。 - 嵌入信息: 遍历原图的每个像素点,获取其 RGB 值。然后,将 RGB 值的最低位(即最后一位)替换为文字信息二进制字符串中的对应位,并将修改后的 RGB 值赋值给新图片 SP 的对应像素点。
- 解析信息: 遍历图片 SP 的每个像素点,提取每个像素点的 RGB 值的最低位作为隐藏信息的二进制位。然后,将所有二进制位拼接成一个完整的二进制字符串,并使用
chr(int(..., 2))将二进制字符串转换为文字信息。
注意
- 这种简单的隐写术容易被识别,可以通过更复杂的算法提高隐写效果。
- 嵌入信息的大小受图片尺寸限制,如果信息量过大,可能会导致图片质量下降。
- 隐写术仅用于信息隐藏,不应用于非法活动。
原文地址: https://www.cveoy.top/t/topic/fS9g 著作权归作者所有。请勿转载和采集!