高精度 (16 ビットなど) のグレースケール .png ファイルに保存したい 2D 浮動小数点の numpy 配列を使用しています。skimage.io
可能であれば、scikit-image パッケージを使用してこれを行いたいと思います。
私が試した主なことは次のとおりです。
import numpy as np
from skimage import io, exposure, img_as_uint, img_as_float
im = np.array([[1., 2.], [3., 4.]], dtype='float64')
im = exposure.rescale_intensity(im, out_range='float')
im = img_as_uint(im)
im
生成:
array([[ 0, 21845],
[43690, 65535]], dtype=uint16)
まず、これを画像として保存してから、Python Imaging Library を使用してリロードしてみました。
# try with pil:
io.use_plugin('pil')
io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')
im2
生成:
array([[ 0, 85],
[170, 255]], dtype=uint8)
そのため、どこかで (書き込みまたは読み取りのいずれかで) 精度が失われました。次に、matplotlib プラグインを試しました。
# try with matplotlib:
io.use_plugin('matplotlib')
io.imsave('test_16bit.png', im)
im3 = io.imread('test_16bit.png')
im3
私に32ビットの浮動小数点数を与えます:
array([[ 0. , 0.33333334],
[ 0.66666669, 1. ]], dtype=float32)
しかし、ファイルに 16 ビットの uint を保存したことを考えると、これが本当に 32 ビットであるとは思えません。誰かが私が間違っているところを指摘できれば素晴らしいことです。これを 3D 配列にも拡張したいと考えています (つまり、カラー チャネルごとに 16 ビットを節約し、画像ごとに 48 ビットを節約します)。
アップデート:
問題はimsaveにあります。画像はチャネルあたり 8 ビットです。io.imsave を使用して高ビット深度の画像を出力するにはどうすればよいですか?