python使用最低有效位的方法实现二值化图像信息嵌入与提取,最终要显示提取完成的二值化图像;其中24为图像名为cover.jpg,嵌入的二值化图像为msg_1.png,要显示嵌入后的图像和从嵌入图像完成提取操作后的二值化图像
时间: 2024-02-17 20:03:24 浏览: 111
图像二值化实现
首先,我们需要将嵌入的二值化图像转换为只有最低有效位的二进制格式。可以使用Pillow库中的Image模块来实现:
```python
from PIL import Image
# 打开嵌入图像并转换为RGBA格式
msg_img = Image.open('msg_1.png').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')
```
接下来,我们可以使用Pillow库中的Image模块打开原始图像,并将msg_bytes中的信息嵌入到原始图像的最低有效位。
```python
# 打开原始图像并转换为RGBA格式
cover_img = Image.open('cover.jpg').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
```
最后,我们可以将嵌入信息后的图像保存,并从中提取出嵌入的信息。
```python
# 保存嵌入信息后的图像
cover_img.save('embedded.png')
# 从嵌入信息后的图像中提取信息
msg_bin = ''
for pixel in cover_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('extracted.bin', 'wb') as f:
f.write(msg_bytes)
```
最后,我们可以使用Pillow库中的Image模块将提取出的信息转换为二值化图像并显示。
```python
# 将提取出的信息转换为二值化图像并显示
msg_img = Image.frombytes('1', (msg_img.width, msg_img.height), msg_bytes)
msg_img.show()
```
阅读全文