import cv2
import numpy as np
import matplotlib.pyplot as plt
def add_watermark(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]))
# 将原始图像和水印图像转换到频域
f_image = np.fft.fft2(image)
f_image_shifted = np.fft.fftshift(f_image)
f_watermark = np.fft.fft2(watermark)
# 嵌入水印
alpha = 0.1 # 水印强度因子
f_image_shifted += alpha * f_watermark
# 将嵌入水印后的频域表示转换回空间域
f_ishift = np.fft.ifftshift(f_image_shifted)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
# 提取水印
f_extracted = f_image_shifted - np.fft.fftshift(f_image)
f_extracted_shifted = np.fft.ifftshift(f_extracted / alpha)
watermark_extracted = np.fft.ifft2(f_extracted_shifted)
watermark_extracted = np.abs(watermark_extracted)
# 显示图像
plt.figure(figsize=(10, 8))
plt.subplot(221), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.subplot(222), plt.imshow(watermark, cmap='gray'), plt.title('Watermark')
plt.subplot(223), plt.imshow(img_back, cmap='gray'), plt.title('Image with Watermark')
plt.subplot(224), plt.imshow(watermark_extracted, cmap='gray'), plt.title('Extracted Watermark')
plt.show()
# 使用示例
add_watermark(r'c:lena.BMP', r'c:encrypted_image1.png')
实验结果