Python中将高光谱.HDR文件转为栅格数组并生成镜像的问题
问题分析与解决方法
1. 先修正文件路径的错误
你代码里envi.open的参数用错了:
- 你把文件夹路径传给了
hdr_file_path,但应该直接传.hdr文件的完整路径,比如'C:/Users/Desktop/HyperspectralData/raw_rd_rf.hdr' - 第二个参数
image是用来指定raw数据文件(当hdr里没写对应文件名时),你却传了hdr文件名,导致程序找不到正确的原始数据,才会报字节数不足的错误
修正后的打开代码:
import spectral.io.envi as envi import os # 直接指定hdr文件的完整路径 hdr_file_path = 'C:/Users/Desktop/HyperspectralData/raw_rd_rf.hdr' hdr_data = envi.open(hdr_file_path)
2. 检查HDR元数据和实际数据是否匹配
如果路径改了还是报错,大概率是.hdr文件里的元数据和实际raw数据不匹配:
- 打开
.hdr文本文件,核对以下字段:lines(对应代码里的nrows)、samples(ncols)、bands:数值要和实际数据的维度完全一致data type:比如1是8位无符号整数,2是16位有符号整数,必须和raw数据的存储类型匹配interleave:确认是bil/bip/bsq,spectral库得正确识别交错格式才能读对数据
3. 生成镜像并保存栅格文件的正确代码
路径和元数据都没问题后,读取单波段并生成镜像(翻转矩阵)的代码可以这么写:
import numpy as np import rasterio from rasterio.transform import Affine rows, cols, bands = hdr_data.nrows, hdr_data.ncols, hdr_data.nbands for z in range(bands): # 读取单个波段 band_img = hdr_data.read_band(z) # 生成垂直镜像(上下翻转),要水平镜像就用np.fliplr() mirrored_band = np.flipud(band_img) # 保存为TIFF栅格文件 with rasterio.open( f'C:/Users/Desktop/HyperspectralData/mirrored_band_{z+1}.tif', 'w', driver='GTiff', height=rows, width=cols, count=1, dtype=band_img.dtype, crs=None, # 有坐标系的话可以在这里指定 transform=Affine.identity(), ) as dst: dst.write(mirrored_band, 1)
4. 额外排查点
- 确认raw数据文件(比如和hdr同名的
.dat文件或者无后缀文件)在同一个文件夹里,且文件没损坏 - 如果raw数据是压缩格式,确认spectral库支持该压缩方式
内容的提问来源于stack exchange,提问作者zanul888
相关产品推荐
相关产品推荐

