pythonimagenumpyimreadpython-imageio

How set white color background when concatenating images via python?


import numpy as np
from imageio import imread, imwrite

im1 = imread('https://api.sofascore.app/api/v1/team/2697/image')[...,:3]
im2 = imread('https://api.sofascore.app/api/v1/team/2692/image')[...,:3]

result = np.hstack((im1,im2))

imwrite('result.jpg', result)

Original images opening directly from the url's (I'm trying to concatenate the two images into one and keep the background white):

enter image description hereenter image description here

As can be seen both have no background, but when joining the two via Python, the defined background becomes this moss green:

enter image description here

I tried modifying the color reception:

im1 = imread('https://api.sofascore.app/api/v1/team/2697/image')[...,:1]
im2 = imread('https://api.sofascore.app/api/v1/team/2692/image')[...,:1]

But the result is a Black & White with the background still looking like it was converted from the previous green, even though the PNG's don't have such a background color.

enter image description here

How should I proceed to solve my need?


Solution

  • There is a 4th channel in your images - transparency. You are discarding that channel with [...,:1]. This is a mistake.

    If you retain the alpha channel this will work fine:

    import numpy as np
    from imageio import imread, imwrite
    
    im1 = imread('https://api.sofascore.app/api/v1/team/2697/image')
    im2 = imread('https://api.sofascore.app/api/v1/team/2692/image')
    
    result = np.hstack((im1,im2))
    
    imwrite('result.png', result)
    

    However, if you try to make a jpg, you will have a problem:

    >>> imwrite('test.jpg', result)
    
    OSError: JPEG does not support alpha channel.
    

    This is correct, as JPGs do not do transparency. If you would like to use transparency and also have your output be a JPG, I suggest a priest.

    You can replace the transparent pixels by using np.where and looking for places that the alpha channel is 0:

    result = np.hstack((im1,im2))
    result[np.where(result[...,3] == 0)] = [255, 255, 255, 255]
    
    imwrite('result.png', result)