11

高精度 (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 を使用して高ビット深度の画像を出力するにはどうすればよいですか?

4

1 に答える 1

11

freeimageそのためにライブラリを使用したい:

import numpy as np
from skimage import io, exposure, img_as_uint, img_as_float

io.use_plugin('freeimage')

im = np.array([[1., 2.], [3., 4.]], dtype='float64')
im = exposure.rescale_intensity(im, out_range='float')
im = img_as_uint(im)

io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')

結果:

[[    0 21845]
 [43690 65535]]

3D配列に関しては、配列を適切に構築する必要があり、それが機能します:

# im = np.array([[1, 2.], [3., 4.]], dtype='float64')
im = np.linspace(0, 1., 300).reshape(10, 10, 3)
im = exposure.rescale_intensity(im, out_range='float')
im = img_as_uint(im)

io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')

読み取った画像は反転しているので、 のようなものnp.fliplr(np.flipud(im2))で元の形に戻すことに注意してください。

于 2014-06-16T09:48:01.363 に答える