DCT数字水印的代码
时间: 2023-07-09 12:03:48 浏览: 94
基于DCT的数字水印
数字水印是一种在数字媒体中嵌入隐藏信息的技术,DCT(离散余弦变换)数字水印是其中一种常用的算法。下面是一个Python实现的DCT数字水印的代码示例:
```python
import cv2
import numpy as np
# 定义水印函数
def embed(message, cover_image, alpha):
# 读入图像并转换为灰度图
img = cv2.imread(cover_image)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将水印信息转换为二进制
message_bin = ''.join(format(ord(i), '08b') for i in message)
# 将二进制信息填充到矩阵中
message_len = len(message_bin)
message_matrix = np.zeros((message_len, message_len))
for i in range(message_len):
for j in range(message_len):
message_matrix[i][j] = int(message_bin[i * message_len + j])
# 进行离散余弦变换
dct_matrix = cv2.dct(np.float32(gray))
# 将水印信息嵌入到DCT系数中
dct_matrix[0:message_len, 0:message_len] += alpha * message_matrix
# 进行离散余弦逆变换
idct_matrix = cv2.idct(dct_matrix)
# 将图像转换为uint8类型
watermarked_image = np.uint8(idct_matrix)
# 保存带水印的图像
cv2.imwrite('watermarked_image.png', watermarked_image)
return watermarked_image
# 定义提取函数
def extract(watermarked_image, message_len, alpha):
# 读入图像并转换为灰度图
img = cv2.imread(watermarked_image)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行离散余弦变换
dct_matrix = cv2.dct(np.float32(gray))
# 从DCT系数中提取水印信息
message_matrix = np.zeros((message_len, message_len))
for i in range(message_len):
for j in range(message_len):
message_matrix[i][j] = (dct_matrix[i][j] - cv2.dct(np.float32(np.zeros((message_len, message_len))))[0][0]) / alpha
# 将水印信息转换为二进制
message_bin = ''
for i in range(message_len):
for j in range(message_len):
message_bin += str(int(message_matrix[i][j]))
# 将二进制信息转换为字符串
message = ''
for i in range(0, len(message_bin), 8):
message += chr(int(message_bin[i:i+8], 2))
return message
# 测试
message = 'Hello, world!'
cover_image = 'lena.png'
alpha = 0.1
message_len = int(np.ceil(np.sqrt(len(message) * 8)))
watermarked_image = embed(message, cover_image, alpha)
extracted_message = extract('watermarked_image.png', message_len, alpha)
print('原始信息:', message)
print('提取信息:', extracted_message)
```
以上代码中,`embed`函数用于将水印信息嵌入到图像中,`extract`函数用于从带水印的图像中提取水印信息。其中,`alpha`是一个参数,用于控制水印强度。在实际应用中,需要根据具体情况设置合适的值。
阅读全文