news 2026/6/11 1:38:53

手把手复现蓝桥杯‘缺失的数据’:用Python OpenCV和PyWavelets搞定数字水印提取

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手复现蓝桥杯‘缺失的数据’:用Python OpenCV和PyWavelets搞定数字水印提取

数字水印实战:用Python OpenCV和PyWavelets实现CTF题目复现

数字水印技术作为信息隐藏领域的重要分支,在版权保护、数据安全等方面有着广泛应用。本文将从一个典型的CTF竞赛题目出发,完整复现数字水印的提取过程,帮助读者掌握OpenCV和PyWavelets库在图像处理中的实际应用。

1. 环境准备与基础知识

在开始之前,我们需要搭建合适的开发环境。推荐使用Python 3.8或更高版本,并安装以下关键库:

pip install opencv-python numpy pywavelets

数字水印技术主要分为空域方法和频域方法两大类。空域方法直接修改像素值,而频域方法(如本文使用的小波变换)则通过修改变换域系数来嵌入水印,具有更好的鲁棒性。

Arnold变换是一种常用的图像置乱技术,其数学表达式为:

$$ \begin{bmatrix} x' \ y' \end{bmatrix}

\begin{bmatrix} 1 & b \ a & ab+1 \end{bmatrix} \begin{bmatrix} x \ y \end{bmatrix} \mod N $$

其中a、b为参数,N为图像尺寸。通过多次迭代,可以实现图像的置乱和复原。

2. 核心算法解析

2.1 Arnold变换实现

Arnold变换的核心代码实现如下:

def arnold(self, img): r, c = img.shape p = np.zeros((r, c), np.uint8) a, b = 1, 1 for k in range(self.key): for i in range(r): for j in range(c): x = (i + b * j) % r y = (a * i + (a * b + 1) * j) % c p[x, y] = img[i, j] return p

对应的逆变换为:

def deArnold(self, img): r, c = img.shape p = np.zeros((r, c), np.uint8) a, b = 1, 1 for k in range(self.key): for i in range(r): for j in range(c): x = ((a * b + 1) * i - b * j) % r y = (-a * i + j) % c p[x, y] = img[i, j] return p

注意:key参数决定了变换的迭代次数,必须与加密时使用的次数一致才能正确恢复图像。

2.2 小波变换应用

离散小波变换(DWT)将图像分解为不同频率的子带,是数字水印嵌入的常用方法。我们使用PyWavelets库实现三级小波分解:

c = pywt.wavedec2(img2, 'db2', level=3) [cl, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = c

水印提取的关键步骤是对系数进行加权处理:

ca1 = (cl - dl) * a1 ch1 = (cH3 - dH3) * a2 cv1 = (cV3 - dV3) * a3 cd1 = (cD3 - dD3) * a4

3. 完整水印提取流程

3.1 图像预处理

首先读取并预处理原始图像和水印图像:

img = cv2.imread('a.png') watermark = cv2.imread('newImg.png') img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) mark_gray = cv2.cvtColor(watermark, cv2.COLOR_RGB2GRAY)

3.2 水印提取实现

完整的水印提取类实现如下:

class WaterMarkDWT: def __init__(self, origin: str, watermark: str, key: int, weight: list): self.key = key self.img = cv2.imread(origin) self.mark = cv2.imread(watermark) self.coef = weight # ... Arnold变换和逆变换方法 ... def get(self, size: tuple = (1200, 1200), flag: int = None): img = cv2.resize(self.img, size) img1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) img2 = cv2.cvtColor(self.mark, cv2.COLOR_RGB2GRAY) # 小波分解 c = pywt.wavedec2(img2, 'db2', level=3) [cl, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = c d = pywt.wavedec2(img1, 'db2', level=3) [dl, (dH3, dV3, dD3), (dH2, dV2, dD2), (dH1, dV1, dD1)] = d # 系数处理 a1, a2, a3, a4 = self.coef ca1 = (cl - dl) * a1 ch1 = (cH3 - dH3) * a2 cv1 = (cV3 - dV3) * a3 cd1 = (cD3 - dD3) * a4 # 确保系数形状一致 ca1 = cv2.resize(ca1, (cD3.shape[1], cD3.shape[0])) # 小波重构 waterImg = pywt.waverec2([ca1, (ch1, cv1, cd1)], 'db2') waterImg = np.array(waterImg, np.uint8) waterImg = self.deArnold(waterImg) # 形态学处理 kernel = np.ones((3, 3), np.uint8) if flag == 0: waterImg = cv2.erode(waterImg, kernel) elif flag == 1: waterImg = cv2.dilate(waterImg, kernel) return waterImg

