当前位置: 首页 > news >正文

手把手复现蓝桥杯‘缺失的数据’:用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库的使用,更重要的是理解了数字水印的核心原理。

http://www.jsqmd.com/news/989221/

相关文章:

  • 动手搭一个可调直流电源:用Arduino+晶闸管实现AC-DC可控整流(附代码和波形分析)
  • 智能小区安防系统的设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码或者私信
  • STC8H1K17的EEPROM读写:手把手教你封装16位数据读写函数(附完整代码)
  • 2026年q2塑料拉链选购排行:嘉兴双层防爆拉链/嘉兴双拉链/嘉兴塑料拉链/嘉兴尼龙拉链/五大厂家核心维度对比 - 优质品牌商家
  • 分数平均曲率流与毛细边界条件的数学建模与应用
  • ImageJ2完整指南:如何选择最适合您研究需求的科学图像处理方案
  • 全面解读2026年武汉专业的工业滑升门制造商联系方式 - 品牌鉴赏官2026
  • 别再只看K线了!用Python复刻同花顺里的VR、VMA等10个量价指标(附完整代码)
  • 为什么你的视频文件总是太大?CompressO帮你5分钟解决存储难题
  • 如何高效管理微信聊天数据:开源工具的完全指南
  • 2026证件照蓝底制作工具推荐:保姆级教程(免费在线+手机App)
  • 上海 GEO 服务商权威推荐:2026 年五大实力品牌与全意图 GEO 战略意义 - GEO优化
  • 开源数据恢复:当数字记忆丢失时,PhotoRec如何成为你的救星?
  • 用不到5000块DIY一个四自由度气动机械臂?开源硬件+PLC模拟器实战指南
  • Manus为人形机器人训练提供可靠数据支持
  • 2026优质塘桥办理公司注册业务公司排行参考 - 品牌排行榜
  • 告别混乱!用Quicker+Zotero6打造你的五星级文献管理系统(附详细配置脚本)
  • 工厂照明节能改造:成本控制、分区设计与零碳工厂照明指标
  • 神经网络场论与弦论路径积分的融合研究
  • 2026年q2成都社区文化墙设计可靠服务商技术解析:成都党建文化墙定制公司/成都公司前台形象墙设计公司/实力盘点 - 优质品牌商家
  • Vue.js从零到精通系列(四):前端路由与Vue Router——打造多页单页应用
  • 别再只看K线了!用Python复刻同花顺的VR和VSTD指标,量化你的风险感知力
  • MC9S12XE Flash操作实战:从寄存器配置到安全编程避坑指南
  • OpenGL实战:用中点Bresenham算法手搓一个椭圆(附完整C++代码)
  • STC8H1K17的EEPROM读写:官方库只能存1字节?手把手教你封装16位数据读写函数
  • FireRedTTS2实战指南:5步构建专属多说话人对话语音模型
  • Kodi PVR IPTV Simple:3个核心痛点与专业解决方案
  • 2026免费证件照在线生成工具推荐:保姆级对比教程,手把手教你3分钟搞定!
  • 如何快速提升戴森球计划工厂效率:3000+专业蓝图库完整指南
  • 国内专业球阀厂家实力排行:四川特殊不锈钢管厂家/四川球阀厂家/四川离心泵厂家/选型核心参考推荐 - 优质品牌商家