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

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

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

pytohn用OpenCV,为透明图叠加背景图_第1张图片 pytohn用OpenCV,为透明图叠加背景图_第2张图片 pytohn用OpenCV,为透明图叠加背景图_第3张图片

 直接上代码吧。

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")

你可能感兴趣的:(图片处理,python,python)