【Python入门教程】OpenCV在图片/视频上添加Logo(水印)

发布时间 2023-11-21 17:16:10作者: RS迷途小书童

         还是老样子,最近项目需要在视频上添加logo,所以就找了一下相关资料,然后写了一段代码,今天给大家分享一下如何使用Python的OpenCV库给图片或视频添加水印和logo。

一、导入库

        OpenCV库导入的时候是cv2

import cv2

二、代码部分

2.1 基础逻辑

  1. 通过二值化阈值筛选出需要的Logo部分
  2. 将logo部分制作成掩膜
  3. 使用掩膜和logo范围提取图片的背景
  4. 使用反向掩膜提取需要的logo部分
  5. 将背景和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视频分解成图片+图片组合成视频(视频抽帧组帧)