OpenCV基础教学(十三):图像水印添加技术详解
图像水印是保护版权和品牌标识的重要手段,本文将详细介绍如何使用OpenCV实现图像水印的添加,涵盖从基础到完整的实现过程。
总流程图:

一、图像水印技术概述
1.1 什么是图像水印?
图像水印是在不影响原始图像视觉效果的前提下,在图像中嵌入特定信息的技术。水印可以是可见的(如Logo、文字)或不可见的(数字水印),主要用于:
- 版权保护:标识图像所有权
- 品牌宣传:在图片上添加品牌Logo
- 信息隐藏:在图像中嵌入隐蔽信息
- 防伪标识:防止图像被非法使用
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转RGBcv2.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,否则设为0cv2.THRESH_BINARY_INV:大于阈值设为0,否则设为maxvalcv2.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中图像水印添加的核心技术:
核心知识点
- 基本流程:ROI提取 → 掩膜创建 → 与运算 → 图像融合
- 关键函数 :
cv2.cvtColor():颜色空间转换cv2.threshold():阈值处理cv2.bitwise_and():按位与运算cv2.add():图像加法
- 水印类型:图像水印、文字水印、透明水印、平铺水印
- 实用技巧:位置计算、透明度控制、批量处理
水印添加是图像处理中的实用技术,掌握它可以帮助你在各种应用中保护版权和增强品牌识别度。
如果觉得本文有帮助,欢迎点赞、收藏、关注!
你的支持是我持续创作的最大动力!