根据不同大小的掩码数组过滤 Numpy 数组

Filter Numpy array based on different size mask array

我正在尝试根据分割网络的 class 掩码 (16x16) 的值标记要忽略的图像数组 (224x224) 区域。先前的处理意味着不需要的区域将被标记为 -1。我希望能够将 class 掩码报告 -1 的图像的所有区域的值设置为一些无意义的值(比如 999),但保持数组的形状 (224x224)。下面是我的意思的简明示例,使用 4x4 图像和 2x2 掩码。

# prefilter
image = 1 2 3 4
        5 6 7 8
        9 1 2 3
        4 5 6 7

mask  = -1 4
        -1 5

# postfilter

image_filtered = 999 999 3 4
                 999 999 7 8
                 999 999 2 3
                 999 999 6 7

Is there an efficient way to do this modification?

这是我开始工作的一些代码。它确实要求遮罩和图像具有相同的纵横比,并且是彼此尺寸的整数倍。

import numpy as np

image = np.array([[1,2,3,4],
                  [5,6,7,8],
                  [9,1,2,3],
                  [4,5,6,7]])

mask = np.array([[-1,4],
                 [-1,5]])

def mask_image(image, mask, masked_value):
    
    scale_factor = image.shape[0]//mask.shape[0] # how much the mask needs to be scaled up by to match the image's size
    
    resized_mask = np.kron(mask, np.ones((scale_factor,scale_factor))) # resize the mask (magic)

    return(np.where((resized_mask==-1),masked_value,image)) # where the mask==-1, return the masked value, else return the value of the original array.
    
print(mask_image(image, mask, 999))

我在看到 this answer 后使用 np.kron 调整数组大小。

这个函数非常快,用 1920x1080 的蒙版遮盖一张 1920x1080 的图像需要大约 2 秒

编辑:使用@Jérôme Richard 在他们的评论中所说的内容。