将ENVI标准格式的RAW高光谱图像转换MAT格式

一、RAW文件格式

芬兰SPECIM高光谱采集的数据和其他高光谱相机有些差别。芬兰SPECIM采集到的高光谱数据以RAW格式保存时,数据通常以最原始、未经处理的形式记录下来。RAW格式的数据具有极高的保真度,能够提供详细的光谱信息,适合用于后续的高级处理和分析。在数据文件夹中还包含了设备暗电流和白平衡数据。并且包含了数据的说明文件(XXX.hdr),其中包括数据的层数、尺寸、波段中采样的具体波长等等,可以点开文件查看。


二、将RAW和头文件HDR转换成mat格式的文件

1. 总体步骤

    1. 读取HDR文件:HDR文件包含关于RAW数据的元数据,例如行数、列数、波段数、数据类型等。需要先解析HDR文件以获取这些信息。
    1. 读取RAW文件:根据HDR文件中的信息读取RAW数据。
    1. 转换并保存为MAT文件:使用scipy.io.savemat将数据保存为MAT文件。

2.完整代码

代码如下(示例):

import numpy as np
from scipy.io import savemat

def parse_hdr_file(hdr_file):
    """解析ENVI的HDR文件,返回元数据"""
    metadata = {}
    with open(hdr_file, 'r') as file:
        for line in file:
            if '=' in line:
                key, value = line.strip().split('=')
                key = key.strip().lower()
                value = value.strip()
                if key in ["samples", "lines", "bands"]:
                    metadata[key] = int(value)
                elif key == "data type":
                    metadata[key] = int(value)
                elif key == "header offset":
                    metadata[key] = int(value)
                elif key == "byte order":
                    metadata[key] = int(value)
                elif key == "interleave":
                    metadata[key] = value
                elif key == "band names":
                    metadata[key] = value.strip('{}').split(',')
    return metadata

def read_raw_file(raw_file, hdr_file):
    """读取ENVI的RAW文件,并返回numpy数组"""
    metadata = parse_hdr_file(hdr_file)
    
    dtype_map = {
        1: np.uint8,    # 8-bit byte
        2: np.int16,    # 16-bit signed integer
        3: np.int32,    # 32-bit signed integer
        4: np.float32,  # 32-bit floating point
        5: np.float64,  # 64-bit floating point
        12: np.uint16,  # 16-bit unsigned integer
        13: np.uint32,  # 32-bit unsigned integer
        14: np.int64,   # 64-bit signed integer
        15: np.uint64   # 64-bit unsigned integer
    }
    
    data_type = dtype_map[metadata['data type']]
    samples = metadata['samples']
    lines = metadata['lines']
    bands = metadata['bands']
    interleave = metadata['interleave'].lower()

    # 根据interleave模式读取数据
    if interleave == 'bsq':
        data = np.fromfile(raw_file, dtype=data_type)
        data = data.reshape((bands, lines, samples))
    elif interleave == 'bil':
        data = np.fromfile(raw_file, dtype=data_type)
        data = data.reshape((lines, bands, samples))
        data = np.transpose(data, (1, 0, 2))
    elif interleave == 'bip':
        data = np.fromfile(raw_file, dtype=data_type)
        data = data.reshape((lines, samples, bands))
        data = np.transpose(data, (2, 0, 1))
    else:
        raise ValueError(f"Unsupported interleave type: {interleave}")

    return data

def convert_raw_to_mat(raw_file, hdr_file, mat_file):
    """将RAW文件和HDR文件转换成MAT文件"""
    data = read_raw_file(raw_file, hdr_file)
    savemat(mat_file, {'data': data})

# 具体使用
raw_file = 'your_file.raw'  # 替换为实际的RAW文件路径
hdr_file = 'your_file.hdr'  # 替换为实际的HDR文件路径
mat_file = 'output.mat'     # 输出的MAT文件路径

convert_raw_to_mat(raw_file, hdr_file, mat_file)


3. 具体说明

parse_hdr_file:用于解析HDR文件,提取必要的元数据信息。
read_raw_file:根据HDR文件中的信息读取RAW文件,并根据不同的interleave模式将其转换为相应的NumPy数组。
convert_raw_to_mat:将读取的数据保存为MAT文件。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值