2 次元の Numpy 配列 (単一の値) を Scipy で保存する場合、toimage
またはimsave
ピクセル値が Numpy 配列の値と正確に一致しません。代わりに、画像アルゴリズムがある種の補間を使用しているように見える領域が、主にエッジにあります。
その補間を停止して正確なデータを保持するオプションはありますか (たとえば、7 は常に PNG で rgb(7,7,7) を取得しますか?
2 次元の Numpy 配列 (単一の値) を Scipy で保存する場合、toimage
またはimsave
ピクセル値が Numpy 配列の値と正確に一致しません。代わりに、画像アルゴリズムがある種の補間を使用しているように見える領域が、主にエッジにあります。
その補間を停止して正確なデータを保持するオプションはありますか (たとえば、7 は常に PNG で rgb(7,7,7) を取得しますか?
2D numpy 配列がある場合は、グレースケール PNG に保存しているため、RGB イメージ (1 つのチャネルのみ) を取得することはありません。単一の値の意味がわかりません。おそらく単精度浮動小数点数ですか? PIL は単精度浮動小数点数をサポートしていますが、PNG はサポートしていません。PNG に保存すると、チャネルあたり 8 ビット (デフォルト) またはチャネルあたり 16 ビットを使用できます。これは、配列が最大 2^8/2^16 (8/16 ビット) にスケーリングされ、整数に変換されることを意味します。この変換では、結果がわずかに異なる場合があります。
16 ビットとして保存するオプションがないようにscipy.misc.image
思われるため、常に 8 ビットの PNG を書き込みます。ただし、 を使用scipy.misc.toimage
して 16 ビット イメージを作成できますmode='I'
。また、スケーリングを避けるために、配列の最小値と最大値を必ず指定してください。これを使用して 16 ビット png を保存する方法は次のとおりです。
import numpy as np
import scipy.misc
a = np.random.uniform(0, 2**16 - 1, (500, 500)).astype('int32')
img = scipy.misc.toimage(a, high=np.max(a), low=np.min(a), mode='I')
img.save('my16bit.png')
# check that you got the same values
b = scipy.misc.imread('my16bit.png')
b.dtype
# dtype('int32')
np.array_equal(a, b)
# True
この例ではint32
、データ型に使用したことに注意してください。ただし、データはuint16
. 負の値または 2^16 より大きい値を入力すると、PNG への保存時にクリップされます。逆に、sp.misc.imread
と読み取られてもint32
、データが を超えることはありませんuint16
。
要約すると、まったく同じ numpy 配列を PNG に書き込みたい場合は、それがuint8/uint16
タイプであることを確認する必要があり、正しいhigh/low/mode
を に渡す必要がありますscipy.misc.toimage
。