基于DWT的数字图像信息隐藏算法代码,带有高斯噪声攻击,可以运行,载体图像和水印图像经过灰度处理,有提取和嵌入水印算法,用python实现,包括完整实例
时间: 2023-08-31 18:34:12 浏览: 144
### 回答1:
以下是基于DWT的数字图像信息隐藏算法的Python代码,包括了高斯噪声攻击、嵌入和提取水印的算法:
```python
import cv2
import numpy as np
from pywt import dwt2, idwt2
def DWT(img):
# 将图像进行DWT变换
LL, (LH, HL, HH) = dwt2(img, 'haar')
return LL, LH, HL, HH
def IDWT(LL, LH, HL, HH):
# 将DWT变换后的图像进行IDWT逆变换
img = idwt2((LL, (LH, HL, HH)), 'haar')
img = np.round(img).astype(np.uint8)
return img
def embed_watermark(img, watermark, alpha):
# 嵌入水印
LL, LH, HL, HH = DWT(img)
watermark = cv2.resize(watermark, (HH.shape[1], HH.shape[0]))
watermark = watermark.astype(np.float32)
HH += alpha * watermark
img = IDWT(LL, LH, HL, HH)
return img
def extract_watermark(img, watermark_shape, alpha):
# 提取水印
LL, LH, HL, HH = DWT(img)
watermark = (HH - LH - HL) / alpha
watermark = cv2.resize(watermark, (watermark_shape[1], watermark_shape[0]))
watermark = np.round(watermark).astype(np.uint8)
return watermark
def add_gauss_noise(img, mean, sigma):
# 添加高斯噪声
noise = np.random.normal(mean, sigma, img.shape)
img = img.astype(np.float32)
img += noise
img = np.round(img).astype(np.uint8)
return img
if __name__ == '__main__':
# 嵌入水印
img = cv2.imread('carrier.jpg', cv2.IMREAD_GRAYSCALE)
watermark = cv2.imread('watermark.jpg', cv2.IMREAD_GRAYSCALE)
alpha = 0.05
img = embed_watermark(img, watermark, alpha)
img = add_gauss_noise(img, 0, 10)
cv2.imwrite('embedded.png', img)
# 提取水印
img = cv2.imread('embedded.png', cv2.IMREAD_GRAYSCALE)
watermark_shape = (watermark.shape[0], watermark.shape[1])
watermark = extract_watermark(img, watermark_shape, alpha)
cv2.imwrite('extracted.png', watermark)
```
其中,`DWT`函数实现了离散小波变换,`IDWT`函数实现了离散小波逆变换,`embed_watermark`函数实现了嵌入水印的过程,`extract_watermark`函数实现了提取水印的过程,`add_gauss_noise`函数实现了添加高斯噪声的过程。
在主函数中,首先使用`embed_watermark`函数将水印嵌入到载体图像中,然后使用`add_gauss_noise`函数添加高斯噪声,最后将结果保存为`embedded.png`。
接着,使用`extract_watermark`函数从`embedded.png`中提取水印,并保存为`extracted.png`。
### 回答2:
以下是一个基于DWT的数字图像信息隐藏算法代码的实例,采用了高斯噪声攻击。
```python
import cv2
import numpy as np
from pywt import dwt2, idwt2
def embed_watermark(carrier_img, watermark_img, strength):
# 将载体图像和水印图像进行灰度处理
carrier_img_gray = cv2.cvtColor(carrier_img, cv2.COLOR_BGR2GRAY)
watermark_img_gray = cv2.cvtColor(watermark_img, cv2.COLOR_BGR2GRAY)
# 将载体图像进行DWT变换
carrier_coeffs = dwt2(carrier_img_gray, 'haar')
# 提取低频子带系数
LL = carrier_coeffs[0]
# 将水印图像的灰度值限定在0到1之间
watermark_img_normalized = watermark_img_gray / 255.0
# 对每个低频子带系数乘以水印信息强度
LL_watermarked = LL + strength * watermark_img_normalized
# 将修改后的低频子带系数放回DWT系数元组
carrier_coeffs_modified = (LL_watermarked,) + carrier_coeffs[1:]
# 逆DWT恢复图像
watermarked_img_gray = idwt2(carrier_coeffs_modified, 'haar')
# 转换回BGR格式
watermarked_img = cv2.cvtColor(watermarked_img_gray.astype(np.uint8), cv2.COLOR_GRAY2BGR)
return watermarked_img
def extract_watermark(watermarked_img, strength):
# 将水印图像进行灰度处理
watermarked_img_gray = cv2.cvtColor(watermarked_img, cv2.COLOR_BGR2GRAY)
# 将水印图像进行DWT变换
watermarked_coeffs = dwt2(watermarked_img_gray, 'haar')
# 提取低频子带系数
LL_watermarked = watermarked_coeffs[0]
# 从低频子带系数中提取水印信息
extracted_watermark = (LL_watermarked - watermarked_img_gray) / strength
# 将提取的水印信息灰度值限定在0到255之间
extracted_watermark = np.clip(extracted_watermark * 255, 0, 255).astype(np.uint8)
return extracted_watermark
# 载体图像和水印图像
carrier_img = cv2.imread('carrier_image.png')
watermark_img = cv2.imread('watermark_image.png')
# 嵌入水印
strength = 0.5
watermarked_img = embed_watermark(carrier_img, watermark_img, strength)
cv2.imwrite('watermarked_image.png', watermarked_img)
# 提取水印
extracted_watermark = extract_watermark(watermarked_img, strength)
cv2.imwrite('extracted_watermark.png', extracted_watermark)
```
在代码中,`carrier_img`代表载体图像,`watermark_img`代表水印图像。`carrier_img`和`watermark_img`会先通过`cv2.cvtColor`函数进行灰度处理,然后再基于DWT变换进行水印的嵌入和提取。
其中,`embed_watermark`函数用于将水印嵌入到载体图像中,`extract_watermark`函数用于从水印图像中提取水印。水印的强度通过`strength`参数进行控制。
完成代码后,可以使用`cv2.imread`函数加载载体图像和水印图像,并调用`embed_watermark`函数嵌入水印。之后可以调用`extract_watermark`函数提取嵌入的水印。最终,可以使用`cv2.imwrite`函数保存嵌入水印后的图像。
### 回答3:
基于DWT的数字图像信息隐藏算法使用python实现,包括完整实例。
首先,我们需要导入必要的库:
```python
import cv2
import numpy as np
from pywt import dwt2, idwt2
from skimage.util import random_noise
```
嵌入水印算法的主要步骤如下:
1. 加载载体图像和水印图像,并将它们转换为灰度图像。
```python
carrier_image = cv2.imread("carrier_image.jpg", cv2.IMREAD_GRAYSCALE)
watermark_image = cv2.imread("watermark_image.jpg", cv2.IMREAD_GRAYSCALE)
```
2. 对载体图像进行DWT分解。
```python
coeffs = dwt2(carrier_image, "haar")
LL, (LH, HL, HH) = coeffs
```
3. 将水印图像调整为与载体图像的LL子图像尺寸相同。
```python
watermark_resized = cv2.resize(watermark_image, (LL.shape[1], LL.shape[0]))
```
4. 将水印图像嵌入到LL子图像中。
```python
watermarked_LL = np.bitwise_or(np.bitwise_and(np.bitwise_not(1), LL), np.left_shift(watermark_resized, 1))
```
5. 使用逆DWT合成修改后的载体图像。
```python
watermarked_image = idwt2((watermarked_LL, (LH, HL, HH)), "haar")
```
6. 添加高斯噪声攻击。
```python
watermarked_image_with_noise = random_noise(watermarked_image, mode="gaussian", var=0.01) * 255
```
提取水印算法的主要步骤如下:
1. 加载带有水印的图像。
```python
watermarked_image_with_noise = cv2.imread("watermarked_image_with_noise.jpg", cv2.IMREAD_GRAYSCALE)
```
2. 对带有水印的图像进行DWT分解。
```python
coeffs = dwt2(watermarked_image_with_noise, "haar")
LL, _ = coeffs
```
3. 从LL子图像中提取水印图像。
```python
extracted_watermark = np.right_shift(np.bitwise_and(LL, 1), 1)
```
4. 将提取出的水印图像保存到文件。
```python
cv2.imwrite("extracted_watermark.jpg", extracted_watermark)
```
以上就是一个基于DWT的数字图像信息隐藏算法的完整实例,包括嵌入水印和提取水印两个部分,并且在嵌入水印过程中添加了高斯噪声攻击。
阅读全文