如何使用opencv正确叠加两个图像



我正在尝试在 JPG 图像上覆盖一个透明的 PNG,我不知何故无法让它工作,我尝试过:

import cv2
import numpy as np
a = cv2.imread("a.jpeg")
b = cv2.imread("b.png", cv2.IMREAD_UNCHANGED)
# add alpha channel to jpeg
(h, w) = a.shape[:2]
a = np.dstack([a, np.ones((h, w), dtype="uint8") * 0])
c = cv2.add(b,a)
cv2.imwrite("out.jpeg", c)

以下代码将合并两个图像,但 PNG 透明度不正确,它在某种程度上比应有的更不透明。(我读到这可能是opencv的问题?没有从png正确读取alpha(

我想做的是简单地将两个图像堆叠在另一个图像上,一个背景JPG并放在一个具有一些透明区域的PNG上,两个图像的大小相同。

谢谢!

我在 github 上找到了一个我修改了一下的例子,按预期工作:

import numpy as np
import cv2
img = cv2.imread('1_calib.jpeg')
overlay_t = cv2.imread('ol.png',-1) # -1 loads with transparency
def overlay_transparent(bg_img, img_to_overlay_t):
    # Extract the alpha mask of the RGBA image, convert to RGB 
    b,g,r,a = cv2.split(img_to_overlay_t)
    overlay_color = cv2.merge((b,g,r))
    mask = cv2.medianBlur(a,5)
    # Black-out the area behind the logo in our original ROI
    img1_bg = cv2.bitwise_and(bg_img.copy(),bg_img.copy(),mask = cv2.bitwise_not(mask))
    # Mask out the logo from the logo image.
    img2_fg = cv2.bitwise_and(overlay_color,overlay_color,mask = mask)
    # Update the original image with our new ROI
    bg_img = cv2.add(img1_bg, img2_fg)
    return bg_img
cv2.imshow('image',overlay_transparent(img, overlay_t))
cv2.waitKey(0)

最新更新