2013-09-25 8 views
20

です。ピローとnumpyを使用していますが、ピローイメージオブジェクトとnumpy配列の間の変換に問題があります。ピローイメージオブジェクトとnumpy配列の間の変換が

次のコードを実行すると、結果は変です。

im = Image.open(os.path.join(self.img_path, ifname)) 
print im.size 
in_data = np.asarray(im, dtype=np.uint8) 
print in_data.shape 

結果は、寸法が変更されたのはなぜ

(1024, 768) 
(768, 1024) 

のですか?多分列優先

答えて

16

イムnumpyの中の配列は、行優先

ありながら、Pythonの配列

を移調するin_data = in_data.Tを行うおそらく画像が右に見えることを確認するmatplotlibimshowでIN_DATA確認する必要があります。

matplotlibには独自の読み込み関数が用意されているので、直接numpy配列を得ることができますか?参照:http://matplotlib.org/users/image_tutorial.html

+0

'np.asarray(im、order = 'F')'も可能です(https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.asarray.html)。 #numpy.asarray) –

5

あなたのイメージがグレースケールかの場合:

in_data = in_data.T 

しかし、あなたはあなたの転置操作は2つだけの軸に沿っていることを確認したい画像をRBGで作業している場合:

in_data = np.transpose(in_data, (1,0,2)) 
0

実際にはこれは、ほとんどの画像ライブラリが、配列がnumpyに比べて透過的な画像を提供するためです。最初のインデックス(xと言う)は行番号を参照するので(xは縦軸)、2番目のインデックス(y)は次のピクセルを参照します。私たちの日常的な座標感覚に反しています(yは横軸です)。

あなたはそれを正しく扱うようにしたい場合は、あなたが書くことを覚えておく必要があります。

image = library.LoadImage(path) 
array = (library.FromImageToNumpyArray(image)).T 

、その結果:

image = library.FromNumpyArrayToImage(array.T) 
library.WriteImage(image, path) 

3D画像のためにも機能します。しかし、私はこれがすべての画像ライブラリの場合であると約束していません。

関連する問題