Python 基于图像掩码的OpenCV overlay 2图像

Python 基于图像掩码的OpenCV overlay 2图像,python,opencv,Python,Opencv,我需要覆盖2个基于第三个图像遮罩的图像 范例 -我有这个背景 2.-我有这个对象图像,还有反分割图像 对象图像 我正在尝试基于第三个图像(遮罩图像)合并背景图像和对象图像 (遮罩图像) 最终结果是背景图像+对象图像(仅基于遮罩) 任何想法。。 我试过了 但是没有按预期的那样工作。。有什么建议吗?谢谢 您需要将对象图像转换为RGBA图像,其中alpha通道是您创建的遮罩图像。完成此操作后,可以将其粘贴到背景图像 def convert_to_png(img, a): #alpha a

我需要覆盖2个基于第三个图像遮罩的图像

范例 -我有这个背景

2.-我有这个对象图像,还有反分割图像

对象图像

我正在尝试基于第三个图像(遮罩图像)合并背景图像和对象图像

(遮罩图像)

最终结果是背景图像+对象图像(仅基于遮罩) 任何想法。。 我试过了


但是没有按预期的那样工作。。有什么建议吗?谢谢

您需要将对象图像转换为RGBA图像,其中alpha通道是您创建的遮罩图像。完成此操作后,可以将其粘贴到背景图像

def convert_to_png(img, a):
    #alpha and img must have the same dimenstons

    fin_img = cv2.cvtColor(img, cv2.COLOR_RGB2RGBA)
    b, g, r, alpha = cv2.split(fin_img)
    alpha = a
#    plt.imshow(alpha);plt.title('alpha image');plt.show()
#    plt.imshow(img);plt.title('original image');plt.show()
#    plt.imshow(alpha);plt.title('fin alpha image');plt.show()
    fin_img[:,:, 0] = img[:,:,0]
    fin_img[:,:, 1] = img[:,:,1]
    fin_img[:,:, 2] = img[:,:,2]
    fin_img[:,:, 3] = alpha[:,:]
#    plt.imshow(fin_img);plt.title('fin image');plt.show()
    return fin_img
此功能将两个图像合并为RGBA图像

y1, y2 = new_loc[1], new_loc[1] + img.shape[0]
x1, x2 = new_loc[0], new_loc[0] + img.shape[1]

alpha_s = img[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s

for c in range(0, 3):
    fin_img[y1:y2, x1:x2, c] = (alpha_s * img[:, :, c] +
                              alpha_l * img[y1:y2, x1:x2, c])

这会将对象图像复制到背景图像中

您需要将对象图像转换为RGBA图像,其中alpha通道是您创建的遮罩图像。完成此操作后,可以将其粘贴到背景图像

def convert_to_png(img, a):
    #alpha and img must have the same dimenstons

    fin_img = cv2.cvtColor(img, cv2.COLOR_RGB2RGBA)
    b, g, r, alpha = cv2.split(fin_img)
    alpha = a
#    plt.imshow(alpha);plt.title('alpha image');plt.show()
#    plt.imshow(img);plt.title('original image');plt.show()
#    plt.imshow(alpha);plt.title('fin alpha image');plt.show()
    fin_img[:,:, 0] = img[:,:,0]
    fin_img[:,:, 1] = img[:,:,1]
    fin_img[:,:, 2] = img[:,:,2]
    fin_img[:,:, 3] = alpha[:,:]
#    plt.imshow(fin_img);plt.title('fin image');plt.show()
    return fin_img
此功能将两个图像合并为RGBA图像

y1, y2 = new_loc[1], new_loc[1] + img.shape[0]
x1, x2 = new_loc[0], new_loc[0] + img.shape[1]

alpha_s = img[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s

for c in range(0, 3):
    fin_img[y1:y2, x1:x2, c] = (alpha_s * img[:, :, c] +
                              alpha_l * img[y1:y2, x1:x2, c])
这将把目标图像复制到背景图像

def get_only_object(img, mask, back_img):
    fg = cv2.bitwise_or(img, img, mask=mask)        
    #imshow(fg)
    # invert mask
    mask_inv = cv2.bitwise_not(mask)    
    #fg_back = cv2.bitwise_or(back_img, back_img, mask=mask)
    fg_back_inv = cv2.bitwise_or(back_img, back_img, mask=mask_inv)
    #imshow(fg_back_inv)
    final = cv2.bitwise_or(fg, fg_back_inv)
    #imshow(final)

    return final
解决


公平警告:这将适用于所有图像具有相同尺寸的情况。如果这是您的用例,那么这将是一个很好的解决方案!记住你可以自己接受你的答案:)公平警告:这适用于所有图像尺寸相同的情况。如果这是您的用例,那么这将是一个很好的解决方案!记住你可以自己接受你的答案:)