2016-04-20 5 views
2

Ich möchte hyperspektrale Daten pro Pixel in ein Array laden und dieses Pixel wieder mit Python 3.5 schreiben. Ich möchte etwas mit der spektralen Information dieses Pixels berechnen.Wie lese ich read_pixel und schreibe in envi file; python3

Ich habe zwei verschiedene Möglichkeiten ausprobiert und beide funktionieren nicht so, wie ich es möchte.

Zuerst habe ich Spektralpaket aktualisiert, da die letzte Version angegeben wurde, nicht mit iterativ envi.save_image zu arbeiten, aber immer noch funktioniert mein Ansatz nicht. Zweitens meine Ansätze sind beide nicht sehr gut mit meinem Doppel For-Schleife - ich weiß - Wenn jemand könnte bitte helfen Sie mir auf mein Problem.

1. Platz:

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) 

erstes Beispiel gibt mir nicht das Bild speichern und nicht den Fehlercode

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

Das zweite Beispiel speichert das Bild, sondern speichern das Pixel in einer anderen Reihenfolge und vermasselt mein Bild.

Antwort

-1

Ich muss im Voraus sagen, dass ich mit dem Spektralpaket und envi nicht vertraut bin und daher leider keine fertige Lösung anbieten kann. Außerdem bin ich mir nicht sicher, ob ich richtig verstanden habe, was Sie mit Ihrem Bild zu tun versuchen.

Aber nur ein paar Gedanken: Könnte die Schreib/Speicherfunktion in der for-Schleife Ihr Problem verursachen, weil jedes Pixel genau so behandelt wird und es überschrieben wird? Ich kann mich jedoch nicht auf den IndexError beziehen.

Vielleicht brauchen Sie eine Funktion, wo Sie eher ein bestimmtes Pixel in ein leeres Bild schreiben können, indem Sie auch i und j übergeben. Eine zweite Option könnte sein, jedes Pixel in einem Array zu speichern und es sofort nach der for-Schleife in einem Bild zu speichern.

+0

Vielen Dank für Ihre Antwort. Ich habe das versucht und auch diesen Tipp von Kollegen bekommen. Das hat funktioniert und war am Ende schneller. Trotzdem gab ich mir nicht die Ergebnisse, die ich erwartet hatte. Die Ausgabe ist ein Bild mit nur Null Daten. – AnneR

1

Das ist also die sehr kurze, schnelle und einfache Lösung dank eines Kollegen.

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) 
Verwandte Themen