Лучший dtype для создания больших массивов с помощью numpy

Я хочу сохранить значения пикселей со спутниковых изображений в массив. я использовал

np.empty((image_width, image_length)

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

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

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

но когда я включаю print img_array, я получаю только нули.

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

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

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

Спасибо


person Dzinic    schedule 16.01.2014    source источник
comment
Лучший dtype — это тот, который удобно хранит ваши данные. Если у вас есть куча 8-битных пикселей, uint8, вероятно, лучший dtype, но если у вас есть куча 32-битных аудиосэмплов с плавающей запятой, это будет не очень хорошо…   -  person abarnert    schedule 17.01.2014
comment
@abarnert Изображения, которые я использую, представляют собой 8-битные файлы TIFF. Все еще возвращает нули, когда я использую uint8..   -  person Dzinic    schedule 17.01.2014


Ответы (1)


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

dataset = gdal.Open("RADARSATGetRasterBand(i)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 для типа изображений, которые вы хотите читайте, жизнь становится очень легкой

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

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

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

Изменить: проблема решена при использовании 64-битного Python вместо 32-битного из-за ошибок памяти на 2 ГБ при использовании 32-битной версии Python.

person usethedeathstar    schedule 17.01.2014
comment
@Dzinic, каков источник ваших изображений? (отредактировал мой ответ, чтобы показать другую вещь, которую я использовал раньше, для чтения изображений, но не уверен, что для .tiff это работает) Я предполагаю, что вы используете изображения landsat? в этом случае я думаю, что у gdal должен быть драйвер для него - person usethedeathstar; 17.01.2014
comment
Я не уверен, откуда взялись изображения, но я знаю, что они имеют разрешение 5 метров. Я могу правильно загрузить их с помощью gdal, но кажется, что когда скрипт занимает более 2 ГБ памяти, я получаю ошибку MemoryError. Не уверен, что это мой код или 32-битный питон, который я использую. - person Dzinic; 20.01.2014
comment
@Dzinic обязательно попробуйте использовать 64-битный питон, с 32-битным питоном вы всегда получаете ошибку памяти при использовании памяти 2 ГБ (вы используете Linux? и сколько у вас оперативной памяти?) - person usethedeathstar; 21.01.2014
comment
На самом деле я вчера попробовал 64-битную версию, и она работала без проблем. Разница в том, что 32 бита... Спасибо за ваши предложения. - person Dzinic; 21.01.2014
comment
@Dzinic, это ответ на твой вопрос? или у вас все еще есть проблемы при работе с 64-битной? - person usethedeathstar; 21.01.2014
comment
Это ответило на вопрос. Если можете, отредактируйте исходный ответ с помощью 64-битного решения, и я отмечу его как лучший ответ. - person Dzinic; 21.01.2014