Как итеративно загрузить read_pixel и записать в файл envi; питон3

Я хочу загрузить гиперспектральные данные на пиксель в массив и снова записать этот пиксель, используя Python 3.5. Я хочу что-то вычислить со спектральной информацией этого пикселя.

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

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

1st:

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)

1-й пример не сохраняет изображение, а дает мне код ошибки

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 

2nd:

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()

Во втором примере изображение сохраняется, но пиксель хранится в другом порядке, что искажает мое изображение.


person AnneR    schedule 20.04.2016    source источник


Ответы (2)


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

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)
person AnneR    schedule 21.06.2016

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

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

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

person AriJane    schedule 22.04.2016
comment
Спасибо за ваш ответ. Я пробовал это, а также получил этот намек от коллег. Это сработало и в итоге стало быстрее. Тем не менее не дал мне ожидаемых результатов. На выходе получается изображение только с нулевыми данными. - person AnneR; 18.05.2016