2012-05-04 17 views
23

Tak więc mam zestaw danych, które mogę przekonwertować, tworząc osobne, pozbawione wartości tablice pasm R, G, B. Teraz muszę je połączyć, aby utworzyć obraz RGB.Połączyć 3 oddzielne tablice numpy z obrazem RGB w Pythonie

Próbowałem wykonać "obraz", ale wymaga to przypisania "trybu".

Próbowałem zrobić lewę. Użyłbym Image.fromarray() do przeniesienia tablicy do obrazu, ale domyślnie osiąga tryb "F", gdy Image.merge wymaga scalania obrazów trybu "L". Jeśli zadeklarowałbym atrybut tablicy od fromarray() do "L" na pierwszym miejscu, wszystkie obrazy R G B uległyby zniekształceniu.

Ale jeśli zapiszę obrazy, a następnie je otworzę, a następnie scalę, wszystko działa dobrze. Obraz odczytuje obraz w trybie "L".

Teraz mam dwie problemy.

Po pierwsze, nie sądzę, że jest to elegancki sposób wykonywania pracy. Jeśli więc ktoś wie, jak to zrobić lepiej, powiedz

Po drugie, Image.SAVE nie działa poprawnie. Poniżej znajdują się błędy, które napotykam:

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 

Proszę sugerować rozwiązania.

Należy pamiętać, że obraz ma rozmiar około 4000x4000.

Odpowiedz

30

I naprawdę nie rozumiem pytanie, ale tutaj jest przykład czegoś podobnego Robiłem niedawno, że wydaje się, że to może pomóc:

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

Mam nadzieję, że pomaga

+0

Wielkie dzięki! To działa –

+8

@IshanTomar - możesz zaakceptować tę odpowiedź, jeśli była pomocna. – Bach

+0

Jeśli chcesz zapisać tablicę jako obraz, to powinno być "na obraz" – icypy

3

przekonwertować numpy tablice do uint8 przed przekazaniem ich do Image.fromarray

Np. jeśli masz pływaków w zakresie [0..1]:

r = Image.fromarray(numpy.uint8(r_array*255.999)) 
29
rgb = np.dstack((r,g,b)) # stacks 3 h x w arrays -> h x w x 3 

Aby również przekonwertować pływaków 0 .. 1 do Uint8 s,

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

Twój zniekształcenie moim zdaniem jest spowodowane sposób w jaki dzielisz oryginalny obraz na poszczególne zespoły, a następnie zmieniasz go ponownie przed wprowadzeniem do scalenia;

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

to działa dobrze!

Powiązane problemy