web-dev-qa-db-fra.com

Combinez 3 tableaux numpy séparés à une image RVB dans Python

J'ai donc un ensemble de données que je suis capable de convertir pour former des tableaux numpy distincts de bandes R, G, B. Maintenant, je dois les combiner pour former une image RVB.

J'ai essayé "Image" pour faire le travail mais il faut attribuer "mode".

J'ai essayé de faire un tour. J'utiliserais Image.fromarray () pour prendre le tableau en image mais il atteint le mode 'F' par défaut lorsque Image.merge nécessite que les images en mode 'L' fusionnent. Si je déclarais l'attribut de tableau dans fromarray () à 'L' à la première place, toutes les images R G B se déforment.

Mais, si j'enregistre les images, puis les ouvre puis fusionne, cela fonctionne bien. L'image lit l'image avec le mode "L".

Maintenant, j'ai deux problèmes.

Tout d'abord, je ne pense pas que ce soit une manière élégante de faire le travail. Donc, si quelqu'un connaît la meilleure façon de le faire, dites-le-moi

Deuxièmement, Image.SAVE ne fonctionne pas correctement. Voici les erreurs auxquelles je fais face:

In [7]: Image.SAVE(imagefile, 'JPEG')
----------------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

/media/New Volume/Documents/My own works/ISAC/SAMPLES/<ipython console> in <module>()

TypeError: 'dict' object is not callable

Veuillez suggérer des solutions.

Et n'oubliez pas que l'image fait environ 4000x4000.

36
Ishan Tomar

Je ne comprends pas vraiment votre question, mais voici un exemple de quelque chose de similaire que j'ai fait récemment et qui pourrait aider:

# 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')

J'espère que ça aide

49
Bi Rico
rgb = np.dstack((r,g,b))  # stacks 3 h x w arrays -> h x w x 3

Pour convertir également les flottants 0 .. 1 en uint8 s,

rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8)  # right, Janna, not 256
43
denis

Convertissez les tableaux numpy en uint8 avant de les transmettre à Image.fromarray

Par exemple. si vous avez des flotteurs dans la plage [0..1]:

r = Image.fromarray(numpy.uint8(r_array*255.999))
4
Janne Karila

Votre distorsion, je crois, est causée par la façon dont vous divisez votre image d'origine en ses bandes individuelles, puis la redimensionnez à nouveau avant de la fusionner;

`
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()
`

ça marche bien!

2
John Misquita