根据不同大小的掩码数组过滤 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 在他们的评论中所说的内容。
我正在尝试根据分割网络的 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 在他们的评论中所说的内容。