wake-up-neo.com

Kombinieren Sie 3 separate Numpy-Arrays zu einem RGB-Bild in Python

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.

36
Ishan Tomar

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

49
Bi Rico
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
43
denis

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))
4
Janne Karila

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!

2
John Misquita