从二进制蒙版裁剪图像

时间:2020-05-13 21:37:58

标签: python python-3.x opencv

我正在尝试使用DeepLab v3来检测对象并掩盖实际对象所在的位置。 DeepLab模型会生成一个resized_im(3D)和一个掩码seg_map(2D),它们分别为0和非零值,0表示背景。

当前,只能在对象上绘制带有覆盖蒙版的图像。我想从具有透明背景的resized_im中裁剪出对象。对这项工作有什么建议吗?

您可以在这里玩笔记本: https://colab.research.google.com/drive/138dTpcYfne40hqrb13n_36okSGYhrJnz?usp=sharing&hl=en#scrollTo=p47cYGGOQE1W&forceEdit=true&sandboxMode=true

我也在这里尝试过:How to crop image based on binary mask,但似乎没有一个适合我的情况

1 个答案:

答案 0 :(得分:1)

您只需要将分割蒙版转换为布尔numpy数组,然后将其乘以图像即可。不要忘记您的图像有3个通道,而遮罩只有1个通道。它可能看起来像这样:

# seg_map - segmentation mask from network, resized_im - your input image
mask = np.greater(seg_map, 0) # get only non-zero positive pixels/labels
mask = np.expand_dims(mask, axis=-1) # (H, W) -> (H, W, 1)
mask = np.concatenate((mask, mask, mask), axis=-1) # (H, W, 1) -> (H, W, 3), (don't like it, so if you know how to do it better, please let me know)
crops = resized_im * mask # apply mask on image

如果要选择某些标签,可以使用其他逻辑numpy函数,例如:

mask = np.equal(seg_map, 5) # to get only objects with label 5