如何在 Python 中将高光谱 .HDR 文件转换为栅格数组并生成镜像图像

本文介绍使用 rasterio 和 spectral 库读取 ENVI 格式高光谱数据(.hdr + 对应原始数据文件),解决 EOFError: read() didn't return enough bytes 错误,并高效生成逐波段镜像图像的完整流程。

本文介绍使用 rasterio 和 spectral 库读取 envi 格式高光谱数据(.hdr + 对应原始数据文件),解决 `eoferror: read() didn't return enough bytes` 错误,并高效生成逐波段镜像图像的完整流程。

高光谱数据常以 ENVI 格式存储,包含一个头文件(.hdr)和一个二进制原始数据文件(如 .raw、.hsi 或无扩展名)。初学者常误用 spectral.io.envi.open() 直接传入 .hdr 路径而忽略关联的原始数据文件,导致 read_band() 报 EOFError——这是因为 spectral 库需同时定位头文件与对应的数据体文件,且对文件路径、字节对齐和数据类型高度敏感。

推荐优先采用 rasterio 读取:它原生支持 ENVI 格式,自动解析 .hdr 元信息,稳定加载为 (bands, height, width) 形状的 NumPy 数组,避免 I/O 错误。而 spectral 加载结果为 (height, width, bands),虽语义更贴近图像思维,但在批量处理或与地理空间工具链(如 rasterio、xarray)协同时,rasterio 的轴序更统一、兼容性更强。

以下为完整可运行示例(请根据实际路径调整):

import rasterio
import numpy as np
import matplotlib.pyplot as plt

# ✅ 正确路径配置:指向原始数据文件(非 .hdr!),rasterio 自动读取同名 .hdr
data_file = r"C:/Users/Desktop/HyperspectralData/raw_rd_rf"  # 注意:不带 .hdr 或 .raw 扩展名(rasterio 会自动查找)
# 若原始文件有明确后缀(如 raw_rd_rf.raw),则写全路径:.../raw_rd_rf.raw

with rasterio.open(data_file) as src:
    # 读取全部波段 → 形状为 (bands, rows, cols)
    cube = src.read()  # e.g., (150, 1024, 1344)
    profile = src.profile  # 保留原始元数据(坐标系、分辨率等)

print(f"数据形状: {cube.shape} → (波段数, 行数, 列数)")
print(f"波段数量: {src.count}")

若需获取波长信息,再用 spectral 加载头文件(仅解析元数据,不读取像素):

Kaiber

Kaiber是一个视频生成引擎,用户可以根据自己的图片或文字描述创建视频

下载

import spectral

hdr_file = r"C:/Users/Desktop/HyperspectralData/raw_rd_rf.hdr"
img = spectral.io.envi.open(hdr_file, image=data_file)  # 第二个参数必须是原始数据路径!
wavelengths = np.array(img.bands.centers)  # 单位通常为 nm
print(f"波长范围: {wavelengths[0]:.1f}–{wavelengths[-1]:.1f} nm")

生成镜像图像(水平翻转,即沿垂直轴左右镜像):

# 对第 0 波段做镜像(使用 np.fliplr,高效且内存友好)
band_0_mirror = np.fliplr(cube[0])  # shape: (rows, cols)

# 可视化对比
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.imshow(cube[0], cmap='viridis')
ax1.set_title("原始波段 0")
ax1.axis('off')

ax2.imshow(band_0_mirror, cmap='viridis')
ax2.set_title("镜像波段 0(左右翻转)")
ax2.axis('off')
plt.tight_layout()
plt.show()

⚠️ 关键注意事项

  • rasterio.open() 的参数必须是原始数据文件路径(如 raw_rd_rf 或 raw_rd_rf.raw),不是 .hdr 文件;它会自动匹配同目录下的 .hdr。
  • spectral.io.envi.open(hdr_path, image=raw_path) 中两个路径必须严格对应,且 raw_path 需指向真实存在的二进制文件。
  • np.fliplr() 适用于 (rows, cols) 二维图像;若处理整立方体,可用 cube[:, ::-1, :] 实现所有波段同步水平翻转。
  • 如需保存镜像结果为 GeoTIFF,可复用 profile 并更新 transform(若含地理参考),调用 rasterio.open(..., 'w', **profile) 写入。

通过此方法,您可稳定加载高光谱数据、规避 EOF 错误,并灵活实现单波段或全波段镜像操作,为后续辐射定标、特征提取或数据增强奠定可靠基础。

