2012-05-04 11 views
23

私は、R、G、Bバンドの別々の配列を作るために変換できるデータセットを持っています。今私はそれらを組み合わせてRGB画像を形成する必要があります。Pythonで3つの別々の配列をRGB画像に結合する

ジョブを行うには「画像」を試しましたが、「モード」が割り当てられている必要があります。

私はトリックをしようとしました。私はImage.fromarray()を使用して配列に画像を取得しますが、Image.mergeにLモード画像をマージする必要がある場合はデフォルトで 'F'モードになります。最初の場所でfromarray()の配列の属性を 'L'に宣言すると、すべてのR G Bイメージが歪んで表示されます。

しかし、イメージを保存して開いてからマージしても正常に動作します。画像は「L」モードで画像を読み取ります。

今私は2つの問題があります。

まず、私はそれが仕事をするエレガントな方法だとは思わない。だから誰かがそれを行う良い方法を知っている場合は、

を教えてください第二に、Image.SAVEが正しく動作していません。以下は、私が直面しているエラーです:

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 

解決策をお勧めします。

画像は約4000x4000サイズの配列です。

答えて

30

私は本当にあなたの質問を理解するが、ここでそれが役立つかもしれないように思える私は最近やった似たような例ではありません。

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

私は

+0

ありがとうございます! これは役に立ちます –

+8

@ IshanTomar - あなたがその答えを受け入れることができれば助かります。 – Bach

+0

アレイを画像として保存する場合は、「画像」にする必要があります – icypy

3

がnumpyのを変換することができます願っていますアレイをuint8に転送してからImage.fromarray

などに転送します。あなたは、範囲内のフロート[0..1]がある場合:またUINT8 sにフロート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 

を、

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

あなたの歪曲私はによって引き起こされると考えています元のイメージを個々のバンドに分割してからマージする前に再びサイズを変更する方法、

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

これはうまくいきます!

関連する問題