Angel Lordan
Angel Lordan

Reputation: 121

OpenCV overlay 2 image based on image mask

I need overlay 2 images based on third image mask

Example 1.-I have this background

background

2.-I have this object image and also i have de segmentation image

Object image enter image description here

I'm try to merge Backgound and Object image based on third image (mask image)

(mask image) enter image description here

The final result is Background image + Object image(only based on mask) Any idea.. I tried

import cv2
added_image = cv2.addWeighted(back_img,0.4,aug_demoimage,0.1,0)

But not working as expected.. any sugestion? thanks!

Upvotes: 1

Views: 7337

Answers (2)

Angel Lordan
Angel Lordan

Reputation: 121

Solved

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

Upvotes: 3

Shawn Mathew
Shawn Mathew

Reputation: 2337

You need to convert the object image into an RGBA image where the alpha channel is the mask image you have created. Once you do this, you can paste it to the background image.

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

This function will combine the two images into an RGBA image.

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

And this will copy the Object image to the background image

Upvotes: 1

Related Questions