相关推荐:

抖音镜像翻转怎么设置 视频画面左右反转对过审的作用

抖音镜像翻转可在拍摄、直播或剪映后期实现:拍摄时需在“+”页→道具→搜索“左右镜像”并提前启用特效;直播中通过“⋯”→功能设置开启画面镜像;剪映则导入视频后点击“编辑”→“镜像”完成水平翻转。 抖音镜像翻转设置能改变视频画面的左右朝向,常用于规避平台对重复内容或搬运视频的识别机制,但需注意该操作本身不构成原创性提升,仅影响画面空间逻辑。 拍摄时启用镜像特效 打开抖音App,点击底部【+】进入拍摄页...

PowerISO怎么提取ISO文件内容 PowerISO镜像解压方法【技巧】

PowerISO可直接提取ISO文件:主界面打开ISO后通过【工具】→【提取】批量导出全部内容;右键菜单支持快速提取到当前文件夹、指定路径或自动建同名文件夹;亦可多选指定文件/文件夹单独提取。 要用PowerISO把ISO镜像里的文件拿出来,不需要先挂载、也不用改后缀名,直接在软件里点几下就能完成全部提取操作,整个过程不依赖系统自带功能或第三方解压工具。 用PowerISO主界面提取ISO全部内容...

iPhone 17怎么关闭镜像翻转 苹果17前置自拍镜像关闭方法

iPhone 17前置自拍左右颠倒是因为默认开启“镜像前置镜头”,关闭后新照片按真实方向保存,预览仍镜像以便构图;可通过设置、照片编辑或快捷指令三种方式解决。 iPhone 17前置自拍照片左右颠倒、文字反向、妆容细节错位,是因为系统默认开启“镜像前置镜头”功能,导致成片方向与真实面部左右相反;关闭该开关后,新拍摄的自拍照将按物理真实方向保存,预览画面仍保持镜像以便构图——这是苹果保留的交互逻辑,...

卡厄思梦境光谱方块是什么-卡厄思梦境光谱方块介绍

卡厄思梦境光谱方块是一类极具幻想魅力的核心游戏机制,它构筑出一个如梦似幻的异想世界,引领玩家踏上一段别开生面的探索征程。 这些光谱方块拥有层次分明、各具特色的内在属性。单从视觉维度而言,色彩即语言——每种色调都对应着截然不同的能量本质。譬如,赤色方块往往承载着狂暴的烈焰之力,可在战斗中迸发灼烧敌人的高温火浪;靛蓝方块则常与深邃的水元素共鸣,既能掀起激荡水击,亦能凝结出坚不可摧的液态护盾;而翠绿方块...

谷歌搜索引擎镜像站点推荐-谷歌搜索引擎备用访问链接合集

谷歌搜索引擎镜像站点推荐包括https://www.google.com.hk,该站点面向中文用户优化,响应快、支持全功能、HTTPS加密稳定、多终端兼容、内容更新及时且无障碍支持完善。 谷歌搜索引擎镜像站点推荐-谷歌搜索引擎备用访问链接合集,这是不少网友都关注的,接下来由PHP小编为大家带来谷歌搜索引擎镜像站点推荐-谷歌搜索引擎备用访问链接合集,感兴趣的网友一起随小编来瞧瞧吧! https://...

雅虎搜索引擎镜像访问链接-雅虎搜索引擎搜索首页直达页面

雅虎搜索引擎首页直达链接为https://search.yahoo.com/,界面简洁、响应迅速,支持多语言搜索与隐私保护,无需登录即可使用全部基础功能。 雅虎搜索引擎镜像访问链接-雅虎搜索引擎搜索首页直达页面在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来雅虎搜索引擎镜像访问链接,感兴趣的网友一起随小编来瞧瞧吧! https://search.yahoo.com/ 界面简洁性与操作响应...

iPhone拍照如何关闭镜像?苹果手机前置摄像头自拍镜像设置开关

iPhone前置自拍左右颠倒属iOS默认镜像功能,非故障;可通过设置关闭“镜像前置镜头”、辅助功能中开启“镜像照片”、快捷指令自动化、第三方相机App或照片编辑水平翻转五种方法解决。 如果您使用iPhone前置摄像头自拍时发现照片中文字、Logo、配饰或面部特征左右颠倒,即呈现镜面翻转效果,这并非设备故障,而是iOS系统默认启用“镜像前置镜头”功能所致。以下是关闭该镜像效果的多种方法: 一、通过相...