OpenCV图片添加水印

ops/2024/12/18 2:35:15/

在数字图像处理领域,为图片添加水印是一项常见的任务,它既可以用于版权保护,也可以用于品牌宣传。

图片添加水印的基本原理是将一个较小的图像(水印)嵌入到另一个较大的图像(原图)中。这个过程通常涉及以下几个步骤:

  1. 读取图像:首先,我们需要读取原图和水印图像。
  2. 水印预处理:为了更好地将水印融合到原图中,我们可能需要对水印图像进行一些预处理,如转换为灰度图、二值化等。
  3. 计算掩膜:通过二值化处理,我们可以得到一个水印图像的掩膜,这个掩膜将用于确定水印图像中的哪些部分应该被保留,哪些部分应该被忽略。
  4. 图像融合:最后,我们使用图像融合技术将水印图像和原图结合起来,生成带有水印的新图像。

实验代码

下面是使用OpenCV库为图片添加水印的完整代码:

import cv2# 1. 读取原图
image_np = cv2.imread("bgc.jpeg")# 检查原图是否成功加载
if image_np is None:print("Error: Original image not found.")exit()# 2. 读取水印图,包含alpha通道
logo = cv2.imread("./tm1.png", cv2.IMREAD_UNCHANGED)# 分离BGR和Alpha通道
b, g, r, a = cv2.split(logo)# 合并BGR通道为灰度图
gray_logo = cv2.merge((b, g, r))
gray_logo = cv2.cvtColor(gray_logo, cv2.COLOR_BGR2GRAY)# 3. 水印图二值化,得到logo的掩膜(有效区域为白,背景为黑)
ret, mask_logo = cv2.threshold(gray_logo, 10, 255, cv2.THRESH_BINARY)
mask_logo_inv = cv2.bitwise_not(mask_logo)# 4. 根据掩膜在原图上添加水印
rows, cols = logo.shape[:2]
roi = image_np[0:rows, 0:cols]# 在原图的ROI上使用掩膜“挖空”
img_masked = cv2.bitwise_and(roi, roi, mask=mask_logo_inv)# 只取水印的非透明部分
logo_rgb = logo[:, :, :3]# 使用掩膜和alpha通道合并水印和原图
dst = cv2.add(img_masked, cv2.bitwise_and(logo_rgb, logo_rgb, mask=mask_logo))# 更新原图
image_np[0:rows, 0:cols] = dst# 5. 显示并保存结果
cv2.imshow("Watermarked Image", image_np)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存添加水印后的图像
cv2.imwrite("watermarked_image.png", image_np)


实验现象

  1. 原图显示:首先,代码会读取并显示原图,这是一张未经任何处理的原始图像。
  2. 水印图处理:接着,代码会读取并处理水印图像,包括转换为灰度图和二值化处理。处理后的水印图像将用于生成掩膜。
  3. 掩膜显示:代码会显示生成的掩膜图像,这是一个二值化后的图像,其中水印的有效区域为黑色,背景为白色。
  4. 水印添加:使用掩膜和原图进行图像融合,将水印添加到原图中。这个过程会根据掩膜来确定水印图像中的哪些部分应该被保留到最终图像中。
  5. 结果显示:最后,代码会显示添加水印后的图像,并可以选择将其保存到磁盘上。

注意事项

  • 水印图像的选择:水印图像应该是一个较小的图像,这样它才不会过于突兀地覆盖原图。
  • 阈值的调整:在进行二值化处理时,阈值的选择非常重要。如果阈值设置得太高或太低,都可能导致水印图像的部分内容丢失或保留过多的背景信息。
  • 图像融合的方式:本文使用了简单的cv2.add函数进行图像融合。在实际应用中,还可以根据需求选择其他融合方式,如加权融合、透明度融合等。


http://www.ppmy.cn/ops/142783.html

相关文章

初始JavaEE篇 —— 网络原理---应用层协议:深入理解 HTTP/HTTPS

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 我们在前面简单的接触了 TCP/IP五层协议中的传输层协议,并使用 UDP协议 与 TCP协议 编写了一个简单的回显服务器 与 客户…

uniapp打包apk允许横屏竖屏内容翻转

文章目录 一、教程总结 一、教程 1.添加配置 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏反方向"landscape-secondary",//自然方向"…

使用 mkcert 工具自签发 https 证书并进行本地受信

介绍 mkcert 是一个用于创建本地受信任的 SSL/TLS 证书的简单工具,特别适合开发者在本地环境中使用。它解决了为开发和测试目的创建自签名证书时遇到的信任问题。以下是关于 mkcert 的详细介绍: 特点 易用性:只需一条命令即可生成证书&…

Python序列的应用(八):元组、字典

前言:在Python编程语言中,序列是一种非常重要的数据结构,它允许我们存储和操作有序的数据集合。在前几期的内容中,我们已经探讨了列表(List)和集合(Set)这两种序列的应用&#xff0c…

Unreal Engine 5 (UE5) 中“变换“(Transform)类型变量

在 Unreal Engine 5 (UE5) 中,"变换"(Transform)类型变量是一个非常常见和重要的数据类型,它用于表示 对象的位置(Location)、旋转(Rotation) 和 缩放(Scale&a…

【Unity功能集】TextureShop纹理工坊(一)功能集介绍

项目源码:后期发布 免责声明:【TextureShop】使用的图片等素材均有可能来自互联网,本专栏所有文章仅做学习和教程目的,不会将任何素材用于任何商业用途。 索引 【系列简介】功能集效果介绍选定选区移动选区套索工具魔术棒工具修剪…

IOS学习路线图

‌iOS是由苹果公司开发的移动操作系统。 苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad上。iOS与苹果的macOS操作系统一样,属于类Unix的商业操作系统。原本这个系统名为…

桥梁结构健康自动化监测预警系统的意义

随着我国桥梁数量的快速增长,同时既有的许多桥梁逐渐进入了养护维修阶段。有关专家认为桥梁使用超过25年以上则进入老化期;据统计,我国桥梁总数的40%已经属于“老龄”桥梁。而且随着时间的推移,其数量还在不断增长,屡屡…