OpenCV实验:图片加水印

server/2024/12/19 0:09:48/

第二篇:图片添加水印(加 logo)


1. 实验原理

水印原理

  • 图片添加水印是图像叠加的一种应用,分为透明水印不透明水印
  • 水印的实现通常依赖于像素值操作,将水印图片融合到目标图片中,常用的方法包括:
    • 位运算:通过掩码(Mask)将目标区域清空,再将水印叠加到清空的区域。
    • Alpha 混合(Alpha Blending):通过加权计算将水印半透明地融合到目标图片。

步骤

  1. 将水印图片转为灰度图,并通过阈值处理生成二值化掩码。
  2. 利用掩码清空背景图像中水印位置的区域。
  3. 将水印图片嵌入到清空区域,完成水印添加。

2. 实验代码

以下为具体代码实现:

import cv2# 读取背景图像
img = cv2.imread("./background.jpeg")# 读取两个 logo 图像
logo = cv2.imread("./logo.png")# --------------------处理第一个 logo--------------------# 将 logo 转换为灰度图像,用于后续的二值化处理
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)# 对灰度图像进行二值化处理,生成二值掩码
_, logo_binary = cv2.threshold(logo_gray,             # 输入的灰度图像0,                     # 阈值(自动确定)255,                   # 二值化后的最大值cv2.THRESH_BINARY_INV  # 反阈值化,将前景变为黑色,背景变为白色
)# 定义第一个 logo 的插入位置 (x1, y1)
x1, y1 = 10, 100# 从背景图中截取一个与 logo 大小相同的 ROI(Region of Interest)区域
ROI = img[y1:y1+logo.shape[0], x1:x1+logo.shape[1]]# 使用掩码进行位与运算,将 ROI 中对应 logo 的位置清空
ROI_logo = cv2.bitwise_and(ROI, ROI, mask=logo_binary)# 将清空的 ROI 区域与 logo 图像进行加法操作,完成 logo 的融合
img_logo = cv2.add(ROI_logo, logo)# 将融合后的 logo 替换回背景图的对应位置
img[y1:y1+logo.shape[0], x1:x1+logo.shape[1]] = img_logo# --------------------显示最终结果--------------------# 显示最终结果图像
cv2.imshow('image', img)# 等待用户按键退出窗口
cv2.waitKey(0)# 销毁所有窗口
cv2.destroyAllWindows()

3. 实验现象

实验结果

  1. 原始图片:背景图为一个没有水印的图片。
  2. 水印图像:Logo 被叠加到背景图的指定位置,与背景图的像素融合,看起来像是原始图像的一部分。

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

相关文章

FFmpeg 音视频基础

文章目录 视频基础视频图像RGB颜色空间YUV颜色空间YUV种类YUV4:4:4YUV4:2:2YUV4:2:0YUV存储格式RGB与YUV相互转换 分辨率位深帧率码流步幅(stride) 音频基础采样位深采样率通道数PCM音频大小计算比特率音频码率音频帧音频帧的存储模式 音频编码原理频域掩…

《深入探究:C++ 在多方面对 C 语言实现的优化》

目录 一、C 在 C 上进行的优化二、C 关键字(C 98)三、C 的输入输出1. cin 和 cout 的使用2. cin、cout 和 scanf()、printf() 的区别 三、命名空间1. 命名空间的使用2. 嵌套命名空间3. 在多个头文件中使用相同的命名空间 四、函数缺省值1. 缺省值的使用2…

游戏引擎学习第50天

仓库: https://gitee.com/mrxiao_com/2d_game Minkowski 这个算法有点懵逼 回顾 基本上,现在我们所处的阶段是,回顾最初的代码,我们正在讨论我们希望在引擎中实现的所有功能。我们正在做的版本是初步的、粗略的版本,涵盖我们认…

GIN

gin是什么 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。 特点:gin是golang的net/http库封装的web框架,api友好,注…

用于日语词汇学习的微信小程序+ssm

日语词汇学习小程序是高校人才培养计划的重要组成部分,是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。本学生所在学院多采用半手工管理日语词汇学习小程序的方式,所以有必要开发日语词汇…

scala基础_数据类型概览

Scala 数据类型 下表列出了 Scala 支持的数据类型: 类型类别数据类型描述Scala标准库中的实际类基本类型Byte8位有符号整数,数值范围为 -128 到 127scala.Byte基本类型Short16位有符号整数,数值范围为 -32768 到 32767scala.Short基本类型I…

ctfshow-文件包含

78-php&http协议 GET传参,参数为file,没有过滤,直接包含 解法一(filter) payload: ?filephp://filter/readconvert.base64-encode/resourceflag.php得到一串base64,解码之后则为flag.php的内容 解法二…

C++小工具封装 —— NetWork(TCP、UDP)

在之前的文章中我们介绍到也写到基于TCP和UDP协议的网络通信。本篇我们又闲得无聊把这俩给封装成一个小工具以满足实际应用时多功能网络服务器的需要。 这个NetWork小工具是在Windows下制作的所以别忘了该有的头文件。C中编写我们就遵循面向对象的思想来。 #ifndef NETWORK_H …