個別のヘッダー ファイルと共に、バンド インターリーブ ピクセル (BIP) 形式で保存されたマルチバンド衛星画像があります。ヘッダー ファイルは、イメージの行数と列数、バンド数 (標準の 3 より多い場合もあります) などの詳細を提供します。
画像自体は次のように保存されます (5 バンドの画像を想定)。
[B1][B2][B3][B4][B5][B1][B2][B3][B4][B5] ... など (基本的に 5 バイト - 各バンドに 1 つ - 各ピクセルの開始)画像の左上隅から)。
これらの各バンドを Python 3.2 (Windows 7 64 ビット) で PIL イメージとして分離する必要がありますが、現在、問題に間違って取り組んでいると思います。私の現在のコードは次のとおりです。
def OpenBIPImage(file, width, height, numberOfBands):
"""
Opens a raw image file in the BIP format and returns a list
comprising each band as a separate PIL image.
"""
bandArrays = []
with open(file, 'rb') as imageFile:
data = imageFile.read()
currentPosition = 0
for i in range(height * width):
for j in range(numberOfBands):
if i == 0:
bandArrays.append(bytearray(data[currentPosition : currentPosition + 1]))
else:
bandArrays[j].extend(data[currentPosition : currentPosition + 1])
currentPosition += 1
bands = [Image.frombytes('L', (width, height), bytes(bandArray)) for bandArray in bandArrays]
return bands
このコードは BIP ファイルを開くのに時間がかかりすぎます。これを行うためのより良い方法があるはずです。numpy および scipy ライブラリも持っていますが、それらをどのように使用できるか、またはそれらが何らかの形で役立つかどうかはわかりません。
画像内のバンド数も可変であるため、ファイルをすばやく読み取り、画像をコンポーネント バンドに分離する方法を見つけるのが難しいと感じています。
記録のために、ループ内でリストメソッドをいじってみました(スライスを使用する、スライスを使用しない、追加のみを使用する、拡張のみを使用するなど)が、主要な時間が失われるため、特に違いはありません。関連する反復回数 - (幅 * 高さ * numberOfBands)。
提案やアドバイスは本当に役に立ちます。ありがとう。