Python 盲水印嵌入与提取:生成与原图几乎相同的图片
Python 盲水印嵌入与提取:生成与原图几乎相同的图片
本文将介绍使用 Python 实现盲水印嵌入技术,将水印信息嵌入到图片中,生成与原图几乎相同的图片,并提供提取水印信息的 Python 程序。
1. 算法原理
生成图片 SP 的算法可以使用盲水印嵌入技术。具体步骤如下:
- 加载原图 P 和水印图 wm。
- 将原图 P 转换为灰度图像,可以使用 OpenCV 库中的
cvtColor函数。 - 对原图 P 进行离散余弦变换 (DCT),可以使用 OpenCV 库中的
dct函数。 - 对水印图 wm 进行二值化处理,将其转换为黑白图像,可以使用 OpenCV 库中的
threshold函数。 - 将水印图 wm 进行离散余弦变换 (DCT),可以使用 OpenCV 库中的
dct函数。 - 将水印图 wm 的离散余弦变换系数嵌入到原图 P 的离散余弦变换系数中。可以选择一些特定的系数进行嵌入,也可以根据一定的规则进行嵌入。
- 对嵌入了水印的离散余弦变换系数进行反变换,得到嵌入水印后的图像 SP,可以使用 OpenCV 库中的
idct函数。 - 保存图像 SP 为 SP.jpg。
2. Python 代码实现
2.1 嵌入水印
import cv2
import numpy as np
def embed_watermark(P_path, wm_path, SP_path):
# 加载原图 P 和水印图 wm
P = cv2.imread(P_path)
wm = cv2.imread(wm_path)
# 转换为灰度图像
P_gray = cv2.cvtColor(P, cv2.COLOR_BGR2GRAY)
# 离散余弦变换 (DCT)
P_dct = cv2.dct(np.float32(P_gray))
# 二值化处理水印图 wm
wm_gray = cv2.cvtColor(wm, cv2.COLOR_BGR2GRAY)
_, wm_binary = cv2.threshold(wm_gray, 127, 255, cv2.THRESH_BINARY)
# 离散余弦变换 (DCT)
wm_dct = cv2.dct(np.float32(wm_binary))
# 将水印图 wm 的离散余弦变换系数嵌入到原图 P 的离散余弦变换系数中
alpha = 0.05 # 嵌入系数
P_dct += alpha * wm_dct
# 反变换得到嵌入水印后的图像 SP
SP = cv2.idct(np.float32(P_dct))
# 保存图像 SP
cv2.imwrite(SP_path, SP)
# 示例用法
embed_watermark('P.jpg', 'wm.jpg', 'SP.jpg')
2.2 提取水印
import cv2
import numpy as np
def extract_watermark(SP_path, wm_extracted_path):
# 加载嵌入水印后的图像 SP
SP = cv2.imread(SP_path)
# 转换为灰度图像
SP_gray = cv2.cvtColor(SP, cv2.COLOR_BGR2GRAY)
# 离散余弦变换 (DCT)
SP_dct = cv2.dct(np.float32(SP_gray))
# 提取水印信息
wm_extracted_dct = SP_dct # 假设水印信息嵌入在所有离散余弦变换系数中
# 反变换得到提取出的水印图像
wm_extracted = cv2.idct(np.float32(wm_extracted_dct))
# 保存提取出的水印图像
cv2.imwrite(wm_extracted_path, wm_extracted)
# 示例用法
extract_watermark('SP.jpg', 'wm_extracted.jpg')
3. 鲁棒性提升
以上程序仅提供了基本的示例,具体的算法和参数需要根据实际需求进行调整和优化。同时,为了提高鲁棒性,可以在嵌入水印时使用一些冗余信息来增加水印的可靠性和提取的准确性。例如,可以使用错误纠正编码来提高水印的抗噪声能力,或者使用多个嵌入位置来提高水印的抗攻击能力。
4. 总结
本文介绍了使用 Python 实现盲水印嵌入技术,并提供了生成与原图几乎相同的图片和提取水印信息的程序示例。通过优化算法和参数,并使用一些鲁棒性提升技术,可以有效地提高水印的可靠性和提取的准确性。
原文地址: https://www.cveoy.top/t/topic/fTg7 著作权归作者所有。请勿转载和采集!