Opencv之图像添加水印

一、实验原理

在图片处理领域,添加水印是一种常见的操作。通过叠加图像的方式,可以将水印无缝嵌入目标图像的指定位置。其基本原理包括以下步骤:

1、模板输入(掩膜生成):

将水印图片转换为灰度图,通过二值化操作生成掩膜。

掩膜用于区分水印图的有效区域(黑色)和背景区域(白色)。

2、背景提取:


模板图的形状

利用掩膜和目标图片的感兴趣区域(ROI),通过位运算提取水印图背景部分。

3、水印叠加:

将背景部分和水印有效区域进行融合,生成叠加后的图片。该组件的目的就是将图像对应的数组中的对应元素进行相加(一定要注意这里的两个数组是规格相同的,也就是说要么都是灰度图,要么都是彩图),其过程如下图所示。

4、图像更新:

将叠加后的区域重新写回到目标图片中,完成水印的嵌入。

二、实验代码

以下代码实现了完整的水印添加流程:

python 复制代码
import cv2

# 1. 读取原图
image_np = cv2.imread("demo1.jpg")
image_np = cv2.resize(image_np, (image_np.shape[1] // 10, image_np.shape[0] // 10))

# 2. 读取水印图
logo = cv2.imread("./logo.jpg")
logo = cv2.resize(logo, (logo.shape[1] // 3, logo.shape[0] // 3))
gray_logo = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)  # 转为灰度图

# 3. 创建掩膜,保留灰色部分,去掉白色部分
# 定义阈值范围(灰色部分为中间亮度值)
lower_bound = 1  # 灰色部分的最低亮度值
upper_bound = 254  # 灰色部分的最高亮度值
mask_logo = cv2.inRange(gray_logo, lower_bound, upper_bound)  # 保留灰色部分
cv2.imshow("Mask of Logo", mask_logo)

# 确保掩膜大小与 ROI 区域一致
rows, cols = logo.shape[:2]  # 获取 logo 的高度和宽度
roi = image_np[:rows, :cols]  # 从原图中截取 ROI 区域

# 4. 提取 ROI 背景(除去白色区域的部分)
logo_no_white = cv2.bitwise_and(logo, logo, mask=mask_logo)  # 使用掩膜保留灰色部分
cv2.imshow("Logo without White", logo_no_white)

# 5. 将去除白色的 logo 融合到原图 ROI
image_np_bg = cv2.bitwise_and(roi, roi, mask=cv2.bitwise_not(mask_logo))  # 提取原图背景区域
dst = cv2.add(image_np_bg, logo_no_white)  # 将背景与 logo 融合

# 6. 更新原图的 ROI 区域
image_np[:rows, :cols] = dst
cv2.imshow("Final Image with Watermark", image_np)

# 7. 显示结果
cv2.waitKey(0)
cv2.destroyAllWindows()

三、实验现象

1、原始图像:

显示未添加水印的原始图片。

2、掩膜生成:

  • 掩膜图显示了水印图的有效区域(黑色)和背景区域(白色)。
  • 掩膜用于提取目标图片的背景。

3、背景提取:

image_np_bg 显示了原始图像中,水印位置区域除去水印部分的背景。

4、水印叠加:

水印图像与背景部分融合,生成了最终叠加效果。

5、最终结果:

在原图的指定位置成功嵌入了水印,水印图像自然融合,与目标图片无缝对接。

相关推荐
郝学胜_神的一滴15 分钟前
Effective Python 条款 8: 同时遍历多组序列:zip 与 zip_longest 的实战避坑指南
python·pycharm
差不多的周周19 分钟前
《MotionLLM:从人体运动和视频理解人类行为》论文核心部分详解
人工智能·深度学习·机器学习·计算机视觉·语言模型·音视频
承渊政道25 分钟前
【Python编程—从入门到实践】(Python字典:从基础语义到现代工程实践)
开发语言·python·pycharm·字典·嵌套
麻雀飞吧27 分钟前
搜索“近期量化入门”时,先补交易理解再看 Python 和 API
人工智能·python
名字还没想好☜1 小时前
Python 字符编码实战:encode/decode、UnicodeDecodeError 与 open 的 encoding 坑
开发语言·后端·python·编程语言
带多刺的玫瑰1 小时前
Leecode#29刷题之两数相除
java·python·算法
smj2302_796826521 小时前
解决leetcode第4017题数组中的峰值II
python·算法·leetcode
卷无止境1 小时前
AI Agent编程中,重构节奏与安全检查的门道
后端·python
慧都小妮子1 小时前
用 Python 批量把 PDF 参考文献排成 MLA 格式:Spire.Doc for Python 实战
python·pdf·c#·spire.doc·mla格式·参考文献排版·pdf批量处理
LeapMay1 小时前
中国科学院深圳先进技术研究院-深圳职业技术大学联合培养博士后招聘(具身智能/多模态感知/视觉检测方向)
人工智能·计算机视觉·3d·机器人