2013-02-16 10 views
5

非常に大きな画像があります。私は全体のイメージをメモリにロードしたくないので、イメージを1行ずつ順番に渡したいだけです。 Python/scipyでこれを行うことは可能ですか?画像全体をロードせずに画像内のピクセルをループすることはできますか?

編集:私は.PNGを使用していますが、PPM、BMPなどのロスレスに変換できます。

+1

多くの場合、はいですが、画像のフォーマットとそれを読むために使用しているライブラリによって異なります。あなたのイメージはどのような形式ですか? –

+0

私は.PNGファイル形式を使用しています。 – nickponline

+1

TIFFは特別に簡単ですが、私はPILがTIFFをバンドで読むことをサポートしているとは思いません。 – Jaime

答えて

2

GDAL(Pythonバインディングを使用)は、このための非常に良いドライバを提供します。地理空間パッケージではありますが、BMPやPNGではうまく動作します。この例では、行によってPNG行をロードする方法を示しています

import gdal 

# only loads the dataset 
ds = gdal.Open('D:\\my_large_image.png') 

# read 1 row at the time 
for row in range(ds.RasterYSize): 
    row_data = ds.ReadAsArray(0,row,ds.RasterXSize,1) 

ds = None # this closes the file 

それはあなたのためにprocesingので、準備ができて、結果としてnumpyの配列を、提供します。同様の方法で結果を書くことができます。

print type(row_data) 
<type 'numpy.ndarray'> 

print row_data.shape 
(3, 1, 763) 

print row_data 
[[[ 0 0 255 ..., 230 230 0]] 

[[ 0 0 252 ..., 232 233 0]] 

[[ 0 0 252 ..., 232 233 0]]] 

読み込み専用のパッケージをインストールすると、PILなどの処理が可能な場合に少しオーバーしてしまうことがあります。しかし、その堅牢なオプション、私はこのように30000 * 30000ピクセルの画像を処理している。

関連する問題