import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 设置matplotlib的字体为SimHei,支持中文显示
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 或者其他支持中文的字体
matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
def dct2(a):
return cv2.dct(a.astype(np.float32))
def idct2(a):
return cv2.idct(a.astype(np.float32))
def add_watermark_dct(image_path, watermark_path):
# 读取原始图像和水印图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
watermark = cv2.imread(watermark_path, cv2.IMREAD_GRAYSCALE)
watermark = cv2.resize(watermark, (image.shape[1], image.shape[0]))
# 将原始图像和水印图像转换到频域(DCT)
dct_image = dct2(image)
dct_watermark = dct2(watermark)
# 嵌入水印
alpha = 0.05 # 水印强度因子
dct_image_wm = dct_image + alpha * dct_watermark
# 将嵌入水印后的频域表示转换回空间域
img_back = idct2(dct_image_wm)
# 提取水印
dct_extracted = dct_image_wm - dct_image
watermark_extracted = idct2(dct_extracted / alpha)
# 显示图像
plt.figure(figsize=(10, 8))
plt.subplot(221), plt.imshow(image, cmap='gray'), plt.title('原图')
plt.subplot(222), plt.imshow(watermark, cmap='gray'), plt.title('水印')
plt.subplot(223), plt.imshow(img_back, cmap='gray'), plt.title('嵌入后图像')
plt.subplot(224), plt.imshow(watermark_extracted, cmap='gray'), plt.title('提取出水印')
plt.show()
# 保存嵌入水印后的图片和提取出的水印图片
cv2.imwrite(r'c:\picture\peppers\watermarked_peppers_DCT.png', img_back)
cv2.imwrite(r'c:\picture\peppers\extracted_watermark_peppers_DCT.png', watermark_extracted)
# 使用示例
add_watermark_dct(r'c:\picture\peppers\peppers.bmp', r'c:\picture\Logistic\Logistic.png')
#baboo256.BMP house2 peppers
python实现离散余弦变换(Discrete Cosine Transform, DCT)进行图片水印嵌入和提取水印
于 2024-01-22 09:21:45 首次发布