Opencv之图像添加水印

一、实验原理

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

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

将水印图片转换为灰度图,通过二值化操作生成掩膜。
掩膜用于区分水印图的有效区域(黑色)和背景区域(白色)。

2、背景提取:


模板图的形状

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

3、水印叠加:

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

4、图像更新:

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

二、实验代码

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

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、最终结果:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …

远程调试软件对比与使用推荐

远程调试软件对比与使用推荐 远程调试是现代软件开发中不可或缺的一部分,尤其是在处理分布式系统、云端服务或远程服务器上的问题时。以下是对几种常见远程调试工具的详细对比和推荐使用场景。 1. GDB (GNU Debugger) 特点 开源:完全免费且开源&…

HTML和JavaScript实现商品购物系统

下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明: 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…

将带注释的Word文档改造成点击注释引用即可弹窗显示注释的HTML文档

阅读中国古籍电子书的时候,往往有很多注释。在正文和注释之间来回滚动页面是一件挺麻烦的事,比较方便的做法是将它编辑成通过点击注释引用即将注释弹出显示在引用所在位置的HTML文档,然后利用HTML文档制作成PDF或者epub文件,就比较…

Harmony Next开发通过bindSheet绑定半模态窗口

示例概述 Harmony Next开发通过bindSheet绑定半模态窗口 知识点 半模态窗口父子组件传值 组件 LoginComponent Component struct LoginComponent {// Prop 父子单项绑定值Prop message:string // Link 父子双向绑定值Link userName:stringLink password:stringLink isSh…

codeforces一些题目思路复盘

codeforces round 919 dv2 C Partitioning the Array 大致题意,对于n约数i,我们把原数组分成份,并且每份中有i个元素,对于每个分组情况,如果存在一个数m使得数组中元素modm后使得每个部分的数组完全相同,如…

ElasticSearch 简介

一、什么是 ElastcSearch? ElasticSearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎。 1.1 ElasticSearh 的基本术语概念 index 索引 索引类似与 mysql 中的数据库,ES 中的索引是存储数据的地方,包含了一堆有相似结构的文档数据…

Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF

Latex代码中使用pdf图片,无法预览,提示: Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF 解决办法: 点击左边这个刷新下即可

测试工程师的职业规划

测试人员在管理上的发展 基层测试管理者:测试组长 工作内容:安排小组工作,提升小组成员测试能力,负责重要的测试工作。 负责对象:版本,项目 中层测试管理者:测试经理 负责对象&#xff1…

Linux系统下多任务管理器:screen使用指南

文章目录 安装快速入门启动Screen会话创建和管理窗口退出和恢复会话 高级功能多用户支持日志记录复制粘贴模式自定义配置 在Linux和类Unix系统的世界里,命令行是用于与系统交互的主要方式之一。然而,当涉及到远程服务器管理、长时间运行的任务或者同时处…

C缺陷与陷阱 — 8 编译与链接

目录 1 程序的编译过程 2 动态链接的优缺点 2.1 动态链接的优点 2.2 动态链接的缺点 2.3 只使用动态链接 3 函数库链接的5个特殊秘密 4 警惕Interpositioning 5 产生链接器报告文件 1 程序的编译过程 程序的编译过程是将源代码转换成计算机可以执行的机器代码的过程。…

Harmony Next开发Navigation页面跳转

概述 Harmony Next开发Navigation页面跳转 知识点 Navigation通过NavPathStack路由跳转Navigation以弹窗的方式打开NavDestination页面Menu配置 组件 NavTest Entry Component struct NavTest {Provide pageInfos: NavPathStack new NavPathStack()Builder PageMap(name…

大模型系列4--开源大模型本地部署到微调(WIP)

背景 一直想真正了解大模型对硬件资源的需求,于是准备详细看一篇视频,将核心要点总结记录下。本文内容参考视频:保姆级教程:6小时掌握开源大模型本地部署到微调,感谢up主 训练成本 训练 > 微调 > 推理训练GPT…

仿《公主连结》首页场景的制作(附资源包)

先看效果(主要实现点击按钮切换图片,未解锁按钮弹出提示,点击过后播放动画) 预备知识(单例模式,携程, Resources.Load加载资源的方式) 资源准备(底部按钮7个图标&#x…

Redis - 集合 Set 及代码实战

Set 类型 定义:类似 Java 中的 HashSet 类,key 是 set 的名字,value 是集合中的值特点 无序元素唯一查找速度快支持交集、并集、补集功能 常见命令 命令功能SADD key member …添加元素SREM key member …删除元素SCARD key获取元素个数SI…

基于Llamaindex的网页内容爬取实战

目的 本文不关注如何解析网页 html 元素和各种 python 爬虫技术,仅作为一种网页数据的预处理手段进行研究。Llamaindex 也并不是爬虫技术的集大成者,使用它是为了后续的存查一体化。 安装依赖 pip install llama-index-readers-web # pip install llam…

《九重紫》逐集分析鉴赏第一集(下)

主标题:《九重紫》一起追剧吧 副标题:《九重紫》逐集分析鉴赏第一集(下)/《九重紫》逐集分析鉴赏1 接上回分解,窦昭和宋墨都安置城外万佛寺 交谈没一会儿,天还未亮,兵临寺下 记住这个人&…

Introduction to NoSQL Systems

What is NoSQL NoSQL database are no-tabular非數據表格 database that store data differently than relational tables 其數據的存儲方式與關係型表格不同 Database that provide a mechanism機制 for data storage retrieval 檢索 that is modelled in means other than …

图论【Lecode_HOT100】

文章目录 1.岛屿数量No.2002.腐烂的橘子No.9943.课程表No.2074.实现Trie(前缀树)No.208 1.岛屿数量No.200 class Solution {public int numIslands(char[][] grid) {if (grid null || grid.length 0) {return 0;}int numIslands 0;int rows grid.len…

【深度学习量化交易9】miniQMT快速上手教程案例集——使用xtQuant获取基本面数据篇

我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~目前我正在开发基于miniQMT的量化交易系统。 在前几篇的文章中讲到,我正在开发的看海量化交易系统&#xf…