Combine 3 separate numpy arrays to an RGB image in Python

前端 未结 5 709
遥遥无期
遥遥无期 2020-12-02 10:19

So I have a set of data which I am able to convert to form separate numpy arrays of R, G, B bands. Now I need to combine them to form an RGB image.

I tried \'Image\

相关标签:
5条回答
  • 2020-12-02 10:51

    Convert the numpy arrays to uint8 before passing them to Image.fromarray

    Eg. if you have floats in the range [0..1]:

    r = Image.fromarray(numpy.uint8(r_array*255.999))
    
    0 讨论(0)
  • 2020-12-02 10:53
    rgb = np.dstack((r,g,b))  # stacks 3 h x w arrays -> h x w x 3
    

    To also convert floats 0 .. 1 to uint8 s,

    rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8)  # right, Janna, not 256
    
    0 讨论(0)
  • 2020-12-02 10:59

    Your distortion i believe is caused by the way you are splitting your original image into its individual bands and then resizing it again before putting it into merge;

    `
    image=Image.open("your image")
    
    print(image.size) #size is inverted i.e columns first rows second eg: 500,250
    
    #convert to array
    li_r=list(image.getdata(band=0))
    arr_r=np.array(li_r,dtype="uint8")
    li_g=list(image.getdata(band=1))
    arr_g=np.array(li_g,dtype="uint8")
    li_b=list(image.getdata(band=2))
    arr_b=np.array(li_b,dtype="uint8")
    
    # reshape 
    reshaper=arr_r.reshape(250,500) #size flipped so it reshapes correctly
    reshapeb=arr_b.reshape(250,500)
    reshapeg=arr_g.reshape(250,500)
    
    imr=Image.fromarray(reshaper,mode=None) # mode I
    imb=Image.fromarray(reshapeb,mode=None)
    img=Image.fromarray(reshapeg,mode=None)
    
    #merge
    merged=Image.merge("RGB",(imr,img,imb))
    merged.show()
    `
    

    this works well !

    0 讨论(0)
  • 2020-12-02 11:02

    I don't really understand your question but here is an example of something similar I've done recently that seems like it might help:

    # r, g, and b are 512x512 float arrays with values >= 0 and < 1.
    from PIL import Image
    import numpy as np
    rgbArray = np.zeros((512,512,3), 'uint8')
    rgbArray[..., 0] = r*256
    rgbArray[..., 1] = g*256
    rgbArray[..., 2] = b*256
    img = Image.fromarray(rgbArray)
    img.save('myimg.jpeg')
    

    I hope that helps

    0 讨论(0)
  • 2020-12-02 11:05
    rgb = np.dstack((r,g,b))  # stacks 3 h x w arrays -> h x w x 3
    

    This code doesnt create 3d array if you pass 3 channels. 2 channels remain.

    0 讨论(0)
提交回复
热议问题