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)
なぜ寸法が変更されたのですか?
im多分列優先ですが、numpyの配列は行優先です
行う in_data = in_data.T
python配列を転置します
おそらくmatplotlib
のimshow
を使用してin_dataをチェックし、画像が正しいことを確認する必要があります。
しかし、あなたはmatplotlibがあなたに直接ナンピー配列を与える独自のローディング関数が付いていることを知っていますか?参照: http://matplotlib.org/users/image_tutorial.html
画像がグレースケールの場合:
in_data = in_data.T
しかし、rbgイメージを使用している場合は、転置操作が2つの軸のみに沿っていることを確認する必要があります。
in_data = np.transpose(in_data, (1,0,2))
これは、ほとんどの画像ライブラリが、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画像でも機能します。しかし、これがすべてのイメージライブラリに当てはまるとは約束していません。