Ich habe also eine Reihe von Daten, die ich konvertieren kann, um separate numpy-Arrays von R-, G- und B-Bändern zu bilden. Jetzt muss ich sie kombinieren, um ein RGB-Bild zu bilden.
Ich habe versucht, 'Image' für diesen Job zu verwenden, aber es muss 'Mode' zugewiesen werden.
Ich habe versucht, einen Trick zu machen. Ich würde Image.fromarray () verwenden, um das Array zum Bild zu bringen, aber es erreicht standardmäßig den 'F'-Modus, wenn Image.merge das Zusammenführen von Bildern im' L'-Modus erfordert. Wenn ich das Attribut von array in fromarray () an erster Stelle zu 'L' deklarieren würde, würden alle RB-Bilder verzerrt.
Aber wenn ich die Bilder speichere und dann öffne und dann zusammenführe, funktioniert es einwandfrei. Bild liest das Bild mit 'L' Modus.
Jetzt habe ich zwei Probleme.
Erstens denke ich nicht, dass es eine elegante Art ist, die Arbeit zu erledigen. Also, wenn jemand den besseren Weg kennt, bitte sagen Sie es
Zweitens funktioniert Image.SAVE nicht richtig. Folgendes sind die Fehler, denen ich gegenüberstehe:
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
Bitte schlagen Sie Lösungen vor.
Bitte beachten Sie, dass das Bild eine Größe von 4000x4000 hat.
Ich verstehe Ihre Frage nicht wirklich, aber hier ist ein Beispiel für etwas Ähnliches, das ich kürzlich getan habe und das anscheinend hilfreich sein könnte:
# 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')
Ich hoffe das hilft
rgb = np.dstack((r,g,b)) # stacks 3 h x w arrays -> h x w x 3
Um auch floats 0 .. 1 in uint8 s umzuwandeln,
rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8) # right, Janna, not 256
Konvertieren Sie die Numpy-Arrays in uint8
, Bevor Sie sie an Image.fromarray
Übergeben.
Z.B. Wenn Sie Schwimmer im Bereich [0..1] haben:
r = Image.fromarray(numpy.uint8(r_array*255.999))
Ich glaube, Ihre Verzerrung wird dadurch verursacht, dass Sie Ihr Originalbild in einzelne Bereiche aufteilen und dann die Größe ändern, bevor Sie es zusammenführen.
`
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()
`
das funktioniert gut!