71

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

仕事をするために「画像」を試しましたが、「モード」を属性にする必要があります。

ひと工夫してみました。Image.fromarray() を使用して配列を画像に取り込みますが、Image.merge で「L」モードの画像をマージする必要がある場合、デフォルトで「F」モードになります。そもそもfromarray()で配列の属性を'L'に宣言するとRGB画像が全て歪んでしまいます。

ただし、画像を保存してから開いてマージすると、正常に機能します。イメージは「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 サイズの配列であることに注意してください。

4

5 に答える 5

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

float 0 .. 1 も uint8 に変換するには、

rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8)  # right, Janna, not 256
于 2012-05-05T15:06:24.730 に答える
77

私はあなたの質問をよく理解していませんが、これは私が最近行った同様のことの例です。

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

それが役立つことを願っています

于 2012-05-04T08:40:13.780 に答える
5

numpy 配列をuint8に変換してから渡すImage.fromarray

例えば。[0..1] の範囲に float がある場合:

r = Image.fromarray(numpy.uint8(r_array*255.999))
于 2012-05-04T08:51:35.583 に答える