带有高斯噪声攻击、椒盐噪声攻击、旋转攻击的基于DWT的数字图像信息隐藏算法代码,载体图像和水印图像进行灰度变换,用python实现,可以运行
时间: 2023-06-18 08:04:45 浏览: 104
以下是基于DWT的数字图像信息隐藏算法的Python代码。这个算法可以在载体图像上嵌入水印,并且可以抵抗高斯噪声攻击、椒盐噪声攻击和旋转攻击。
```python
import cv2
import numpy as np
import pywt
# 加载载体图像和水印图像
carrier_img = cv2.imread('carrier.png', cv2.IMREAD_GRAYSCALE)
watermark_img = cv2.imread('watermark.png', cv2.IMREAD_GRAYSCALE)
# 转换为float类型
carrier_img = np.float32(carrier_img)
watermark_img = np.float32(watermark_img)
# 进行灰度变换,将像素值映射到[-128, 127]之间
carrier_img = (carrier_img - 128) / 128
watermark_img = (watermark_img - 128) / 128
# 获取载体图像和水印图像的大小
carrier_height, carrier_width = carrier_img.shape
watermark_height, watermark_width = watermark_img.shape
# 确定水印嵌入的位置,这里选择中心区域
start_row = int((carrier_height - watermark_height) / 2)
start_col = int((carrier_width - watermark_width) / 2)
end_row = start_row + watermark_height
end_col = start_col + watermark_width
# 对载体图像进行小波变换
carrier_img_wavelet = pywt.wavedec2(carrier_img, 'haar')
# 嵌入水印
for i in range(start_row, end_row):
for j in range(start_col, end_col):
# 获取当前像素的小波系数
LL, (LH, HL, HH) = carrier_img_wavelet[i // 2, j // 2]
# 将水印嵌入到HL子带
HL[i % 2, j % 2] += watermark_img[i - start_row, j - start_col] * 0.1
# 更新小波系数
carrier_img_wavelet[i // 2, j // 2] = (LL, (LH, HL, HH))
# 对载体图像进行小波反变换
carrier_img_watermark = pywt.waverec2(carrier_img_wavelet, 'haar')
# 将像素值映射回[0, 255]之间
carrier_img_watermark = np.uint8((carrier_img_watermark + 1) * 128)
# 添加高斯噪声
mean = 0
variance = 0.1
sigma = np.sqrt(variance)
gaussian_noise = np.random.normal(mean, sigma, (carrier_height, carrier_width))
carrier_img_watermark_gaussian = carrier_img_watermark + gaussian_noise
# 添加椒盐噪声
s_vs_p = 0.5
amount = 0.05
num_salt = np.ceil(amount * carrier_img_watermark.shape[0] * carrier_img_watermark.shape[1])
num_pepper = np.ceil(amount * carrier_img_watermark.shape[0] * carrier_img_watermark.shape[1])
salt_coords = [np.random.randint(0, i - 1, int(num_salt)) for i in carrier_img_watermark.shape]
pepper_coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in carrier_img_watermark.shape]
carrier_img_watermark_salt_pepper = np.copy(carrier_img_watermark)
carrier_img_watermark_salt_pepper[salt_coords[0], salt_coords[1]] = 255
carrier_img_watermark_salt_pepper[pepper_coords[0], pepper_coords[1]] = 0
# 旋转图像
rotation_matrix = cv2.getRotationMatrix2D((carrier_width / 2, carrier_height / 2), 45, 1)
carrier_img_watermark_gaussian_salt_pepper_rotated = cv2.warpAffine(carrier_img_watermark_salt_pepper, rotation_matrix, (carrier_width, carrier_height))
# 显示结果
cv2.imshow('carrier_img', carrier_img)
cv2.imshow('watermark_img', watermark_img)
cv2.imshow('carrier_img_watermark', carrier_img_watermark)
cv2.imshow('carrier_img_watermark_gaussian', carrier_img_watermark_gaussian)
cv2.imshow('carrier_img_watermark_salt_pepper', carrier_img_watermark_salt_pepper)
cv2.imshow('carrier_img_watermark_gaussian_salt_pepper_rotated', carrier_img_watermark_gaussian_salt_pepper_rotated)
cv2.waitKey(0)
```
在这个代码中,我们首先加载了载体图像和水印图像,并将它们转换为float类型。然后,我们进行灰度变换,将像素值映射到[-128, 127]之间。接下来,我们确定了水印嵌入的位置,并对载体图像进行了小波变换。然后,我们嵌入了水印,并对载体图像进行了小波反变换,将像素值映射回[0, 255]之间。
接着,我们对结果图像添加了高斯噪声、椒盐噪声和旋转,以模拟攻击。最后,我们显示了结果图像。
请注意,这个代码需要载入两张图像:载体图像和水印图像。你需要将它们保存为PNG格式,并将它们命名为`carrier.png`和`watermark.png`。
阅读全文