opencv——图片添加水印

server/2024/12/16 19:38:47/

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

1. 模板输入

其实,该组件起到的就是图片输入的功能,只不过使用模板输入所输入的图片其实是作为要添加的水印,有了水印的彩色图之后,我们需要用它来制作一个掩模,这就用到了灰度化和二值化,即先灰度化后二值化,这就得到了带有水印图案的掩模。

 2. 与运算


有了模板的掩膜之后(也就是二值化图),我们就可以在要添加水印的图像中,根据掩膜的大小切割出一个ROI区域,也就是我们要添加水印的区域,之后让其与模板的掩膜进行与运算,我们知道,与运算的过程中,只要有黑色像素,那么得到的结果图中的对应位置也会是黑色像素。由于模板的掩膜中目标物体的像素值为黑色,所以经过与运算后,就会在ROI区域中得到模板图的形状。

3. 图像融合

将模板的形状添加到水印区域之后,就可以将该图像与原始的模板图进行图像融合。该组件的目的就是将图像对应的数组中的对应元素进行相加(一定要注意这里的两个数组是规格相同的,也就是说要么都是灰度图,要么都是彩图),其过程如下图所示。

因此就可以让原始的模板图与添加模板图形状的ROI区域进行图像融合,得到添加水印的ROI区域。

 

cv2.bitwise_and(src1, src2, mask=None, dst=None)

功能:用于对两个数组(通常是图像)进行按位与(bitwise AND)操作的函数。

参数:

src1: 第一个输入数组(图像),它可以是单通道或多通道的。

src2: 第二个输入数组(图像),它必须与 src1 有相同的尺寸和类型,或者是可以与 src1 进行广播的数组。

mask: 操作掩码,这是一个可选参数。如果提供,它必须是一个单通道的二进制数组(即只包含 0 和 255 的值)。在运算过程中,只有当掩码对应位置的值为 255 时,src1 和 src2 对应位置的像素才会进行按位与运算;否则,结果数组在该位置的像素值将被设置为 0。

dst: 输出数组,这是一个可选参数。如果提供,运算结果将存储在这个数组中;如果未提供,函数将创建一个新的数组来存储结果。

dst、mask 和输入数组 src1、src2 可以有相同的大小和类型,或者 dst 和 mask 可以是原数组大小的一部分(这种情况下会进行广播)。

cv2.add(src1, src2, dst=None, mask=None, dtype=None)

功能:用于对两个数组(图像)进行逐元素相加操作的函数

参数:

src1: 第一个输入数组(图像)。

src2: 第二个输入数组(图像),它必须与 src1 有相同的尺寸和类型,或者可以与 src1 进行广播。

dst: 输出数组,这是一个可选参数。如果提供,运算结果将存储在这个数组中;如果未提供,函数将创建一个新的数组来存储结果。

mask: 操作掩码,这是一个可选参数。如果提供,它必须是一个单通道的二进制数组(只包含0和255的值,或者布尔数组)。在运算过程中,只有当掩码对应位置的值为255(或True)时,src1和src2对应位置的像素才会进行相加运算;否则,结果数组在该位置的像素值将保持不变(或者根据dtype参数可能被设置为其他值)。

dtype: 输出数组的可选深度(数据类型),当两个输入数组具有相同深度时,这个值将被忽略。它可以是-1,此时输出数组和输入数组有相同的深度,或者它可以是cv2.CV_8U、cv2.CV_16U、cv2.CV_32F等,用于指定输出数组的数据类型。

 

效果图 

 

import cv2
img = cv2.imread('../1iamge/test2.png')
logo = cv2.imread('../1iamge/test.jpg')logo_gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
ret,logo_binary = cv2.threshold(logo_gray,0,255,cv2.THRESH_BINARY_INV)
ROI = img[img.shape[0]-logo.shape[0]:img.shape[0],img.shape[1]-logo.shape[1]:img.shape[1]]
ROI_logo = cv2.bitwise_and(ROI,ROI,mask = logo_binary)
img_logo = cv2.add(ROI_logo,logo)
img[img.shape[0]-logo.shape[0]:img.shape[0],img.shape[1]-logo.shape[1]:img.shape[1]] = img_logo
cv2.imshow("img",img)
cv2.waitKey(0)


http://www.ppmy.cn/server/150709.html

相关文章

前端 mp4 视频改成 m3u8 流模式

前端 mp4 视频改成 m3u8 流模式 mp4 视频的问题 1、mp4 视频通常对应一个文件,播放时需要加载全部文件,消耗网络资源。如果用户从中间某个时间访问,也会从头开始下载,浪费服务器性能。 2、mp4 视频文件容易被用户下载到本地。有…

相机(Camera)硬件组成详解

简介:个人学习分享,如有错误,欢迎批评指正。 写在前面:可以去B站观看一些相机原理的视频来配合学习,这里推荐:推荐1,推荐2,推荐3 相机(Camera)是一种复杂的光…

绘图方式集合

1. 流程图 1.1 PlantUML 代码绘制流程图 1.1.1 简介 1.1.2 网站 你可以使用以下网站来将 PlantUML 代码转换成可视化的流程图: PlantUML 官方网站 网站地址:https://plantuml.com/plantuml此网站提供了一个在线工具,可以直接输入 PlantUM…

分享从零开始学习网络设备配置--任务6.4 使用高级ACL限制服务器端口防攻击

任务描述 某公司构建了互联互通的办公网。北京总部的网络核心使用一台三层路由器设备连接不同子网,构建企业办公网络。通过三层技术一方面实现办公网络互联互通,另一方面把办公网接入Internet网络。 公司在天津设有一分公司,使用三层设备的…

【反无人机目标检测与跟踪】DUT Anti-UAV数据集介绍

DUT Anti-UAV数据集是IEEE TITS 2023上大连理工大学团队提出的Vision-based Anti-UAV Detection and Tracking论文中提出的一个可见光反无人机检测与跟踪数据集。 因为反无人机目标检测与跟踪的数据集都比较少,因此这个数据集也非常宝贵。 这个数据集的链接如下 数…

NLP大模型学习总结

参考课程 【清华NLP】刘知远团队大模型公开课全网首发|带你从入门到实战-知乎 一、自然语言处理基础 1.1 自然语言处理的基本任务 让计算机理解人所说的文本 语音 词性标注:区分每个词名词、动词、形容词等词性命名实体的识别:名词的具体…

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台,就像是AI学习者和开发者的超级基地,这里不仅提供丰富的项目、模型和大模型体验,还有一大堆经典数据集任你挑。…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…