我想将每个像素的高光谱数据加载到数组中,然后使用Python 3.5再次写出这个像素。我想用这个像素的光谱信息来计算一些东西。
我尝试过两种不同的方法,但两种方法都不按我想要的方式工作。
首先,我更新了光谱包,因为上一版本被声明不能与迭代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
第二
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并弄乱我的图像。
答案 0 :(得分: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)
答案 1 :(得分:-1)
我必须提前说我不熟悉频谱包和envi,因此遗憾的是无法提供现成的解决方案。此外,我不确定我是否正确理解你想要对你的形象做些什么。
但只是一些想法:for循环中的写/保存功能是否会导致您的问题,因为每个像素都以完全相同的方式处理并被覆盖?但我无法与IndexError相关。
也许您需要一个函数,您可以将某个像素写入一个空图像,同时传递i和j。第二个选项可以是保存数组中的每个像素,并在for循环后立即将其保存到图像中。