Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: DzinicОтветов: 1

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

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 (десятичные).

Спасибо

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

pythonnumpyarraysimage-processinggdal

Ответы

Ответ 1 · рейтинг 1 · usethedeathstar

Не уверен, какой тип изображений вы пытаетесь прочитать, но в случае изображений с радаров-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.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы