2014-01-16 2 views
1

Я ищу для хранения значений пикселей из спутниковых изображений в массив. Я используюЛучший dtype для создания больших массивов с numpy

np.empty((image_width, image_length) 

, и она работала для небольших подмножеств изображения, но при использовании его на все изображение (3858 х 3743) код заканчивается очень быстро, и все, что я получаю массив нулей.

я загрузить значения изображения в массив с помощью цикла и открытия изображения с GDAL

img = gdal.Open(os.path.join(fn + "\{0}".format(fname))).ReadAsArray() 

но когда я включил print img_array я в конечном итоге только с нулями.

Я пробовал почти каждый dtype, который я мог найти в документации по количеству, но получаю тот же результат.

Может ли numpy не загружать это множество значений или есть способ оптимизировать массив?

Я работаю с 8-битными изображениями tiff, которые содержат значения NDVI (десятичные).

Благодарности

+0

«Лучший dtype» - это тот, который удобно хранит ваши данные. Если у вас есть куча 8-битных пикселей, 'uint8', вероятно, лучший dtype, но если у вас есть куча 32-битных звуковых образцов, это будет не очень хорошо ... – abarnert

+0

@abarnert Изображения, которые я использую, являются 8-битными tiff. Все еще возвращает нули, когда я использую uint8 .. – Dzinic

ответ

1

Не уверен, что тип изображения вы пытаетесь читать, но в случае RADARSAT-2 изображения вы можете следующим образом:

dataset = gdal.Open("RADARSAT_2_CALIB:SIGMA0:" + inpath + "product.xml") 
S_HH = dataset.GetRasterBand(1).ReadAsArray() 
S_VV = dataset.GetRasterBand(2).ReadAsArray() 
# gets the intensity (Intensity = re**2+imag**2), and amplitude = sqrt(Intensity) 
self.image_HH_I = numpy.real(S_HH)**2+numpy.imag(S_HH)**2 
self.image_VV_I = numpy.real(S_VV)**2+numpy.imag(S_VV)**2 

Но именно для этого типа изображения (в этом случае каждое изображение содержит несколько полос, поэтому мне нужно читать в каждой полосе отдельно с помощью GetRasterBand(i), а не делать ReadAsArray() Если есть определенный драйвер GDAL для типа изображений, которые вы хотите прочитать, жизнь становится очень легкой.

Если вы дадите дополнительную информацию о типах изображений, которые хотите прочитать, я могу, возможно, помочь более конкретно

Редактировать: вы попробовали что-то вроде этого? (Не уверен, что будет работать на кальците, или сколько битых заголовок, следовательно, something:)

A=open(filename,"r") 
B=numpy.fromfile(A,dtype='uint8')[something:].reshape(3858,3743) 
C=B*1.0 
A.close() 

Edit: Проблема решаются при использовании 64-битный питона вместо 32-х, из-за ошибки памяти на 2Gb когда это используя 32-битную версию python.

+0

Я использую 8-битные tiff-изображения, содержащие информацию NDVI. – Dzinic

+0

@Dzinic, каков источник ваших изображений? (отредактировал мой ответ, чтобы показать другое, что я использовал раньше, чтобы читать на изображениях, но не уверен, что для .tiff, который работает), я предполагаю, что вы используете изображения landat? в этом случае я предполагаю, что gdal должен иметь драйвер для него – usethedeathstar

+0

Я не уверен, откуда взялись изображения, но я знаю, что они имеют разрешение 5 метров. Я могу правильно загрузить их с помощью gdal, но кажется, что когда сценарий занимает более 2 ГБ памяти, я получаю «MemoryError». Не уверен, что это мой код или 32-битный питон, который я использую. – Dzinic

Смежные вопросы