首页 > 其他分享 >用opencv给一张透明图片添加背景

用opencv给一张透明图片添加背景

时间:2023-06-22 23:35:09浏览次数:32  
标签:透明 img cv2 jpg opencv shape 添加 channel png

# -*- coding: utf-8 -*-
import cv2
import numpy as np


def add_alpha_channel(img):
    """ 为jpg图像添加alpha通道 """

    b_channel, g_channel, r_channel = cv2.split(img)  # 剥离jpg图像通道
    alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道

    img_new = cv2.merge((b_channel, g_channel, r_channel, alpha_channel))  # 融合通道
    return img_new


def merge_img(jpg_img, png_img, y1, y2, x1, x2):
    """ 将png透明图像与jpg图像叠加
        y1,y2,x1,x2为叠加位置坐标值
    """

    # 判断jpg图像是否已经为4通道
    if jpg_img.shape[2] == 3:
        jpg_img = add_alpha_channel(jpg_img)

    '''
    当叠加图像时,可能因为叠加位置设置不当,导致png图像的边界超过背景jpg图像,而程序报错
    这里设定一系列叠加位置的限制,可以满足png图像超出jpg图像范围时,依然可以正常叠加
    '''
    yy1 = 0
    yy2 = png_img.shape[0]
    xx1 = 0
    xx2 = png_img.shape[1]

    # if x1 < 0:
    #     xx1 = -x1
    #     x1 = 0
    # if y1 < 0:
    #     yy1 = - y1
    #     y1 = 0
    # if x2 > jpg_img.shape[1]:
    #     xx2 = png_img.shape[1] - (x2 - jpg_img.shape[1])
    #     x2 = jpg_img.shape[1]
    # if y2 > jpg_img.shape[0]:
    #     yy2 = png_img.shape[0] - (y2 - jpg_img.shape[0])
    #     y2 = jpg_img.shape[0]

    # 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
    alpha_png = png_img[yy1:yy2, xx1:xx2, 3] / 255.0
    alpha_jpg = 1 - alpha_png

    # 开始叠加
    for c in range(0, 3):
        jpg_img[y1:y2, x1:x2, c] = ((alpha_jpg * jpg_img[y1:y2, x1:x2, c]) + (alpha_png * png_img[yy1:yy2, xx1:xx2, c]))

    return jpg_img


if __name__ == '__main__':
    # 定义图像路径
    img_jpg_path = 'img/3.jpg'  # 读者可自行修改文件路径
    img_png_path = 'img/3.png'  # 读者可自行修改文件路径

    # 读取图像
    img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)
    img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)

    # 设置叠加位置坐标
    x1 = 0
    y1 = 0
    x2 = x1 + img_png.shape[1]
    y2 = y1 + img_png.shape[0]

    # 开始叠加
    res_img = merge_img(img_jpg, img_png, y1, y2, x1, x2)

    # 显示结果图像
    # cv2.imshow('result', res_img)

    # 保存结果图像,读者可自行修改文件路径
    cv2.imwrite('img/res.jpg', res_img)

    # 定义程序退出方式:鼠标点击显示图像的窗口后,按ESC键即可退出程序
    if cv2.waitKey(0) & 0xFF == 27:
        cv2.destroyAllWindows()

 

标签:透明,img,cv2,jpg,opencv,shape,添加,channel,png
From: https://www.cnblogs.com/wukai66/p/17498567.html

相关文章

  • 前端怎么使用node-input-validator给接口添加参数校验(以strapi 4.9为例)
    node-input-validator是什么?简称NIV(NodeInputValidator)用于node.js的验证库使用它可以扩展库以添加自定义规则。npmNIV文档使用方法我们以strapi4.9版本项目为例,来试用一下它对我们接口的校验规则下载依赖npminode-input-validator在项目中创建全局中间件......
  • linux 中文件添加行号(排除空行)
     001、利用cat命令给文件添加行号[root@PC1test01]#lsa.txt[root@PC1test01]#cata.txt##测试文件abcd0123[root@PC1test01]#cat-na.txt##-n选项,给文件添加行号,包括空行1abcd2340123[root@......
  • 添加一段代码,让你的网站在微信QQ提示使用浏览器访问
    <script>//跳转提示if(is_weixn_qq()){;window.location.href='https://c.pc.qq.com/middle.html?pfurl='+window.location.href;}functionis_weixn_qq(){//判断当前是否微信/QQ浏览器varua=navigator.userAgent;varisWeixin=!!/MicroMessenger/i.test......
  • opencv学习笔记(八)
    图像轮廓:用于识别和提取图像中物体的边界或轮廓信息。轮廓是由连续的边缘像素点组成的曲线,表示了物体在图像中的外形。常用方法:1、预处理:首先,对图像进行预处理,例如:灰度化、滤波、二值化,以便更好地分离物体和背景;2、边缘检测:使用边缘检测算法(例如canny边缘检测)在预处理后......
  • opencv学习笔记(七)
    图像金字塔:用于图像的分辨率降低。它通过连续的图像平滑和下采样操作来生成一系列分辨率逐渐降低的图像。构建过程:1、将原始图像作为底层2、应用高斯滤波器对当前的图像进行平滑处理,以减少图像中的高频细节。高斯滤波器通过卷积运算在图像上进行平滑操作,使得图像变得更......
  • centos7中 给docker添加镜像加速器
     001、查看当前的镜像加速地址[root@PC1test01]#dockerinfo|tail 002、进入阿里云官网:https://www.aliyun.com/?spm=5176.8351553.top-nav.dlogo.47f41991k7oEMl 003、 004、点击产品 005、点击容器 006、点击容器镜像服务ACR  007、点击管理......
  • opencv学习笔记(六)
    Canny边缘检测:图片必须先转换为灰度图像主要步骤:1、噪声抑制:使用高斯滤波器,对图像进行平滑处理;2、计算梯度:计算每个像素点的梯度强度和方向;3、非极大值抑制:在梯度方向上,对梯度幅值进行非极大值抑制,保留局部最大值点作为候选边缘;4、双阈值检测:根据设定的高阈......
  • 人工智能透明度与数据隐私的平衡:实践和解决方案
    目录1.引言2.技术原理及概念标题:30.《人工智能透明度与数据隐私的平衡:实践和解决方案》随着人工智能技术的发展和应用,数据隐私和透明度已经成为了越来越重要的话题。如何平衡这两个方面的需求,使得人工智能技术能够更好地服务于人类社会,成为了一个需要深入思考和探讨的问题。在......
  • 让人工智能系统具有透明度:为什么这是一个关键问题
    目录文章标题:《让人工智能系统具有透明度:为什么这是一个关键问题》引言随着人工智能技术的快速发展,越来越多的应用场景需要让人工智能系统具有透明度。然而,由于人工智能系统的复杂性和黑盒性质,透明度成为一个重要的挑战。本文将介绍人工智能技术中的透明度,并讨论为什么这是一个......
  • opencv学习笔记(五)
    Sobel算子:Sobel算子是一种常用的图像梯度算子,用于检测图像中的边缘。它基于离散的差分运算,通过计算图像在水平和垂直方向上的梯度来确定边缘的强度和方向。importcv2importnumpyasnp#读取图像image=cv2.imread('input.jpg',cv2.IMREAD_GRAYSCALE)#计算水平方向......