web-dev-qa-db-ja.com

Pythonで3つの別々のnumpy配列をRGB画像に結合

したがって、R、G、Bバンドの個別のnumpy配列を形成するために変換できるデータのセットがあります。次に、それらを組み合わせて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サイズの配列であることに注意してください。

36
Ishan Tomar

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

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

それがお役に立てば幸いです

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

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

例えば。範囲[0..1]のフロートがある場合:

r = Image.fromarray(numpy.uint8(r_array*255.999))
4
Janne Karila

私が信じているあなたの歪みは、元の画像を個々のバンドに分割し、それを再度サイズ変更してからマージする方法が原因であると考えています。

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

これはうまくいきます!

2
John Misquita