OpenCV - Apply mask to a color image

后端 未结 5 1496
甜味超标
甜味超标 2020-11-28 06:43

How can I apply mask to a color image in latest python binding (cv2)? In previous python binding the simplest way was to use cv.Copy e.g.

cv.Copy(

5条回答
  •  孤独总比滥情好
    2020-11-28 07:44

    The other methods described assume a binary mask. If you want to use a real-valued single-channel grayscale image as a mask (e.g. from an alpha channel), you can expand it to three channels and then use it for interpolation:

    assert len(mask.shape) == 2 and issubclass(mask.dtype.type, np.floating)
    assert len(foreground_rgb.shape) == 3
    assert len(background_rgb.shape) == 3
    
    alpha3 = np.stack([mask]*3, axis=2)
    blended = alpha3 * foreground_rgb + (1. - alpha3) * background_rgb
    

    Note that mask needs to be in range 0..1 for the operation to succeed. It is also assumed that 1.0 encodes keeping the foreground only, while 0.0 means keeping only the background.

    If the mask may have the shape (h, w, 1), this helps:

    alpha3 = np.squeeze(np.stack([np.atleast_3d(mask)]*3, axis=2))
    

    Here np.atleast_3d(mask) makes the mask (h, w, 1) if it is (h, w) and np.squeeze(...) reshapes the result from (h, w, 3, 1) to (h, w, 3).

提交回复
热议问题