09篇--图片的水印添加(掩膜的运用)

如何添加水印?

添加水印其实可以理解为将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图,并进行二值化处理,去除背景部分,得到一个类似掩膜的图像。然后将这个二值化图像与另一张图片中要添加水印的区域进行“与”运算,使得目标物体的形状出现在要添加水印的区域。最后,将得到的目标物体图像与要添加水印的区域进行相加,就完成了添加水印的操作。这样可以实现将一个图像中的某个物体或图案叠加到另一个图像上,从而实现添加水印的效果。

何为掩膜?

掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改

没听懂没关系,下面开始详细介绍

示例演示

将准备好的logo图作为水印模板,本篇以下图作为水印模板与目标模板

注: 本示例以白底的水印模板演示,所以我们需要准备一张黑底的掩膜(目标区域位为白色) 

        黑底的水印模板则不需要多准备一张黑底的掩膜,直接从下面第二步开始即可

如果你是在分不清要准备什么底的掩膜,那就都准备吧,两个掩膜都试一试

第一步

首先我们需要先将颜色空间转换成HSV,再制造一个掩膜(目标区域为黑色,后面要进行与运算)用来确定logo的范围。

方法一:水印模板上出现了两种颜色,所以要制作两个掩膜,再将两个掩膜合为一个掩膜(或运算),这样就可以筛选水印模板中的所有logo信息,掩膜如下:
 

但直接调用接口制作的掩膜(如上图)中,目标区域是白色的,如果你需要的是目标区域为黑色的掩膜,建议用下面的第二种方法,直接得到目标区域为黑色的掩膜

方法二:掩膜本身也就是一个二值化的二维数组,我们也可以对原图灰度化后在进行二值化,得到的结果如下,二值化后的图(右侧)也可以用做掩膜使用。

 第二步

在目标模板上利用ROI切割出自己想要的区域(你想将水印添加的区域),ROI切割可以参照我之前的文章              

 06篇--图片目标区域的 ROI切割-CSDN博客

第三步

掩膜目标模板进行与运算,之后:

  • 掩膜(白色部分)会目标模板(相应的部分)替代
  • 掩膜(黑色部分)会目标模板(相应的部分)替代

得到的结果与切割部分进行对比:

将切割出来的部分img_roi掩膜进行与运算,之后:

  • 掩膜(白色部分)会目标模板(相应的部分)替代
  • 掩膜(黑色部分)会目标模板(相应的部分)替代

得到的结果与切割部分进行对比:

第四步

就是将图像对应的数组中的对应元素进行相加(一定要注意这里的两个数组是规格相同的,也就是说要么都是灰度图,要么都是彩图),其过程如下图所示

cv2.add()函数,用于执行上面的过程,可得到如下结果

第五步

将已经融合好的部分替换掉目标模板中的相应部分(被切割的那一部分),利用切片进行。

  

 如果还是对上述步骤有疑问,欢迎在评论区提问。

 代码演示

