基于DWT的数字图像信息隐藏算法,带有高斯噪声攻击,可以运行,载体图像和水印图像经过灰度处理,用python实现
时间: 2023-06-18 13:04:28 浏览: 104
基于python的图像信息隐藏算法的实现.zip
数字图像信息隐藏算法是一种将机密信息嵌入载体图像中的技术,使得这些信息不可察觉。其中,DWT(离散小波变换)是一种广泛用于数字信号和图像处理的技术,它可以将信号或图像分解成多个频带,其中低频部分代表图像的主要信息,高频部分则代表细节信息。因此,利用DWT进行信息隐藏可以保证被嵌入的信息不会影响到载体图像的主要信息。
以下是基于DWT的数字图像信息隐藏算法的python代码实现:
```python
import numpy as np
import cv2
def embed(img, watermark, alpha):
# 对载体图像和水印图像进行DWT分解
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
watermark = cv2.cvtColor(watermark, cv2.COLOR_BGR2GRAY)
LL_img, (LH_img, HL_img, HH_img) = cv2.dwt2(img, 'haar')
LL_wm, (LH_wm, HL_wm, HH_wm) = cv2.dwt2(watermark, 'haar')
# 对水印图像进行归一化
LH_wm = np.asarray(LH_wm, dtype=np.float32) / 255
HL_wm = np.asarray(HL_wm, dtype=np.float32) / 255
HH_wm = np.asarray(HH_wm, dtype=np.float32) / 255
# 将水印图像嵌入载体图像的高频分量
LH_img = np.asarray(LH_img, dtype=np.float32)
LH_img = LH_img + alpha * LH_wm
LH_img = np.asarray(np.clip(LH_img, 0, 255), dtype=np.uint8)
HL_img = np.asarray(HL_img, dtype=np.float32)
HL_img = HL_img + alpha * HL_wm
HL_img = np.asarray(np.clip(HL_img, 0, 255), dtype=np.uint8)
HH_img = np.asarray(HH_img, dtype=np.float32)
HH_img = HH_img + alpha * HH_wm
HH_img = np.asarray(np.clip(HH_img, 0, 255), dtype=np.uint8)
# 重构图像
embedded = cv2.idwt2((LL_img, (LH_img, HL_img, HH_img)), 'haar')
return embedded
def extract(img, watermark_shape, alpha):
# 对载体图像进行DWT分解
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
LL_img, (LH_img, HL_img, HH_img) = cv2.dwt2(img, 'haar')
# 从载体图像的高频分量中提取水印图像
LH_wm = (LH_img - LH_img.mean()) / alpha
LH_wm = np.clip(LH_wm, 0, 1)
LH_wm = cv2.resize(LH_wm, watermark_shape[::-1])
HL_wm = (HL_img - HL_img.mean()) / alpha
HL_wm = np.clip(HL_wm, 0, 1)
HL_wm = cv2.resize(HL_wm, watermark_shape[::-1])
HH_wm = (HH_img - HH_img.mean()) / alpha
HH_wm = np.clip(HH_wm, 0, 1)
HH_wm = cv2.resize(HH_wm, watermark_shape[::-1])
# 重构水印图像
watermark = cv2.idwt2((None, (LH_wm, HL_wm, HH_wm)), 'haar')
watermark = np.asarray(np.clip(watermark, 0, 255), dtype=np.uint8)
return watermark
```
在上述代码中,`embed`函数用于将水印图像嵌入载体图像中,`extract`函数用于从载体图像中提取水印图像。其中,`alpha`参数控制水印图像的嵌入强度,`watermark_shape`参数指定水印图像的大小。
为了模拟高斯噪声攻击,可以使用以下代码向载体图像添加高斯噪声:
```python
def add_noise(img, mean, std):
noise = np.random.normal(mean, std, img.shape)
noisy_img = img.astype(np.float32) + noise
noisy_img = np.asarray(np.clip(noisy_img, 0, 255), dtype=np.uint8)
return noisy_img
```
在上述代码中,`mean`和`std`参数分别指定高斯噪声的均值和标准差。
完整的代码如下:
```python
import numpy as np
import cv2
def embed(img, watermark, alpha):
# 对载体图像和水印图像进行DWT分解
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
watermark = cv2.cvtColor(watermark, cv2.COLOR_BGR2GRAY)
LL_img, (LH_img, HL_img, HH_img) = cv2.dwt2(img, 'haar')
LL_wm, (LH_wm, HL_wm, HH_wm) = cv2.dwt2(watermark, 'haar')
# 对水印图像进行归一化
LH_wm = np.asarray(LH_wm, dtype=np.float32) / 255
HL_wm = np.asarray(HL_wm, dtype=np.float32) / 255
HH_wm = np.asarray(HH_wm, dtype=np.float32) / 255
# 将水印图像嵌入载体图像的高频分量
LH_img = np.asarray(LH_img, dtype=np.float32)
LH_img = LH_img + alpha * LH_wm
LH_img = np.asarray(np.clip(LH_img, 0, 255), dtype=np.uint8)
HL_img = np.asarray(HL_img, dtype=np.float32)
HL_img = HL_img + alpha * HL_wm
HL_img = np.asarray(np.clip(HL_img, 0, 255), dtype=np.uint8)
HH_img = np.asarray(HH_img, dtype=np.float32)
HH_img = HH_img + alpha * HH_wm
HH_img = np.asarray(np.clip(HH_img, 0, 255), dtype=np.uint8)
# 重构图像
embedded = cv2.idwt2((LL_img, (LH_img, HL_img, HH_img)), 'haar')
return embedded
def extract(img, watermark_shape, alpha):
# 对载体图像进行DWT分解
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
LL_img, (LH_img, HL_img, HH_img) = cv2.dwt2(img, 'haar')
# 从载体图像的高频分量中提取水印图像
LH_wm = (LH_img - LH_img.mean()) / alpha
LH_wm = np.clip(LH_wm, 0, 1)
LH_wm = cv2.resize(LH_wm, watermark_shape[::-1])
HL_wm = (HL_img - HL_img.mean()) / alpha
HL_wm = np.clip(HL_wm, 0, 1)
HL_wm = cv2.resize(HL_wm, watermark_shape[::-1])
HH_wm = (HH_img - HH_img.mean()) / alpha
HH_wm = np.clip(HH_wm, 0, 1)
HH_wm = cv2.resize(HH_wm, watermark_shape[::-1])
# 重构水印图像
watermark = cv2.idwt2((None, (LH_wm, HL_wm, HH_wm)), 'haar')
watermark = np.asarray(np.clip(watermark, 0, 255), dtype=np.uint8)
return watermark
def add_noise(img, mean, std):
noise = np.random.normal(mean, std, img.shape)
noisy_img = img.astype(np.float32) + noise
noisy_img = np.asarray(np.clip(noisy_img, 0, 255), dtype=np.uint8)
return noisy_img
# 载入图像和水印图像
img = cv2.imread('carrier.png')
watermark = cv2.imread('watermark.png')
# 添加高斯噪声
noisy_img = add_noise(img, 0, 20)
# 嵌入水印
alpha = 0.1
embedded = embed(noisy_img, watermark, alpha)
# 提取水印
extracted = extract(embedded, watermark.shape[:2], alpha)
# 显示图像和水印
cv2.imshow('Original Image', img)
cv2.imshow('Noisy Image', noisy_img)
cv2.imshow('Embedded Image', embedded)
cv2.imshow('Extracted Watermark', extracted)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,载体图像和水印图像分别为`carrier.png`和`watermark.png`,高斯噪声的均值为0,标准差为20。可以调整`alpha`参数来控制水印图像的嵌入强度。运行代码后,可以看到原始图像、添加高斯噪声后的图像、嵌入水印后的图像以及从嵌入后的图像中提取出的水印图像。
阅读全文