当前位置: 首页 > article >正文

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

        还是老样子,最近项目需要在视频上添加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视频分解成图片+图片组合成视频(视频抽帧组帧)


http://www.kler.cn/a/137155.html

相关文章:

  • Android -- 双屏异显之方法二
  • react 项目打包二级目 使用BrowserRouter 解决页面刷新404 找不到路由
  • 南城云趣:智能云平台,杜绝电动车充电安全隐患
  • Linux线程同步
  • QNX通过pfctl工具查看socket通信状态
  • POD 存储、PV、PVC
  • 云ES容灾方案
  • “茶叶创新:爆改营销策略,三个月狂销2300万“
  • 酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?
  • “一键导出,高效整理:将之前的部分记录导出!“
  • 如何保障亚马逊多账户的安全,防止关联?
  • 福州大学《嵌入式系统综合设计》实验四:边缘检测
  • Leetcode84(柱状图中最大的矩形)
  • 设计模式-12-策略模式
  • 最新最全系列之Selenium:传入webdriver驱动的新方法 Service()函数;以前的executable_path报警告,即将弃用
  • C/C++杂谈-printf的可变参数机制
  • C# 电脑程序控制电路开关
  • 局域网内Ubuntu上搭建Git服务器
  • 通过css设置元素隐藏和显示
  • UEC++ day6
  • C#使用MaxMind.GeoIP2数据库查询当前ip地址
  • Rockchip Clock
  • 外卖小程序系统:数字化餐饮的编码之道
  • 1. 基础语法
  • java发送媒体类型为multipart/form-data的请求
  • 2022最新版-李宏毅机器学习深度学习课程-P51 BERT的各种变体