У меня есть многоканальное спутниковое изображение, сохраненное в формате чередующихся пикселей (BIP) вместе с отдельным файлом заголовка. Заголовочный файл содержит такие сведения, как количество строк и столбцов в изображении, а также количество полос (может быть больше, чем стандарт 3).
Само изображение сохраняется следующим образом (предположим, 5-полосное изображение):
[B1] [B2] [B3] [B4] [B5] [B1] [B2] [B3] [B4] [B5] ... и т. Д. (В основном 5 байтов - по одному для каждой полосы - для каждый пиксель, начиная с верхнего левого угла изображения).
Мне нужно выделить каждую из этих полос в виде изображений PIL в Python 3.2 (в Windows 7, 64-разрядная версия), и в настоящее время я думаю, что неправильно подхожу к проблеме. Мой текущий код выглядит следующим образом:
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, но я не уверен, как я могу их использовать, и могут ли они даже помочь.
Поскольку число полос в изображении также является переменным, мне сложно найти способ быстрого чтения файла и разделения изображения на составляющие полосы.
И просто для записи, я попытался возиться с методами списка в циклах (используя срезы, не используя срезы, используя только добавление, используя только расширение и т. Д.), Это не имеет особого значения, поскольку основное время теряется из-за количества задействованных итераций - (width * height * numberOfBands).
Любые предложения или советы будут действительно полезны. Спасибо.