计算机视觉处理(OpenCV基础教学(十三):图像水印添加技术详解)

OpenCV基础教学(十三):图像水印添加技术详解

图像水印是保护版权和品牌标识的重要手段,本文将详细介绍如何使用OpenCV实现图像水印的添加,涵盖从基础到完整的实现过程。

总流程图:

一、图像水印技术概述

1.1 什么是图像水印?

图像水印是在不影响原始图像视觉效果的前提下,在图像中嵌入特定信息的技术。水印可以是可见的(如Logo、文字)或不可见的(数字水印),主要用于:

  1. 版权保护:标识图像所有权
  2. 品牌宣传:在图片上添加品牌Logo
  3. 信息隐藏:在图像中嵌入隐蔽信息
  4. 防伪标识:防止图像被非法使用

1.2 水印添加的基本原理

水印添加的核心是图像融合技术,即将水印图像与原始图像按照一定的规则进行混合。常见的融合方式包括:

  • 直接覆盖:简单叠加,可能影响原图质量
  • 透明叠加:通过透明度控制,平衡可见性和原图保留
  • 边缘融合:在边界处进行渐变融合,使过渡更自然

二、基础水印添加实现

2.1 完整代码解析

让我们从最基础的代码开始,逐步理解每个步骤:

python 复制代码
# 导入OpenCV的库
import cv2

# 1. 读取原始图像和模板图
image_np = cv2.imread('./lena.png')  # 读取原始图像
logo = cv2.imread('./logo.png')      # 读取Logo水印图像
cv2.imshow('原始图像', image_np)

# 获取logo图的大小
rows, cols = logo.shape[:2]  # 获取Logo的高度和宽度
print(f"Logo尺寸: 高度={rows}, 宽度={cols}")

# 截取原始图像的ROI区域(感兴趣区域)
# 这里我们选择在(100,100)位置放置Logo
roi = image_np[100:100 + rows, 100:100 + cols]
cv2.imshow('ROI区域', roi)

# 2. 对logo进行灰度化和二值化,制作成一张掩膜
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)  # 转为灰度图

