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])

# ... (计算保存前后图像误差)# ... (解码函数)

算法步骤

  1. 读取图像: 读取原始图像和水印图像。2. 预处理水印图像: 将水印图像的像素位置随机打乱,增加水印的鲁棒性。3. 对原始图像进行DFT变换: 将原始图像从空间域转换到频域。4. 将水印图像叠加到频域: 将预处理后的水印图像叠加到原始图像的频域表示中。5. 对叠加后的频域进行IDFT变换: 将叠加水印后的频域表示转换回空间域。6. 保存嵌入水印的图像: 保存经过IDFT变换后的图像,即嵌入了水印信息的图像。

提取水印信息

提取水印信息的过程与嵌入过程类似,主要步骤如下:

  1. 读取嵌入水印的图像和原始图像。2. 对两幅图像分别进行DFT变换。3. 从嵌入水印的图像的频域中减去原始图像的频域,得到水印图像的频域表示。4. 对水印图像的频域表示进行IDFT变换,得到水印图像。

总结

本文介绍了一种基于DFT的数字水印算法,并提供了Python代码实现。该算法简单易懂,具有一定的鲁棒性,可以应用于数字版权保护等领域

Python实现基于DFT的鲁棒数字水印算法

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

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