Python实现基于傅里叶变换的盲水印嵌入与提取

本文介绍如何使用Python和OpenCV库,实现基于傅里叶变换的盲水印技术。该技术能够将水印图像嵌入到原图中,生成与原图基本一致的含水印图像,并能够从含水印图像中提取出水印信息。

生成含水印图像

算法步骤:

  1. 加载原图P.jpg和盲水印wm.jpg。2. 将原图P.jpg和盲水印wm.jpg转换为灰度图像。3. 调整盲水印wm.jpg的尺寸,使其与原图P.jpg尺寸一致。4. 对原图P.jpg和调整尺寸后的盲水印wm.jpg进行傅里叶变换,得到它们的频谱表示。5. 将盲水印的频谱表示与原图的频谱表示进行加权叠加,得到生成图像的频谱表示。6. 对生成图像的频谱表示进行傅里叶反变换,得到生成图像的空域表示。7. 将生成图像的空域表示进行灰度处理,得到最终的生成图像SP.jpg。

**Python代码示例:**pythonimport cv2import numpy as np

def generate_watermarked_image(original_image_path, watermark_image_path, output_image_path, alpha=0.5): # 加载原图和盲水印 original_image = cv2.imread(original_image_path, cv2.IMREAD_GRAYSCALE) watermark_image = cv2.imread(watermark_image_path, cv2.IMREAD_GRAYSCALE)

# 调整盲水印尺寸    watermark_image = cv2.resize(watermark_image, (original_image.shape[1], original_image.shape[0]))

# 傅里叶变换    original_fft = np.fft.fft2(original_image)    watermark_fft = np.fft.fft2(watermark_image)

# 加权叠加    combined_fft = alpha * original_fft + (1 - alpha) * watermark_fft

# 傅里叶反变换    combined_image = np.fft.ifft2(combined_fft)    combined_image = np.abs(combined_image)

# 灰度处理    combined_image = combined_image.astype(np.uint8)

# 保存生成图像    cv2.imwrite(output_image_path, combined_image)

示例用法generate_watermarked_image('P.jpg', 'wm.jpg', 'SP.jpg')

从含水印图像中提取信息

算法步骤:

  1. 加载原图P.jpg和含水印图像SP.jpg。2. 将原图P.jpg和含水印图像SP.jpg转换为灰度图像。3. 对原图P.jpg和含水印图像SP.jpg进行傅里叶变换,得到它们的频谱表示。4. 计算盲水印的频谱表示,即含水印图像的频谱表示减去原图的频谱表示。5. 对盲水印的频谱表示进行傅里叶反变换,得到盲水印的空域表示。6. 对盲水印的空域表示进行灰度处理,得到最终提取出的水印信息。

**Python代码示例:**pythonimport cv2import numpy as np

def extract_watermark(original_image_path, watermarked_image_path): # 加载原图和含水印图像 original_image = cv2.imread(original_image_path, cv2.IMREAD_GRAYSCALE) watermarked_image = cv2.imread(watermarked_image_path, cv2.IMREAD_GRAYSCALE)

# 傅里叶变换    original_fft = np.fft.fft2(original_image)    watermarked_fft = np.fft.fft2(watermarked_image)

# 盲水印的频谱表示    watermark_fft = watermarked_fft - original_fft

# 傅里叶反变换    watermark_image = np.fft.ifft2(watermark_fft)    watermark_image = np.abs(watermark_image)

# 灰度处理    watermark_image = watermark_image.astype(np.uint8)

return watermark_image

示例用法watermark = extract_watermark('P.jpg', 'SP.jpg')cv2.imshow('Extracted Watermark', watermark)cv2.waitKey(0)cv2.destroyAllWindows()

代码说明:

  • alpha 参数控制水印嵌入的强度,取值范围为0到1,值越大水印越明显,但可能会影响原图质量。* 以上代码示例中,生成含水印图像的算法和提取水印信息的算法都具有一定的鲁棒性,但仍可能受到一些因素的影响,如图像压缩、噪声等。如果需要进一步提高鲁棒性,可以考虑使用更复杂的水印嵌入和提取算法,或者采用其他相关的技术手段。
Python实现基于傅里叶变换的盲水印嵌入与提取

原文地址: https://www.cveoy.top/t/topic/fTgH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录