奇异值分解水印嵌入以及水印提取代码
时间: 2023-11-12 08:00:31 浏览: 32
奇异值分解(SVD)是一种广泛用于数字图像水印嵌入和提取的技术。以下是一个简单的SVD水印嵌入和提取代码示例:
```python
# 导入必要的库
import cv2
import numpy as np
# 定义水印嵌入函数
def embed_watermark(img_path, watermark_path, alpha=0.01):
# 读取图像和水印
img = cv2.imread(img_path, 0)
watermark = cv2.imread(watermark_path, 0)
# 对图像进行SVD分解
U, s, V = np.linalg.svd(img)
# 将水印嵌入奇异值矩阵
watermark = cv2.resize(watermark, (int(s.shape[0]), int(s.shape[0])))
s[:watermark.shape[0], :watermark.shape[1]] += alpha * watermark
# 重构图像
watermarked_img = np.dot(U, np.dot(np.diag(s), V))
# 保存图像
cv2.imwrite('watermarked_image.png', watermarked_img)
# 返回重构后的图像
return watermarked_img
# 定义水印提取函数
def extract_watermark(img_path, original_img_path, alpha=0.01):
# 读取图像和原始图像
img = cv2.imread(img_path, 0)
original_img = cv2.imread(original_img_path, 0)
# 对图像进行SVD分解
U, s, V = np.linalg.svd(img)
U_orig, s_orig, V_orig = np.linalg.svd(original_img)
# 提取水印
watermark = (s - s_orig) / alpha
watermark = watermark[:int(s.shape[0] * 0.5), :int(s.shape[1] * 0.5)]
watermark = cv2.resize(watermark, (original_img.shape[1], original_img.shape[0]))
# 保存水印
cv2.imwrite('extracted_watermark.png', watermark)
# 返回水印
return watermark
```
使用这些函数,您可以轻松地嵌入和提取水印。例如,以下是如何使用这些函数嵌入和提取水印的示例代码:
```python
# 嵌入水印
watermarked_img = embed_watermark('original_image.png', 'watermark.png')
# 提取水印
extracted_watermark = extract_watermark('watermarked_image.png', 'original_image.png')
```
请注意,SVD水印嵌入和提取技术并不完美,因为它们容易受到一些攻击,例如旋转、缩放和裁剪。因此,对于实际应用,您可能需要使用其他更加复杂的水印技术。