import cv2
import numpy as np#读取图像
logo = cv2.imread('image/logo_1.png')
img = cv2.imread('image/logo_demo.png')#第一种方法获取掩膜
#先转换颜色空间
logo_hsv = cv2.cvtColor(logo,cv2.COLOR_BGR2HSV)#制作红色掩膜
red_min= np.array([0,43,46])
red_max = np.array([10,255,255])
logo_mask_1_1 = cv2.inRange(logo_hsv,red_min,red_max)#制作黑色掩膜
black_min = np.array([0,0,0])
black_max = np.array([180,255,220])
logo_mask_1_2 = cv2.inRange(logo_hsv,black_min,black_max)#将两个掩膜合并
logo_mask_1 = cv2.bitwise_or(logo_mask_1_1,logo_mask_1_2)#第二种方法获取掩膜
#灰度化
logo_gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
#二值化结果充当掩膜
_,logo_mask_2 = cv2.threshold(logo_gray,127,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
#获取掩膜大小
rows,cols = logo.shape[:2]#ROI切割
#要切割的矩形的top_left的坐标点
x1,y1 = 750,425
def ImgRoi(img,x1,y1):# 提取该图片的宽高h,w = img.shape[0], img.shape[1]#获取掩膜坐标,x2,y2x2 = x1 + colsy2 = y1 + rowsif x1<0 or x2>w or y1<0 or y2>h:print("要切割的区域是不合适的")else:# 给要切割的内容画个框# cv2.rectangle(img, (x1-2, y1-2), (x2+2, y2+2), (0, 0, 255), 2)# 保存要切割的内容img_roi = img[y1:y2, x1:x2]return img_roiimg_roi = ImgRoi(img,x1,y1)# 进行与运算
logo_mask = cv2.bitwise_and(logo,logo,mask=logo_mask_1)
img_roi_mask = cv2.bitwise_and(img_roi,img_roi,mask=logo_mask_2)#进行相加,得到融合的图像img_roi_mask,并合并到img中
img_roi_logo = cv2.add(img_roi_mask,logo_mask)
img[y1:(y1+rows), x1:(x1+cols)] = img_roi_logocv2.imshow('logo_mask',img)cv2.waitKey(0)

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

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

相关文章

封装数组去重的方法

前言 之前在工作中我一直在用lodash这个方法库&#xff0c;前段时间又接触了更现代化的方法库radash&#xff0c;这两个方法库可以说是各有优劣&#xff0c;lodash中有很实用的cloneDeep&#xff0c;radash中则有tryit、all等异步方法&#xff0c;它们都无法做到完全代替对方。…

前端成长之路:CSS复合选择器

复合选择器 在CSS中&#xff0c;可以根据选择器的类型将选择器分为基础选择器和复合选择器。 基础选择器就是前面提到过的类选择器、id选择器、标签选择器等&#xff1b;而复合选择器就是在基础选择器的基础之上&#xff0c;将基本选择器进行组合形成的。 复合选择器是由两个及…

在数字孪生开发领域threejs现在的最新版本已经更新到多少了?

在数字孪生开发领域three.js现在的最新版本已经更新到多少了&#xff1f; 在数字孪生开发领域&#xff0c;three.js作为一款强大的JavaScript 3D库&#xff0c;广泛应用于Web3D可视化、智慧城市、智慧园区、数字孪生等多个领域。随着技术的不断进步和需求的日益增长&#xff0…

HTML入门级学习笔记1【超详细】

目录 一、计算机基础知识 2.1 文件和文件夹管理 2.2 特殊按键和快捷键 2.3 打字速度 二、互联网的原理 3.1 上网就是请求数据 3.2 服务器 3.3 浏览器 3.4 HTTP 三、HTML初步认识 4.1 认识什么是纯文本文件txt 4.2 HTML是负责描述文档语义的语言 四、Sublime 五、HTML骨架和基本…

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.传输层协议 UDP 1.1 传输层 1.2 端口号 1.3 UDP 协议 1.3.1 UDP 协议端格式 1.3.2 UDP 的特点 1.3.3 面向数据报 1…

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点&#xff0c;称为“节点”&#xff1b;将通信线路抽象为线&#xff0c;称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…

SecureCRT/FX使用[无限试用SecureCRT][新版本SecureFX双击站点总是自动跳到SecureCRT]

无限试用SecureCRT 本文摘录于&#xff1a;https://blog.csdn.net/qq_52162404/article/details/139703993#:~:textSecureCRT只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 我这里修改BAT如下,同时删除CRT和FX的license: echo off re…

Nacos系列:Nacos 控制台手册

引言 Nacos是阿里巴巴中间件部门开源的一款用于服务发现和配置管理的产品&#xff0c;Nacos 控制台主要旨在于增强对于服务列表、健康状态管理、服务治理、分布式配置管理等方面的管控能力&#xff0c;以便进一步帮助用户降低管理微服务应用架构的成本。 一、访问 Nacos 控制台…

frida打印日志字体加颜色

平时写frida hook 脚本&#xff0c;有时打印出来的日志太多都是一个颜色不美观。 于是找AI 问了一下frida打印日志字体加颜色的方法 // ANSI 转义码 const RESET “\x1b[0m”; const RED “\x1b[31m”; const GREEN “\x1b[32m”; const YELLOW “\x1b[33m”; const BLUE …

Thunderfury, Blessed Blade of the Windseeker

Thunderfury, Blessed Blade of the Windseeker 雷霆之怒&#xff0c;逐风者的祝福之剑 她应该是wow里面造型最帅&#xff0c;最酷的模型超大武器&#xff0c;而且特效触发频率很高&#xff0c;群拉效果非常好。 雷霆之怒&#xff0c;逐风者的祝福之剑 - 物品 - NFU魔兽世界1…

ubuntu+ros新手笔记(三)

系统ubuntu22.04 ros2 humble 1. 设置ubuntu终端字体大小 点击Terminal右上角的三条横线—>Preferences—>Unnamed—>Text—>勾选Custom font—>点击右侧的字号&#xff08;我的显示的是12&#xff09;—>最下方Size处设置字号大小—>Select—>设置完…

Deveco报错Only files in a module can be previewed

创建工程后需要看看预览的效果&#xff0c;却出现了这个错误 到Index.ets文件下重新构建工程 详细可以查询 鸿蒙报错&#xff08;Only files in a module can be previewed&#xff09;

第六届地博会开幕,世界酒中国菜美食文化节同期启幕推动地标发展

第六届知交会暨地博会开幕&#xff0c;辽黔欧三地馆亮点纷呈&#xff0c;世界酒中国菜助力地理标志产品发展 第六届知交会暨地博会盛大开幕&#xff0c;多地展馆亮点频出&#xff0c;美食文化节同期启幕推动地标产业发展 12月9日&#xff0c;第六届粤港澳大湾区知识产权交易博…

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

C# 探险之旅:第二十七节 - 类型class(属性) —— 给你的类穿上“属性”的外衣

嘿&#xff0c;探险家们&#xff01;欢迎再次踏上我们的C#奇幻之旅。今天&#xff0c;我们要聊聊一个超级有趣的话题——类的“属性”。想象一下&#xff0c;如果我们要给类穿上一件酷炫的外衣&#xff0c;那属性就是这件外衣上的各种口袋和装饰&#xff0c;让类变得既实用又拉…

【学习记录】Docker初探-容器创建与拉取(2)

参考资料 Window下玩转Docker Desktop哔哩哔哩bilibili Docker镜像推送至Docker Hub的完整教程-百度开发者中心 (baidu.com) 为什么需要Docker&#xff1f; Docker可以在不同服务器之间转移打包好的程序和环境&#xff0c;从而方便测试。打包好的程序和环境可以被称之为容器…

MongoDB学习路线图

‌MongoDB 在多种场景下都是理想的数据库解决方案。让我们讨论一些你应该考虑使用 MongoDB 的关键情形。 处理大量数据 当处理可能需要大量读写操作的大量数据时&#xff0c;MongoDB 是一个出色的选择&#xff0c;因为它具有高性能和水平扩展性。通过利用复制和分片&#xff…

IOS通过WDA自动化中遇到的问题

IOS自动化遇到的问题 搭建WDA环境中遇到的问题1、XCode unsupport iphone xxx.2、创建Bundle Identifier出现问题&#xff1a;Communication with Apple failed3、创建Bundle Identifier出现问题&#xff1a;Automatic signing failed \Signing certificate is invalid4、创建B…

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程&#xff0c;说白了&#xff0c;就是期望能通过一个程序判断一张图片是否为某个物体&#xff0c;或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题&#xff0c;因此主要处理 是 与 不是 的问题&#xff0c;比如我的模型是判断一张图片是否为苹果…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…