python使用最低有效位的方法实现二值化图像信息嵌入与提取,最终要显示提取完成的二值化图像;其中24为图像名为cover.jpg,嵌入的二值化图像为msg_1.png,要显示嵌入后的图像和从嵌入图像完成提取操作后的二值化图像,写出完整代码,不要断断续续的,记得把嵌入和提取写成两个函数的形式
时间: 2024-02-17 20:03:30 浏览: 64
基于频域的数字图像水印算法设计,水印嵌入,数字图像产权保护
好的,下面是完整的代码,将嵌入和提取写成了两个函数的形式:
```python
from PIL import Image
def embed_message(cover_path, msg_path, output_path):
# 打开嵌入图像并转换为RGBA格式
msg_img = Image.open(msg_path).convert('RGBA')
# 从RGBA格式中提取只有最低有效位的二进制格式
msg_bin = ''
for pixel in msg_img.getdata():
bin_str = ''.join(format(val & 0b00000001, 'b') for val in pixel[:3])
msg_bin += bin_str
# 将二进制字符串转换为bytes类型
msg_bytes = int(msg_bin, 2).to_bytes((len(msg_bin) + 7) // 8, 'big')
# 打开原始图像并转换为RGBA格式
cover_img = Image.open(cover_path).convert('RGBA')
# 将msg_bytes中的信息嵌入到原始图像的最低有效位
msg_idx = 0
for x in range(cover_img.width):
for y in range(cover_img.height):
if msg_idx >= len(msg_bytes):
break
r, g, b, a = cover_img.getpixel((x, y))
r = (r & 0b11111110) | (msg_bytes[msg_idx] >> 7)
g = (g & 0b11111110) | ((msg_bytes[msg_idx] >> 6) & 0b00000001)
b = (b & 0b11111110) | ((msg_bytes[msg_idx] >> 5) & 0b00000001)
cover_img.putpixel((x, y), (r, g, b, a))
msg_idx += 1
# 保存嵌入信息后的图像
cover_img.save(output_path)
def extract_message(embedded_path, output_path):
# 打开嵌入信息后的图像
embedded_img = Image.open(embedded_path).convert('RGBA')
# 从嵌入信息后的图像中提取信息
msg_bin = ''
for pixel in embedded_img.getdata():
bin_str = ''.join(format(val & 0b00000001, 'b') for val in pixel[:3])
msg_bin += bin_str
msg_bytes = int(msg_bin, 2).to_bytes((len(msg_bin) + 7) // 8, 'big')
# 将提取出的信息保存为文件
with open(output_path, 'wb') as f:
f.write(msg_bytes)
# 将提取出的信息转换为二值化图像并显示
msg_img = Image.frombytes('1', (embedded_img.width, embedded_img.height), msg_bytes)
msg_img.show()
# 嵌入信息
embed_message('cover.jpg', 'msg_1.png', 'embedded.png')
# 提取信息
extract_message('embedded.png', 'extracted.bin')
```
注意,在这个代码中,我们将提取出的信息保存为二进制文件(extracted.bin),而不是直接显示。如果你想直接显示提取出的信息,可以将提取函数中的最后两行代码替换为:
```python
# 将提取出的信息转换为二值化图像并显示
msg_img = Image.frombytes('1', (embedded_img.width, embedded_img.height), msg_bytes)
msg_img.show()
```
阅读全文