计算机视觉处理(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. 实用技巧:位置计算、透明度控制、批量处理

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


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

相关推荐
不错就是对2 小时前
【Agent-lightning】 - 1_环境搭建
人工智能·pytorch·深度学习·机器学习·chatgpt·transformer·vllm
Wilson Chen2 小时前
从“手搓”到云原生:某 B2B 平台服装 AI 搜索架构演进实战
人工智能·云原生·架构
未来之窗软件服务2 小时前
幽冥大陆(八十七 ) 水果识别在线检测模型netron —东方仙盟练气期
人工智能·机器学习·ncnn·仙盟创梦ide·东方仙盟
村口曹大爷2 小时前
[特殊字符] 2026年AI最新趋势深度解读:智能体崛起、多模态融合、全球竞速加剧
人工智能·ai
Elastic 中国社区官方博客2 小时前
如何使用 LangChain 和 Elasticsearch 构建 agent 知识库
大数据·人工智能·elasticsearch·搜索引擎·ai·langchain·全文检索
星云数灵3 小时前
大模型高级工程师考试练习题1
人工智能·大模型·大模型工程师·大模型考试题·大模型工程师练习题·大模型高频考题
草莓熊Lotso3 小时前
Python 进阶核心:字典 / 文件操作 + 上下文管理器实战指南
数据结构·c++·人工智能·经验分享·笔记·git·python
乐迪信息5 小时前
乐迪信息:目标检测算法+AI摄像机:煤矿全场景识别方案
人工智能·物联网·算法·目标检测·目标跟踪·语音识别
学术小白人7 小时前
【EI会议征稿通知】2026年智能感知与自主控制国际学术会议(IPAC 2026)
人工智能·物联网·数据分析·区块链·能源