wow算法图像隐写pytorth
时间: 2024-01-27 11:04:43 浏览: 135
图像隐写是一种将秘密信息隐藏在图像中的技术,可以通过一些算法来实现。其中比较常用的算法有LSB(最低有效位)算法和DCT(离散余弦变换)算法。以下是一个基于LSB算法的Python实现示例:
```python
import numpy as np
from PIL import Image
def encode_image(image_path, message):
# 打开图像并将其转换为Numpy数组
img = Image.open(image_path)
img_arr = np.asarray(img)
# 获取图像的形状和像素数量
shape = img_arr.shape
num_pixels = img_arr.size // 3
# 将消息转换为二进制格式
bin_msg = ''.join(format(ord(i), '08b') for i in message)
# 检查图像是否足够大以隐藏消息
if len(bin_msg) > num_pixels:
raise ValueError("消息太长,无法隐藏在图像中!")
# 将消息的长度编码为8位二进制格式并添加到消息的开头
bin_msg_len = format(len(bin_msg), '08b')
bin_msg = bin_msg_len + bin_msg
# 将二进制消息嵌入图像中的每个像素的最低有效位中
idx = 0
for i in range(shape[0]):
for j in range(shape[1]):
for k in range(shape[2]):
if idx < len(bin_msg):
img_arr[i][j][k] = int(bin(img_arr[i][j][k])[2:9] + bin_msg[idx], 2)
idx += 1
else:
break
# 将Numpy数组转换回图像并保存
encoded_img = Image.fromarray(np.uint8(img_arr))
encoded_img.save('encoded_image.png')
def decode_image(image_path):
# 打开图像并将其转换为Numpy数组
img = Image.open(image_path)
img_arr = np.asarray(img)
# 获取图像的形状和像素数量
shape = img_arr.shape
num_pixels = img_arr.size // 3
# 从图像中提取隐藏的二进制消息
bin_msg_len = ''
bin_msg = ''
idx = 0
for i in range(shape[0]):
for j in range(shape[1]):
for k in range(shape[2]):
if idx < 8:
bin_msg_len += bin(img_arr[i][j][k])[-1]
elif idx < (int(bin_msg_len, 2) + 8):
bin_msg += bin(img_arr[i][j][k])[-1]
else:
break
idx += 1
# 将二进制消息转换回文本并返回
return ''.join(chr(int(bin_msg[i:i+8], 2)) for i in range(0, len(bin_msg), 8))
```
该代码实现了将消息嵌入图像中和从图像中提取隐藏消息的功能。可以通过调用`encode_image()`函数来将消息编码到图像中,如下所示:
```python
encode_image('original_image.png', '这是一个秘密消息!')
```
该函数将原始图像`original_image.png`中隐藏了一条消息,然后将编码后的图像保存为`encoded_image.png`。
要从编码后的图像中提取隐藏的消息,可以调用`decode_image()`函数,如下所示:
```python
message = decode_image('encoded_image.png')
print(message)
```
该函数将从`encoded_image.png`中提取隐藏的消息并将其打印到控制台上。
阅读全文