用python写一个DCT图像隐写实验。 1)提前准备载体图像(如lena600.bmp或其它灰度图)和待隐藏信息(以文本文件的形式准备好,内容不得重复,文件小一点,最好不要超过0.3KB); 2)编写DCT图像隐写算法,将待隐藏的信息隐写至载体图像,得到伪装图像; 3)在视觉上对载体图像和伪装图像进行比较,进一步用差异图、直方图等方式对二者进行更详细的比较和分析。写得符合最低要求,不要过于复杂
时间: 2024-03-20 15:39:05 浏览: 26
好的,以下是基于Python的DCT图像隐写实验代码:
```python
from PIL import Image
import numpy as np
# 载入图像
img_path = 'lena600.bmp'
img = Image.open(img_path).convert('L') # 转为灰度图像
pixel = np.array(img)
# 载入待隐藏信息
with open('hidden.txt', 'r') as f:
info = f.read()
# DCT变换
dct_pixel = np.zeros_like(pixel, dtype=np.float32)
for i in range(0, pixel.shape[0], 8):
for j in range(0, pixel.shape[1], 8):
dct_pixel[i:i+8, j:j+8] = np.fft.fft2(pixel[i:i+8, j:j+8])
# 隐藏信息
info_idx = 0
for i in range(0, pixel.shape[0], 8):
for j in range(0, pixel.shape[1], 8):
if info_idx >= len(info):
break
dct_pixel[i+5, j+5] += (ord(info[info_idx]) - 128) * 0.1 # 修改DCT系数
info_idx += 1
# IDCT变换
stego_pixel = np.zeros_like(pixel, dtype=np.uint8)
for i in range(0, pixel.shape[0], 8):
for j in range(0, pixel.shape[1], 8):
stego_pixel[i:i+8, j:j+8] = np.fft.ifft2(dct_pixel[i:i+8, j:j+8]).real.round()
# 显示图像
img.show()
Image.fromarray(stego_pixel).show()
# 计算差异图
diff_pixel = np.abs(stego_pixel - pixel)
Image.fromarray(diff_pixel).show()
# 绘制直方图
import matplotlib.pyplot as plt
plt.hist(pixel.ravel(), bins=256, color='blue', alpha=0.5)
plt.hist(stego_pixel.ravel(), bins=256, color='red', alpha=0.5)
plt.show()
```
代码说明:
1. 读取载体图像和待隐藏信息;
2. 对载体图像进行DCT变换;
3. 将待隐藏信息嵌入DCT系数中;
4. 对修改后的DCT系数进行IDCT变换,得到伪装图像;
5. 计算载体图像与伪装图像的差异图;
6. 绘制载体图像和伪装图像的直方图,以便比较。
注意事项:
1. 在嵌入信息时,我们只修改了一个DCT系数(即中心系数),这样可以尽可能地保证图像质量不会受到太大影响;
2. 在嵌入信息时,我们将每个字符对应的ASCII码减去128后乘以0.1,这样可以将其嵌入到[-12.8, 12.8]的DCT系数中;
3. 在IDCT变换后,得到的是浮点数,需要进行四舍五入并转为整型才能得到最终的伪装图像;
4. 在比较载体图像和伪装图像时,可以通过计算差异图和绘制直方图等方式进行分析。