2016-04-20 9 views
2

Я хочу загрузить гиперспектральные данные на пиксель в массив и снова записать этот пиксель с помощью Python 3.5. Я хочу рассчитать что-то со спектральной информацией этого пикселя.Как итеративно загружать read_pixel и записывать в файл envi; python3

Я пробовал два разных способа, и оба не работают так, как я хочу.

Прежде всего, я обновил спектральный пакет, так как последняя версия была заявлена ​​не для работы с итерационным envi.save_image, но мой подход не работает. Во-вторых, мои подходы оба не очень хороши с моей двойной петлей - я знаю - Если кто-нибудь может помочь мне в моей проблеме.

первый:

myfile=open_image('input.hdr') 
    for i in range(0,myfile.shape[0]): 
     for j in range(0,myfile.shape[1]): 
      mypixel = (myfile.read_pixel(i,j)) 
      envi.save_image('output.hdr', mypixel, dtype=np.int16) 

первый пример не сохранить изображение, а дает мне код ошибки

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/local/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile 
execfile(filename, namespace) 
File "/usr/local/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile 
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 
File "/dtc/Python/Masking.py", line 132, in <module> 
envi.save_image('test.hdr', mypixel, dtype=np.int16)#, metadata=myfile.metadata) 
File "/usr/local/lib/python3.5/site-packages/spectral/io/envi.py", line 415, in save_image 
data, metadata = _prepared_data_and_metadata(hdr_file, image, **kwargs) 
File "/usr/local/lib/python3.5/site-packages/spectral/io/envi.py", line 568, in _prepared_data_and_metadata 
add_image_info_to_metadata(image, metadata) 
File "/usr/local/lib/python3.5/site-packages/spectral/io/envi.py", line 613, in add_image_info_to_metadata 
metadata['samples'] = image.shape[1] 
IndexError: tuple index out of range 

2-й:

myfile=open_image('input.hdr') 
envi.create_image('test.hdr',ext='.bip', interleave='bip',dtype='h',force=True,metadata=myfile.metadata) 
open('test.bip', 'w').close() # empties the created file 

file = open('test.bip', 'ab')#ab #opens the created file for appending the new bands 

for i in range(0,myfile.shape[0]): 
    for j in range(0,myfile.shape[1]): 
     mypixel = (myfile.read_pixel(i,j)) 
     file.write(mypixel) 
file.close() 
myfile.close() 

Второй пример сохраняет образ, но магазины Pixel в другом порядке и испортил мой образ.

ответ

-1

Должен сказать заранее, что я не знаком со спектральным пакетом и envi и поэтому, к сожалению, не может предложить готовое к использованию решение. Кроме того, я не уверен, правильно ли я понял, что вы пытаетесь сделать с вашим изображением.

Но только некоторые мысли: Может ли функция write/save внутри цикла for вызывать свою проблему, потому что каждый пиксель обрабатывается точно так же и перезаписывается? Однако я не могу относиться к IndexError.

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

+0

Благодарим вас за ответ. Я пробовал это, а также получил этот намек от коллег. В итоге это работало и было быстрее. Все еще не дал мне ожидаемых результатов. Выход представляет собой изображение с нулевыми данными. – AnneR

1

Итак, это очень короткое, быстрое и простое решение благодаря коллеге.

myfile=envi.open('input.hdr') #opens image for calculating with it 

    imageArray = 10000*myfile[:,:,:] #do some math with it; 

    #10000* is needed because input data are thresholded between {0;10000} 
    #and during processing get thresholded between {0;1}. 
    #For preventing 0 in the output with datatype int the thresholding to {0;10000} is necessary again 

envi.save_image('test.hdr',imageArray,dtype=np.int16,metadata=myfile.metadata,force=True) 

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

  • Нет связанных вопросов^_^