Заменить маску оригинальным изображением opencv Python

Я пытаюсь заменить объекты, которые я нашел с помощью маски, исходными пикселями изображения. У меня есть маска, которая показывает черный, где объект не обнаружен и белый, если обнаружен. Затем я использую изображение в утверждении, где

image[np.where((image2 == [255,255,255].any(axis = 2)) 

Я застрял здесь и понятия не имею, как изменить найденные значения белого на исходное изображение (чтобы использовать его вместе с другими масками). я пытался image.shape и это не сработало.

Благодарю.

3 ответа

Решение

Сделайте копию маски и затем нарисуйте исходное изображение поверх белых пикселей маски из координат белых пикселей. Вы также можете проверить mask == 255 сравнивать поэлементно. Вам не нужен np.where, потому что вы можете индексировать массивы с помощью логической маски, созданной mask == 255,

out = mask.copy()
out[mask == 255] = original_image[mask == 255]

Вы можете использовать побитовые операции. Попробуй это:

replaced_image = cv2.bitwise_and(original_image,original_image,mask = your_mask)

пример Посетите https://docs.opencv.org/3.3.0/d0/d86/tutorial_py_image_arithmetics.html чтобы узнать больше о побитовых операциях

      import os
import cv2
from netpbmfile import imread
 
img_dir = '.'
mask_dir = '.'
new_bg = 'image.png'

def get_foreground(fg_image_name, mask_name, bg_image_name):
    fg_image = cv2.imread(fg_image_name)
    mask = imread(mask_name)
    mask_inverse = (1-mask)
    bg_image = cv2.imread(bg_image_name)
    bg_image = cv2.resize(bg_image, (fg_image.shape[1], fg_image.shape[0]))
    foregound = cv2.bitwise_and(fg_image, fg_image, mask=mask)
    background = cv2.bitwise_and(bg_image, bg_image, mask=mask_inverse)
    composite = foregound + background
    
    return composite


image_fg = get_foreground(os.path.join(img_dir, "NP1_0.jpg"), os.path.join(mask_dir, "NP1_0_mask.pbm"), new_bg)
cv2.imwrite("foreground.jpg", image_fg)
Другие вопросы по тегам