如何基于二值掩码裁剪图像

pat*_*ker 6 opencv image image-processing torch

我正在使用带有一些语义分割算法的 Torch 来生成分割图像的二进制掩码。然后我想根据该掩码裁剪图像。为了清楚起见,我需要在每个像素的基础上裁剪它。这似乎是一个简单的问题,但我能想到的唯一解决方案是反转draw maskCoco API 中的函数,或者迭代数组中的每个像素,并在不需要时将像素设置为黑色。我觉得有更好的方法可以做到这一点。Lua、Python、Go 或 C++ 中的库对我有用。有任何想法吗?

Sar*_*wal 6

我已经在 Python 中实现了这一点,假设您将输入图像和蒙版用作 Mat 对象。鉴于 src1 是您的图像,而 src1_mask 是您的二进制掩码:

src1_mask=cv2.cvtColor(src1_mask,cv2.COLOR_GRAY2BGR)#change mask to a 3 channel image 
mask_out=cv2.subtract(src1_mask,src1)
mask_out=cv2.subtract(src1_mask,mask_out)
Run Code Online (Sandbox Code Playgroud)

现在 mask_out 包含位于您定义的二进制掩码内的图像 src1 部分。


Fáb*_*bio 6

这是一个仅依赖于 numpy 的解决方案:

def get_segment_crop(img,tol=0, mask=None):
    if mask is None:
        mask = img > tol
    return img[np.ix_(mask.any(1), mask.any(0))]
Run Code Online (Sandbox Code Playgroud)

现在执行get_segment_crop(rgb, mask=segment_mask)wherergb是一个形状为 (w,h,c) 的 ndarray,并且是一个形状为 (w,h)segment_mask的布尔 ndarray(即包含 True/False 条目),假设 w=width,h=height。