2016-04-20 2 views
2

Je veux charger des données hyperspectrales par pixel dans un tableau et réécrire ce pixel en utilisant Python 3.5. Je veux calculer quelque chose avec l'information spectrale de ce Pixel.Comment charger itérativement read_pixel et écrire dans le fichier envi; python3

J'ai essayé deux façons différentes et les deux ne fonctionnent pas comme je le veux. Tout d'abord, j'ai mis à jour le paquet spectral depuis la dernière version a été déclaré ne pas travailler avec itérativement envi.save_image mais mon approche ne fonctionne pas. Deuxièmement mes deux approches ne sont pas très bonnes avec mon double pour boucle - Je sais - Si quelqu'un pouvait m'aider s'il vous plaît sur mon problème.

1er:

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) 

1er exemple ne sauve pas l'image me donne plutôt le code d'erreur

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ème:

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

Le deuxième exemple enregistre l'image mais les magasins le Pixel dans un ordre différent et salit mon image.

Répondre

-1

Je dois dire à l'avance que je ne suis pas familier avec le paquet spectral et envi et que je ne peux malheureusement pas offrir une solution prête à l'emploi. En outre, je ne suis pas sûr si j'ai bien compris ce que vous essayez de faire avec votre image. Mais juste quelques réflexions: Est-ce que la fonction write/save à l'intérieur de la boucle for peut causer votre problème, car chaque pixel est traité exactement de la même manière et il est écrasé? Je ne peux pas me rapporter à l'IndexError cependant. Peut-être que vous avez besoin d'une fonction où vous pouvez écrire un certain pixel sur une image vide en passant également par i et j. Une deuxième option pourrait consister à enregistrer chaque pixel dans un tableau et à l'enregistrer immédiatement dans une image après la boucle for.

+0

Nous vous remercions de votre réponse. J'ai essayé ceci et ai également obtenu cet indice de collègues. Cela a fonctionné et était plus rapide à la fin. Ne m'a toujours pas donné les résultats que j'attendais. La sortie est une image avec seulement zéro donnée. – AnneR

1

Voilà donc la solution très courte, rapide et facile grâce à un collègue.

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)