2

高解像度の画像を取得して大きな行列として保存するカメラがあります。データから画像を構築しようとしています。(そして、Python-32 ビットで実行する必要があります。)

データは HDF5 に保存され、h5py を使用してアクセスしていますが、私が知っているすべての方法ではすべてのデータをコンピューターのメモリにダンプする必要があるため、メモリ エラーなしでデータをプロットすることはできません。(私は通常の matplotlib と scipy ライブラリしか知りません。)

また、データから画像を生成しようとすると同じ問題が発生しますが、以前の質問 ( Constructing high resolution images in Python )で GDAL がデータから画像を生成できると言われました。

私はいくつかの調査を行いました(PythonのGDALはあまり文書化されていないようです)、この質問に出くわしました:画像全体をロードせずに画像内のピクセルをループできますか? . 提供された回答は、画像を行ごとにインポートする簡単なスクリプトを提供します。これの反対を行い、画像を行ごとに保存する方法はありますか? そうすれば、画像を保存するためにすべてのデータをメモリにロードする必要がなくなります。

または、大きすぎてメモリにロードできない HDF5 データセットから画像 (できれば PNG) を生成する方法はありますか?

これが私が取り組んできたコードの例です:

import tables
import Image
import matplotlib.pyplot as plt
import scipy.misc

data = numpy.random.random_integers(0, 262143, (10000, 10000))

fileName = "array1.h5"
h5f = tables.openFile(fileName, "w")
array = h5f.createArray(h5f.root, "array1", data)
h5f.close()


fileName = "array1.h5"
h5f = tables.openFile(fileName, "r")
array_read = h5f.root.array1
print array_read[:]

#Method 1
scipy.misc.imsave('Test_random.png', array_read[:])

#Method 2
plt.imshow(array_read[:])
plt.show()

#Method 3
plt.pcolormesh(array_read[:])
plt.show()

10000x10000 のマトリックスを生成し、h5py で H5 ファイルに保存します。ファイルを閉じて、もう一度開きます。次に、画像を保存するか、データをプロットしようとします (3 つの方法のうち 2 つをコメントアウトして、それぞれをテストします)。

H5ファイルに保存されたこの配列をPNG画像に保存できるサンプルコードを誰かが提供できれば、非常にありがたいです。

4

1 に答える 1

0

多くの画像形式には厳しい制限があります。つまり、表示される 8 ビット RGB(A) カラー データ用に最適化されています。カメラにもっと重要なビットがある場合は、別のフォーマットが必要になります。HDF5 (まさにこの状況のた​​めに作成された) とは別に、TIFF のみをお勧めします。これは、多くの異なるピクセル フォーマットをサポートし、BigTIFF バージョンとして 4GB を超えるファイル サイズもサポートするためです。そしてTIFFは広く普及しています。

ここで、メモリ エラーなしではデータをプロットできないと言います。これは(ali_mが指摘したように)ファイル形式とは無関係の問題です。10000x10000 ピクセルの画像全体をメモリに保存できない場合は、縮小版を表示するか、ズームした部分のみを表示してから、ディスクからファイルのスライスを常にロードしている間、別の部分にスクロールできるようにする必要があります (これはおそらくあまり速くない)。

HDF5 では派手なインデックス付けが可能であるため、画像の一部を簡単に (整数で) ダウンサンプリングできます。その後、OS はファイル アクセスをバッファリングして、処理を少し高速化することができます。

hdf5 に組み込まれているダウンスケーリング機能については知りませんが、scipy ルーチンを使用して自分で追加できます (メモリの問題が発生した場合はチャンクで実行します) 。

HDF5 では、データをチャンクに書き込むこともできます (強力なインデックス作成を介して)。これは、「メモリに対して大きすぎるデータ」を保存するときにも重要です。

TIFF 現在、tiff 機能を備えたほとんどの (すべての?) Python ライブラリで使用されているlibtiffが 2D 画像のスライスを読み書きできるかどうかはわかりません。しかし、HDF5 と同様の方法で、複数の画像を 1 つの TIFF ファイル (MultiPageTiff) に入れることができることは知っています。したがって、画像の一部を複数のスタックとして TIFF ファイルに入れることができます。これをどのように最適に管理するかは、アプリケーション次第です。

最後に、ファイル形式として HDF5 を使用し、HDF5 の高度なインデックスを使用して、ズームまたはダウンサンプリングするか、両方を組み合わせてデータを表示するビューアーを構築することを強くお勧めします。パフォーマンスのために、OSがHDF5ファイルの一部をバッファリングすることを望んでいますが、特定の画像サイズの効率を高めるために微調整できる内部パラメータがいくつかあります(チャンクも使用します)。

ヒント: 実際のモニターよりも優れたピクセル化でデータ (ズームされているかどうかに関係なく) を表示する必要はありません。

于 2015-12-21T21:48:30.410 に答える