opencv模拟数字水印的嵌入和提取过程

本文介绍了一种使用Python实现的图像水印嵌入与提取的方法。通过加载原始图片和水印图片,并进行一系列图像处理操作,最终完成水印的嵌入与解码过程。该方法利用了OpenCV库提供的功能,包括图像读取、显示、保存等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import cv2
import numpy as np

# 加载原始图片
oriImg = cv2.imread("shanghai.jpg", 0)
r ,c = oriImg.shape
cv2.namedWindow("origin",cv2.WINDOW_NORMAL)  # 设置窗口尺寸
cv2.imshow("origin", oriImg)
cv2.imwrite('OriginImg.png',oriImg)

# 加载水印图片
watermark = cv2.imread("watermark.jpg", 0)
r1 ,c1 = watermark.shape
watermark = cv2.resize(watermark,(r1*6,c1*4))
w1 = watermark[:,:]>200
watermark[w1] = 0
w2 = watermark[:,:]>200
watermark[w2] = 1
watermarkImg = np.zeros((r,c), dtype=np.uint8)
r1 ,c1 = watermark.shape
watermarkImg[600:600+r1,2000:2000+c1] = watermark
cv2.namedWindow("watermark",cv2.WINDOW_NORMAL)
cv2.imshow("watermark", watermarkImg)
cv2.imwrite('WatermarkImg.png',watermarkImg)

# 水印嵌入
t254 = np.ones((r,c), dtype=np.uint8)*254 
imgH7 = cv2.bitwise_and(oriImg, t254)
resultImg = cv2.bitwise_or(imgH7, watermarkImg)
cv2.namedWindow("result",cv2.WINDOW_NORMAL)
cv2.imshow("result",resultImg)
cv2.imwrite('ResultImg.png',resultImg)

# 水印解码
t1 = np.ones((r,c), dtype=np.uint8)
delImg = cv2.bitwise_and(resultImg, t1)
w3 = delImg[:,:]>0
delImg[w3] = 255
cv2.namedWindow("delete",cv2.WINDOW_NORMAL)
cv2.imshow("delete",delImg)
cv2.imwrite('DeleteImg.png',delImg)

cv2.waitKey()
cv2.destroyAllWindows()

 

 

 

### Java 实现视频文件添加与提取水印功能 #### 1. 添加盲水印到视频文件 在 Java 中,可以利用第三方库 FFmpeg 来处理视频中的盲水印嵌入。FFmpeg 是一种强大的多媒体处理工具,支持多种音频、视频编码解码器以及滤镜应用。 以下是基于 FFmpeg 的 Java 调用实现: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class VideoWatermark { public static void addBlindWatermark(String inputVideoPath, String outputVideoPath, String watermarkText) { try { ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command( "ffmpeg", "-i", inputVideoPath, "-vf", "drawtext=text='" + watermarkText + "':x=10:y=10:fontsize=24:fontcolor=white@0.5", outputVideoPath); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 输出日志信息 } int exitCode = process.waitFor(); // 等待进程结束并获取退出状态码 if (exitCode == 0) { System.out.println("盲水印已成功添加至视频!"); } else { System.err.println("失败:" + exitCode); } } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码实现了向指定路径的输入视频 `inputVideoPath` 添加盲水印文字,并保存为新的输出视频 `outputVideoPath`[^1]。 --- #### 2. 提取水印文字 对于盲水印的文字提取,通常需要借助信号处理算法或者机器学习模型来分析帧数据中的隐藏信息。由于盲水印本身不依赖可见特征,因此其提取过程较为复杂。 下面是一个简单的示例框架,用于解析视频帧并通过正则表达式匹配可能存在的隐写字符序列: ```java import org.bytedeco.opencv.global.opencv_core; import org.bytedeco.opencv.global.opencv_imgcodecs; import org.bytedeco.opencv.global.opencv_videoio; import org.bytedeco.opencv.opencv_core.Mat; public class ExtractBlindWatermark { public static String extractBlindWatermark(String videoFilePath) { Mat frame = new Mat(); opencv_videoio.VideoCapture capture = new opencv_videoio.VideoCapture(videoFilePath); StringBuilder extractedData = new StringBuilder(); while (capture.read(frame)) { byte[] data = new byte[frame.total() * frame.channels()]; frame.get(0, 0, data); // 对每一帧的数据进行隐写检测逻辑(假设简单 ASCII 编码) for (byte b : data) { char c = (char) Math.abs(b % 128); // 取绝对值防止负数干扰 if (Character.isLetterOrDigit(c)) { // 过滤有效字母或数字 extractedData.append(c); } } } capture.release(); return extractedData.toString().trim(); // 返回最终提取的结果字符串 } } ``` 此代码片段展示了如何逐帧读取视频内容,并尝试从中恢复潜在的盲水印信息[^2]。 --- #### 3. 结合实际场景优化建议 为了提高效率准确性,在真实项目开发过程中可考虑以下改进措施: - **多线程并发处理**:针对大型视频文件拆分任务单元分别计算。 - **GPU 加速渲染**:引入 CUDA 或 OpenCL 技术加速图像变换运算。 - **AI 辅助识别**:采用深度神经网络训练特定模式下的水印定位能力。 以上方法均需额外配置环境变量及安装对应 SDK 工具包才能正常使用[^3]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值