用python写一个DCT图像隐写实验。 1)提前准备载体图像(如lena600.bmp或其它灰度图)和待隐藏信息(以文本文件的形式准备好,内容不得重复,文件小一点,最好不要超过0.3KB); 2)编写DCT图像隐写算法,将待隐藏的信息隐写至载体图像,得到伪装图像; 3)在视觉上对载体图像和伪装图像进行比较,进一步用差异图、直方图等方式对二者进行更详细的比较和分析。写得不要过于复杂
时间: 2024-03-20 16:39:08 浏览: 123
好的,以下是基于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()
# 将信息转换为二进制串
binary_info = ''.join(format(ord(c), '08b') for c in info)
# 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(binary_info):
break
bit = int(binary_info[info_idx])
if bit == 1:
dct_pixel[i+1, j+1] += 10 # 修改DCT系数
else:
dct_pixel[i+1, j+1] -= 10 # 修改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. 将待隐藏信息转换为二进制串;
3. 对载体图像进行DCT变换;
4. 将二进制串中的每个比特位嵌入到DCT系数中;
5. 对修改后的DCT系数进行IDCT变换,得到伪装图像;
6. 计算载体图像与伪装图像的差异图;
7. 绘制载体图像和伪装图像的直方图,以便比较。
注意事项:
1. 在嵌入信息时,我们只修改了一个DCT系数(即第二个系数),这样可以尽可能地保证图像质量不会受到太大影响;
2. 在嵌入信息时,我们将比特位为1时,将DCT系数加上10,比特位为0时,将DCT系数减去10,这样可以将信息嵌入到更高的频率分量中;
3. 在IDCT变换后,得到的是浮点数,需要进行四舍五入并转为整型才能得到最终的伪装图像;
4. 在比较载体图像和伪装图像时,可以通过计算差异图和绘制直方图等方式进行分析。
阅读全文