You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:48:31