如何在python中将多个numpy掩码合并为一个掩码?

eimct9ow  于 2023-06-23  发布在  Python
关注(0)|答案(2)|浏览(179)

我有一个2D掩码数组,看起来像这样:

[
  #mask0
 [[0.3,0.3],
  [0,0]],
  #mask1
  [[0.4,0],
  [0.4,0.4]]
]

我想一个接一个地合并掩码,其中每个掩码覆盖它之前的掩码,(我不想要所有掩码的总和)。覆盖,我的意思是如果第二个掩码的值不是0,它将设置新的值,否则保持前一个掩码的值。所以对于这个例子,结果将是

[[0.4,0.3],
  [0.4,0.4]]]

当然,在我的情况下,我没有只有2个面具2x2,我有多个面具在一个更大的规模,这只是为了证明.
蒙版表示一些灰度值的圆圈,我想把它们粘贴在另一个上面。像这样:

我如何使用NumPy和干净高效的代码来实现这一点?如果有不同的方法来处理这个问题,我也很想听听。

pgky5nke

pgky5nke1#

如果你有一个沿着第一个轴排列的3D遮罩阵列,你可以沿着第一个轴缩小,然后用np.where合并你的遮罩:

In [2]: import functools

In [3]: functools.reduce(lambda m0, m1: np.where(m1 == 0, m0, m1), masks)
Out[3]:
array([[0.4, 0.3],
       [0.4, 0.4]])
5vf7fwbs

5vf7fwbs2#

下面是一个用pytorch编写的代码片段。此代码假定您要将多个示例蒙版合并到一个图像中,同时保留不同蒙版中不同对象的唯一示例。

import torch
import torch.nn.functional as F
from PIL import Image

def merge_masks_with_instances(masks, instance_ids):
    # Create an empty tensor to store the merged masks
    merged_mask = torch.zeros_like(masks[0])

    # Iterate over each mask and its corresponding instance ID
    for instance_id, mask in zip(instance_ids, masks):
        # Apply the instance mask to the current mask
        instance_mask = torch.where(mask > 0, instance_id, torch.tensor(0))
        merged_mask = torch.max(merged_mask, instance_mask)

    return merged_mask

# Example usage
# Assuming you have three instance masks stored as tensors: mask1, mask2, mask3
mask1 = torch.tensor([[0, 1, 0], [1, 1, 0], [0, 0, 0]])
mask2 = torch.tensor([[0, 0, 1], [0, 1, 1], [1, 0, 0]])
mask3 = torch.tensor([[1, 0, 0], [0, 1, 0], [0, 1, 1]])

# Assuming you have a tensor representing the instance IDs
instance_ids = torch.tensor([1, 2, 3])

# Combine the instance masks into one merged mask
merged_mask = merge_masks_with_instances([mask1, mask2, mask3], instance_ids)

# Convert the merged mask tensor to a PIL image
merged_image = Image.fromarray((merged_mask * 255).byte().numpy(), mode='L')
merged_image.show()

相关问题