OpenCV оверлей 2 изображение на основе маски изображения - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно наложить 2 изображения на основе третьей маски изображения

Пример 1.-У меня есть этот фон

background

2.-У меня есть это изображение объекта, а также у меня есть изображение сегментации

изображение объекта enter image description here

Я пытаюсь объединить изображение Backgound и Object на основе третьего изображения (маскирующего изображения)

(изображение маски) enter image description here

Окончательный результат - Фоновое изображение + Изображение объекта (только на основе маски). Любая идея.. Я пытался

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

Но не работает, как ожидалось. Любое предложение? спасибо!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Решено

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
0 голосов
/ 03 апреля 2019

Вам необходимо преобразовать изображение объекта в изображение RGBA, где альфа-канал - это изображение маски, которое вы создали. Сделав это, вы можете вставить его в фоновое изображение.

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

И это скопирует изображение объекта на фоновое изображение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...