# 阈值处理,创建掩膜
# THRESH_BINARY_INV:大于阈值的设为0,小于等于的设为255(反向二值化)
ret, mask = cv2.threshold(logo_gray, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('掩膜', mask)

# 3. 进行与运算
# 255的8位二进制全是1,它和任何8位整数做按位与运算,结果都等于这个整数本身
image_and = cv2.bitwise_and(roi, roi, mask=mask)
cv2.imshow('与运算结果', image_and)

# 4. 图像融合
dst = cv2.add(image_and, logo)

# 5. 将融合后的图像重新赋值到原始图像中
image_np[100:100 + rows, 100:100 + cols] = dst

# 6. 显示结果
cv2.imshow('Logo水印', logo)
cv2.imshow('最终结果', image_np)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 代码执行流程详解

步骤1:图像读取
python 复制代码
image_np = cv2.imread('./lena.png')
logo = cv2.imread('./logo.png')
  • 读取原始图像和水印Logo
  • 确保两个图像都存在,否则程序会出错
步骤2:获取ROI区域
python 复制代码
rows, cols = logo.shape[:2]
roi = image_np[100:100 + rows, 100:100 + cols]
  • logo.shape返回(高度, 宽度, 通道数)
  • 从原始图像中截取与Logo相同大小的区域
  • 这个区域将作为水印的放置位置
步骤3:创建掩膜
python 复制代码
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(logo_gray, 127, 255, cv2.THRESH_BINARY_INV)
  • 将彩色Logo转为灰度图
  • 使用阈值处理创建二值掩膜
  • THRESH_BINARY_INV:白色区域变为黑色,黑色区域变为白色
步骤4:与运算
python 复制代码
image_and = cv2.bitwise_and(roi, roi, mask=mask)
  • 使用掩膜对ROI区域进行与运算
  • 掩膜中黑色区域(值为0)会使对应位置的像素变为黑色
  • 掩膜中白色区域(值为255)会保留原图像素
步骤5:图像融合
python 复制代码
dst = cv2.add(image_and, logo)
  • 将处理后的ROI区域与Logo图像相加
  • 实现水印叠加效果
步骤6:替换原图区域
python 复制代码
image_np[100:100 + rows, 100:100 + cols] = dst
  • 将融合后的水印区域放回原图
  • 完成水印添加

三、核心函数详解

3.1 cv2.cvtColor() - 颜色空间转换

功能:将图像从一个颜色空间转换到另一个颜色空间。

常用转换:

  • cv2.COLOR_BGR2GRAY:BGR转灰度
  • cv2.COLOR_BGR2RGB:BGR转RGB
  • cv2.COLOR_GRAY2BGR:灰度转BGR
python 复制代码
# 示例:各种颜色空间转换
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

3.2 cv2.threshold() - 阈值处理

功能:对图像进行二值化处理。

参数:

  • src:输入图像(必须是灰度图)
  • thresh:阈值
  • maxval:最大值(当像素值超过阈值时赋予的值)
  • type:阈值类型

常用阈值类型:

  • cv2.THRESH_BINARY:大于阈值设为maxval,否则设为0
  • cv2.THRESH_BINARY_INV:大于阈值设为0,否则设为maxval
  • cv2.THRESH_TRUNC:大于阈值设为阈值,否则不变
  • cv2.THRESH_TOZERO:大于阈值不变,否则设为0
python 复制代码
# 示例:各种阈值处理
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
ret, binary_inv = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

3.3 cv2.bitwise_and() - 按位与运算

功能:对两个图像进行按位与运算。

参数:

  • src1:第一个输入图像
  • src2:第二个输入图像
  • mask:可选掩膜

运算规则:

  • 1 & 1 = 1
  • 1 & 0 = 0
  • 0 & 1 = 0
  • 0 & 0 = 0
python 复制代码
# 示例:与运算
result = cv2.bitwise_and(img1, img2)  # 无掩膜
result = cv2.bitwise_and(img1, img2, mask=mask)  # 带掩膜

3.4 cv2.add() - 图像加法

功能:将两个图像相加。

与普通加法的区别:

  • 普通加法:超过255会溢出(255+1=0)
  • cv2.add():超过255会被截断为255(饱和操作)
python 复制代码
# 示例:图像加法
result = cv2.add(img1, img2)  # 饱和加法
result = img1 + img2  # 普通加法,可能溢出

四、总结

通过本文的学习,我们掌握了OpenCV中图像水印添加的核心技术:

核心知识点

  1. 基本流程:ROI提取 → 掩膜创建 → 与运算 → 图像融合
  2. 关键函数 :
    • cv2.cvtColor():颜色空间转换
    • cv2.threshold():阈值处理
    • cv2.bitwise_and():按位与运算
    • cv2.add():图像加法
  3. 水印类型:图像水印、文字水印、透明水印、平铺水印
  4. 实用技巧:位置计算、透明度控制、批量处理

水印添加是图像处理中的实用技术,掌握它可以帮助你在各种应用中保护版权和增强品牌识别度。


如果觉得本文有帮助,欢迎点赞、收藏、关注!
你的支持是我持续创作的最大动力!

相关推荐
I'mChloe8 小时前
Windows部署BiliNote:Docker安装、AI视频转写、Markdown笔记与cpolar远程访问
人工智能·windows·docker
喜欢打篮球的普通人8 小时前
MiniMind 学习笔记(十二):Pretrain 实操——从版本梳理到 8GB 显卡上的真实训练
人工智能·笔记·学习
YOLO数据集集合8 小时前
无人机视角行人与车辆检测数据集 | 无人机航拍 行人检测 车辆检测 智慧城市 公共安全9140期
人工智能·目标检测·无人机·智慧城市·车辆识别·无人机视角
Joecien8 小时前
【2026实测】百炼 CLI 托管 Agent 教程:bl managed-agent 配置校验、版本回滚与变更预演(附完整命令)
人工智能·git·阿里云·知识图谱·agi
jimmyleeee8 小时前
大模型安全之三十六:大模型数据管理----从投毒防御到偏见治理的完整框架
人工智能·安全
IT古董8 小时前
《FDE前沿部署工程师实战教程》29 - Enterprise AI Security:Agent安全体系设计
大数据·数据库·人工智能
m4Rk_9 小时前
【论文阅读】Agent 记忆机制(87):VizoMem——把文本历史转化为可检索的视觉记忆
论文阅读·人工智能·学习·开源·github
让学习成为一种生活方式9 小时前
啤酒花基因组与重测序--Nature Communications
人工智能·算法
2601_949950639 小时前
错题总是反复错?用练题簿在线刷题,把复习重点找出来
人工智能·小程序·刷题·练习·小程序推荐
lpfasd1239 小时前
GitHub非AI开源方向调研报告
人工智能·开源·github