3.3 参数调优技巧

水印提取效果受多个参数影响:

参数作用典型值范围
keyArnold变换迭代次数10-50
a1近似系数权重0.1-0.3
a2水平细节权重0.1-0.3
a3垂直细节权重0.3-0.6
a4对角细节权重0.2-0.5

实际应用中,可以通过以下方法优化提取效果:

  1. 逐步调整权重参数,观察水印清晰度变化
  2. 尝试不同的形态学处理方法(腐蚀、膨胀)
  3. 对小波重构结果进行直方图均衡化

4. 实战应用与扩展

4.1 自定义图像测试

读者可以尝试用自己的图像进行测试:

if __name__ == '__main__': # 使用自定义图像 img = 'your_image.png' watermark = 'your_watermarked_image.png' k = 25 # 尝试不同迭代次数 xs = [0.15, 0.25, 0.45, 0.35] # 调整权重 W1 = WaterMarkDWT(img, watermark, k, xs) extracted_watermark = W1.get() cv2.imwrite('extracted_watermark.png', extracted_watermark)

4.2 常见问题解决

在实际操作中可能会遇到以下问题:

  • 图像尺寸不匹配:确保原始图像和水印图像尺寸相同,或使用resize统一尺寸
  • 水印不清晰:尝试调整权重系数,增加Arnold变换的迭代次数
  • 噪声干扰:对小波重构结果进行中值滤波处理

4.3 技术扩展方向

基于本案例,可以进一步探索:

  1. 鲁棒性测试:对含水印图像进行压缩、裁剪等操作,测试提取效果
  2. 彩色图像水印:将算法扩展到RGB三通道
  3. 盲水印提取:研究不需要原始图像的提取方法

数字水印技术的实际应用远不止于CTF竞赛,在版权保护、内容认证等领域都有重要价值。通过这个实战项目,我们不仅掌握了相关Python库的使用,更重要的是理解了数字水印的核心原理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 1:38:52

Synagis帕利佐单抗给药季节为11月至次年4月,过敏体质者需备肾上腺素

帕利珠单抗在婴幼儿呼吸道合胞病毒预防中以明确的保护效力确立了核心地位,但这款药物的安全管理不能仅靠"每月打一针"的简单操作一笔带过。给药季节的严格限定与过敏体质者的肾上腺素备用要求,是整个用药周期中最刚性的两条管理支柱&#xff0…

作者头像 李华
网站建设 2026/6/11 1:37:53

实战部署iTop:为企业IT运维构建高效管理平台的完整指南

实战部署iTop:为企业IT运维构建高效管理平台的完整指南 【免费下载链接】iTop A simple, web based CMDB & IT Service Management tool 项目地址: https://gitcode.com/gh_mirrors/it/iTop iTop(IT Operations Portal)是一款基于…

作者头像 李华
网站建设 2026/6/11 1:33:56

数据建模怎么做?一文掌握从0到1的数据建模全流程

每次一提到数据建模,大家就觉得这是算法工程师、数据分析师或者数仓同学才需要关心的事。其实不然。只要你的工作和数据打交道,不管是做运营、产品、业务分析,还是搭建报表体系,数据建模都是绕不过去的一步。它决定了数据能不能被…

作者头像 李华
网站建设 2026/6/11 1:31:59

终极Windows风扇控制指南:5分钟快速掌握FanControl完整教程

终极Windows风扇控制指南:5分钟快速掌握FanControl完整教程 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…

作者头像 李华