pytohn用OpenCV,为透明图叠加背景图

在上一篇文章《pytohn用Pillow或OpenCV删除图片某种颜色》中,将某种颜色删除后,可以得到透明的图片。经常要使用的情况,是将这个透明的图片,重新为其增加一个背景图片,这样就好看很多了。

下面是效果的三张图,第一张图是背景图,第二张图是透明图,第三张是叠加后的效果图。背景图进行了尺寸上的更改,让背景图跟透明图的尺寸是一致的,这样可以解决后续合并过程中的很多问题。

 直接上代码吧。

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):
    # 判断jpg图像是否已经为4通道
    if jpg_img.shape[2] == 3:
        jpg_img = add_alpha_channel(jpg_img)
    # 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
    alpha_png = png_img[y1:y2, x1:x2, 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[y1:y2, x1:x2, c]))
    return jpg_img


def Resize_cv2(img_file_name, img_png):
    imgFile = cv2.imread(img_file_name)
    newImg = cv2.resize(imgFile, (img_png.shape[1], img_png.shape[0]))
    return newImg


def put_png_to_jpg(img_jpg, img_png):
    img_png = cv2.imread(img_png, cv2.IMREAD_UNCHANGED)
    img_jpg = Resize_cv2(img_jpg, img_png)  # 变换大小跟透明图一样
    res_img = merge_img(img_jpg, img_png, 0, img_png.shape[0], 0, img_png.shape[1])
    cv2.imwrite("output6.jpg", res_img)


if __name__ == '__main__':
    put_png_to_jpg("example2.jpg", "output2.png")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值