【问题标题】:Cropping image from a binary mask从二进制掩码裁剪图像
【发布时间】:2020-05-14 17:39:01
【问题描述】:

我正在尝试使用 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 但似乎没有一个适用于我的情况

【问题讨论】:

    标签: python python-3.x opencv


    【解决方案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
    

    【讨论】:

    • 它有效!但是crops 是黑色背景,还是透明的?
    • 很高兴它有帮助!结果有黑色背景,因为这是一个简单的 3 通道 RGB 图像。要设置透明区域,您需要添加额外的通道。为什么需要透明背景?如果你想把它保存到一个文件中(我猜是.png),那么你可以这样做:stackoverflow.com/questions/32290096/…
    • 如果你想在python中进一步使用它,例如,将它添加到另一个图像,所以黑色背景非常适合它。在这种情况下,如果我是你,我会使用 opencv (opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/…)。我还建议您阅读有关图像表示的内容(例如:techtutorialsx.com/2020/03/02/…
    猜你喜欢
    • 2017-04-10
    • 2021-11-28
    • 2020-04-13
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2018-07-21
    相关资源
    最近更新 更多