3

Pythonを使用して大きな画像ファイルを開く方法を知っている人はいますか?ipythonを使用してWindowsコマンドプロンプトから画像ファイル(約2 GB)を開こうとしましたが、画像の値を配列に変更すると毎回クラッシュします。

私のラップトップは、4GBのRAMとIntel(R)Core(TM)i7-2860QMCPUを搭載したwindow7-64ビットです。

エラーメッセージは次のとおりです。python.exeが動作を停止しました問題により、プログラムが正しく動作を停止しました。Windowsはプログラムを閉じ、解決策が利用可能かどうかを通知します

これが私のコードです。

import Image
import numpy as num
im=Image.open('myimage.tif')
imarray=num.array(im)
4

2 に答える 2

7

どのくらいのRAMがありますか?2ギガの画像を保存するには、2GBをかなり超えるRAMが必要になります。Image画像の保存がどれほど効率的かはわかりませんが、バイトリストはリスト内の各要素に4バイトのスペースを使用するため、8GBを超える(仮想)メモリを消費します...そして多くの忍耐力が必要です。編集:使用できるGBは4(または3)しかないため、これはほぼ間違いなく問題です。

しかし、なぜそれを数値配列に変換しようとしているのでしょうか。PILチュートリアルのように、imによって返されるオブジェクトのメソッドを使用します。Image.open

画像で何をしているのかわかりませんが、メモリ内の画像全体を読み取らずに、または少なくともオブジェクト全体をnumpy配列に変換せずに、それを実行できる可能性があります。マシンを爆破しないように、可能であれば少しずつ読んでください。Pythonジェネレーターを読んImage.getdata()で、一度に1ピクセル値ずつ画像を返すメソッドを確認してください。

于 2012-07-20T19:29:46.230 に答える
2

PILでnumpyを使用する方法はわかりませんが、ピクセルデータを配列に読み込む方法は次のとおりです(これは.jpg画像を使用します)。過去にはこれはうまく機能していましたが、私はこれを巨大な画像で試したことがないと思います。そのため、問題はメモリの問題に帰着する可能性があります

import Image
im = Image.open('pic.jpg')

pix_ar = im.load()       # load image into 2D array
red_pixel = 255, 0, 0    # a red RGB pixel

次のように個々の要素にアクセスします。

x = 10
y = 5
print pix_ar[x, y]
(255, 255, 255)

または値を割り当てます

pix_ar[x, y] = red_pixel

メモリ再:2GBの画像は、個々のピクセル値に「解凍」されると、2 GBよりもはるかに多くのRAMを消費する可能性があります。これは、変数/データに読み込んだ後、この情報を格納するデータ構造の効率によって異なります。構造。この大きなファイルをメモリに読み込もうとしているときにOSと他のいくつかのアプリを同時に実行していることを考えると、4GBのRAMでは十分ではない可能性があります。

また、過去にPILで開いたファイルをnumpyに正常に転送/読み取りしたことがある場合は、上記のコードが役に立たない可能性があります。

于 2012-07-20T19:31:32.010 に答える