Python实现基于DFT的鲁棒数字水印算法
Python实现基于DFT的鲁棒数字水印算法
本文介绍一种基于离散傅里叶变换(DFT)的数字水印算法,并提供完整的Python代码实现。该算法能够将水印图像嵌入到原始图像中,并可以从嵌入水印的图像中提取水印信息,同时保证良好的鲁棒性。
代码解析pythonimport cv2import numpy as npimport random# ... other imports
def encode(fn1, fn2, fn3, alpha=10, seed=20221026, oldseed=False, debug=False): ''' 将水印图像嵌入到原始图像中
参数: fn1: 原始图像路径 fn2: 水印图像路径 fn3: 嵌入水印图像保存路径 alpha: 水印强度系数 seed: 随机数种子 oldseed: 是否使用旧版随机数生成器 debug: 是否开启调试模式 ''' print ('image<%s> + watermark<%s> -> image(encoded)<%s>' % (fn1, fn2, fn3)) img = cv2.imread(fn1) wm = cv2.imread(fn2)
# ... (调试模式下显示图像)
h, w = img.shape[0], img.shape[1] hwm = np.zeros((int(h * 0.5), w, img.shape[2])) assert hwm.shape[0] > wm.shape[0] assert hwm.shape[1] > wm.shape[1] hwm2 = np.copy(hwm) for i in range(wm.shape[0]): for j in range(wm.shape[1]): hwm2[i][j] = wm[i][j]
# ... (随机打乱水印图像像素位置)
rwm = np.zeros(img.shape) for i in range(hwm.shape[0]): for j in range(hwm.shape[1]): rwm[i][j] = hwm[i][j] rwm[rwm.shape[0] - i - 1][rwm.shape[1] - j - 1] = hwm[i][j]
# ... (调试模式下显示图像)
# 对原始图像进行DFT变换 f1 = np.fft.fft2(img) # 将水印图像叠加到频域 f2 = f1 + alpha * rwm # 对叠加后的频域进行IDFT变换 _img = np.fft.ifft2(f2)
# ... (调试模式下显示图像)
# 保存嵌入水印的图像 img_wm = np.real(_img) assert cv2.imwrite(fn3, img_wm, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
# ... (计算保存前后图像误差)# ... (解码函数)
算法步骤
- 读取图像: 读取原始图像和水印图像。2. 预处理水印图像: 将水印图像的像素位置随机打乱,增加水印的鲁棒性。3. 对原始图像进行DFT变换: 将原始图像从空间域转换到频域。4. 将水印图像叠加到频域: 将预处理后的水印图像叠加到原始图像的频域表示中。5. 对叠加后的频域进行IDFT变换: 将叠加水印后的频域表示转换回空间域。6. 保存嵌入水印的图像: 保存经过IDFT变换后的图像,即嵌入了水印信息的图像。
提取水印信息
提取水印信息的过程与嵌入过程类似,主要步骤如下:
- 读取嵌入水印的图像和原始图像。2. 对两幅图像分别进行DFT变换。3. 从嵌入水印的图像的频域中减去原始图像的频域,得到水印图像的频域表示。4. 对水印图像的频域表示进行IDFT变换,得到水印图像。
总结
本文介绍了一种基于DFT的数字水印算法,并提供了Python代码实现。该算法简单易懂,具有一定的鲁棒性,可以应用于数字版权保护等领域
原文地址: https://www.cveoy.top/t/topic/fTgm 著作权归作者所有。请勿转载和采集!