【Python入门教程】OpenCV在图片/视频上添加Logo(水印)
还是老样子,最近项目需要在视频上添加logo,所以就找了一下相关资料,然后写了一段代码,今天给大家分享一下如何使用Python的OpenCV库给图片或视频添加水印和logo。
一、导入库
OpenCV库导入的时候是cv2
import cv2
二、代码部分
2.1 基础逻辑
- 通过二值化阈值筛选出需要的Logo部分
- 将logo部分制作成掩膜
- 使用掩膜和logo范围提取图片的背景
- 使用反向掩膜提取需要的logo部分
- 将背景和logo叠加显示到原图上
2.2 完整代码
这里我做了三个入参,图片地址、logo地址、logo放缩的尺寸。logo放在左上角,尺寸视情况自己修改。
# -*- coding: utf-8 -*-
"""
@Time : 2023/10/20 17:34
@Auth : RS迷途小书童
@File :Image_Add_Logo.py
@IDE :PyCharm
@Purpose:图片/视频添加水印
"""
import cv2
def Image_add_logo(image_path, logo_path, size=(403, 161)):
image1 = cv2.imread(image_path)
image2 = cv2.imread(logo_path)
image2 = cv2.resize(image2, size)
rows, cols, channels = image2.shape
# 获取logo的行列、通道数
roi = image1[0:rows, 0:cols]
# 从image1中切割出一个与image2大小相同的区域,作为ROI(Region of Interest)
image2gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# 将image2转化为灰度图像,以便于进行阈值化处理
ret, mask = cv2.threshold(image2gray, 254, 255, cv2.THRESH_BINARY)
# ret阈值被忽略,mask二值化图像。大于254的值赋值为255,小于254的值赋值为0
mask_reverse = cv2.bitwise_not(mask)
# 按位取反操作,0变255,255变0
image1_background = cv2.bitwise_and(roi, roi, mask=mask)
# 按位与操作,保留掩膜之后的背景
image2_logo = cv2.bitwise_and(image2, image2, mask=mask_reverse)
# 按位与操作,保留掩膜之后的logo
result = cv2.add(image1_background, image2_logo)
# 将背景和logo叠加
image1[0:rows, 0:cols] = result
# 将新的图像覆盖到原图像image1的相应位置
# cv2.imshow("Image", image1) # 显示叠加图像
# cv2.waitKey(0)
cv2.destroyAllWindows()
return image1
if __name__ == "__main__":
Image = r"G:\Neat Download Manager\Compressed\video/100000022.png"
Logo = r"G:\Neat Download Manager\Compressed\video/logo.png"
Size = (604, 242)
image = Image_add_logo(Image, Logo, Size)
三、总结
这个博文没有写如何在视频中添加logo,因为原理是一样的。cv2库在读取视频时就是逐帧读取,所以本质就是图片,我之前已经发过如何使用OpenCV库将视频拆帧成图片,然后如何用图片生成视频,所以这里就不分享了。只要大家将这两篇博文的内容组合一下,就可以实现视频添加Logo,链接:基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)