How to load png images with 4 channels?

后端 未结 5 1237
暗喜
暗喜 2020-12-03 00:45

I have been trying to load .png files with transparency channel (RGB and Alph) with no luck. It appears that openCV strips the 4th channel out of the image. Is there any met

5条回答
  •  甜味超标
    2020-12-03 01:28

    The right way to read a transparent PNG is to use the 4th channel as alpha channel. Most of the times one wants a white background, if that is the case then below code can be used for alpha compositing.

    def read_transparent_png(filename):
        image_4channel = cv2.imread(filename, cv2.IMREAD_UNCHANGED)
        alpha_channel = image_4channel[:,:,3]
        rgb_channels = image_4channel[:,:,:3]
    
        # White Background Image
        white_background_image = np.ones_like(rgb_channels, dtype=np.uint8) * 255
    
        # Alpha factor
        alpha_factor = alpha_channel[:,:,np.newaxis].astype(np.float32) / 255.0
        alpha_factor = np.concatenate((alpha_factor,alpha_factor,alpha_factor), axis=2)
    
        # Transparent Image Rendered on White Background
        base = rgb_channels.astype(np.float32) * alpha_factor
        white = white_background_image.astype(np.float32) * (1 - alpha_factor)
        final_image = base + white
        return final_image.astype(np.uint8)
    

    A detailed blog on this is here here.

提交回复
热议问题