web-dev-qa-db-ja.com

Pillow Imageオブジェクトとnumpy配列間の変換により次元が変更される

Pillowとnumpyを使用していますが、Pillow Imageオブジェクトと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)

なぜ寸法が変更されたのですか?

23
Jongsu Liam Kim

im多分列優先ですが、numpyの配列は行優先です

行う in_data = in_data.T python配列を転置します

おそらくmatplotlibimshowを使用してin_dataをチェックし、画像が正しいことを確認する必要があります。

しかし、あなたはmatplotlibがあなたに直接ナンピー配列を与える独自のローディング関数が付いていることを知っていますか?参照: http://matplotlib.org/users/image_tutorial.html

16
prgao

画像がグレースケールの場合:

in_data = in_data.T

しかし、rbgイメージを使用している場合は、転置操作が2つの軸のみに沿っていることを確認する必要があります。

in_data = np.transpose(in_data, (1,0,2))
5
Nathan Harmon

これは、ほとんどの画像ライブラリが、numpy配列と比較してトランスポゼーションされた画像を提供するためです。これは(私が思うに)画像ファイルを1行ずつ書き込むため、最初のインデックス(xとしましょう)は行番号(したがってxは垂直軸です)を参照し、2番目のインデックスはインデックス(y)は、行内の後続のピクセルを指します(つまり、yは水平軸です)。これは、日常の座標の意味に反しています。

あなたがそれを正しく扱いたいなら、あなたは書くことを覚えておく必要があります:

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

その結果:

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

これは3D画像でも機能します。しかし、これがすべてのイメージライブラリに当てはまるとは約束していません。

0
Śmigło