python实现EMD隐写的具体算法
时间: 2023-07-26 07:15:30 浏览: 241
eemd_EEMD_源码.zip
EMD隐写是一种基于图像的隐写方法,它使用了离散小波变换和图像融合技术。下面是Python实现EMD隐写的具体算法:
1. 将待隐藏的信息转换为二进制序列。
2. 加载并读取图像,将其转换为灰度图像。
3. 对灰度图像进行离散小波变换,得到各个分解系数。
4. 将二进制序列嵌入到各个分解系数的高频子带中。
5. 对嵌入后的分解系数进行图像重构,得到隐藏了信息的图像。
6. 对重构后的图像和原图像进行融合,得到最终的EMD隐写图像。
下面是Python代码实现:
```python
import cv2
import numpy as np
import pywt
# 将信息转换为二进制序列
def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]
return bits.zfill(8 * ((len(bits) + 7) // 8))
# 将二进制序列转换为信息
def bits_to_text(bits, encoding='utf-8', errors='surrogatepass'):
n = int(bits, 2)
return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0'
# 加载图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 进行离散小波变换
coeffs = pywt.dwt2(img, 'haar')
# 分解系数的高频子带
H, V, D = coeffs[1]
# 将信息转换为二进制序列
bits = text_to_bits('Hello, world!')
# 嵌入信息
for i in range(H.shape[0]):
for j in range(H.shape[1]):
if len(bits) == 0:
break
H[i, j] = ((int(bits[0]) << 1) + H[i, j] % 2) << 1 | (H[i, j] // 2)
bits = bits[1:]
# 重构图像
img_reconstructed = pywt.idwt2((coeffs[0], (H, V, D)), 'haar')
# 融合图像
img_blend = cv2.addWeighted(img, 0.5, img_reconstructed.astype(np.uint8), 0.5, 0)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('EMD Steganography Image', img_blend)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,'image.jpg'是待隐藏信息的图像文件名,'Hello, world!'是待隐藏的信息。运行代码后,将显示原始图像和EMD隐写图像。注意,嵌入的信息越多,EMD隐写图像的质量就会越低。
阅读全文