Search code examples
pythonopencvimage-processingpng

How to remove 4th channel from PNG images


I am loading images from a URL in OpenCV. Some images are PNG and have four channels. I am looking for a way to remove the 4th channel, if it exists.

This is how I load the image:

def read_image_from_url(self, imgurl):
    req = urllib.urlopen(imgurl)
    arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
    return cv2.imdecode(arr,-1) # 'load it as it is'

I don't want to change the cv2.imdecode(arr,-1) but instead I want to check whether the loaded image has a fourth channel, and if so, remove it.

Something like this but I don't know how to actually remove the 4th channel

def read_image_from_url(self, imgurl):
    req = urllib.urlopen(imgurl)
    arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
    image = cv2.imdecode(arr,-1) # 'load it as it is'
    s = image.shape
    #check if third tuple of s is 4
    #if it is 4 then remove the 4th channel and return the image. 

Solution

  • You need to check for the number of channels from img.shape and then proceed accordingly:

    # In case of grayScale images the len(img.shape) == 2
    if len(img.shape) > 2 and img.shape[2] == 4:
        #convert the image from RGBA2RGB
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)