首页 > 其他分享 >将ENVI标准格式的RAW高光谱图像转换MAT格式

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

时间:2024-08-30 12:56:33浏览次数:11  
标签:file MAT raw RAW key np 格式 data metadata

一、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文件。

标签:file,MAT,raw,RAW,key,np,格式,data,metadata
From: https://blog.csdn.net/2301_79647504/article/details/141714976

相关文章

  • DrawGrid1自画图标和文本
    通过网盘分享的文件:DrawGrid.rar链接:https://pan.baidu.com/s/1ihZ1wFkPEVxr4v02dgMFVA提取码:81etprocedureTForm8.FormCreate(Sender:TObject);beginDrawGrid1.FixedRows:=0;DrawGrid1.FixedCols:=0;//去掉固定列DrawGrid1.RowCount:=3;......
  • 20240827_102249 python 认识csv格式
    目标认识csv格式制作一个csv文件示例......
  • 求两点间最短路的Dijkstra算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################设源点为u0u_{0}u0​,目标......
  • 基于奇异值分解的MVDR算法功率谱估计附Matlab代码
    MVDR(MinimumVarianceDistortionlessResponse)算法是一种常用于信号处理领域的功率谱估计方法,该算法利用奇异值分解(SingularValueDecomposition,SVD)来实现对信号的空间滤波,从而提高功率谱估计的准确性和可靠性,本文将介绍MVDR算法的原理并提供使用Matlab编写的源代码示例。MV......
  • FSK调制的MATLAB源码程序
    以下是一个用MATLAB编写的FSK调制源码程序示例:%清空工作区和命令窗口clear;clc;%定义基本参数fs=1000;%采样率T=1;%总传输时间t=0:1/fs:T-1/fs;%时间向量f1=100;%第一个频率f2=200;%第二个频率%定义消息信号message=[01011......
  • 【机器人学】7-3.六自由度机器人自干涉检测-圆柱体的旋转变换【附MATLAB代码】
        前言        上一章确定了机械臂等效的圆柱体的上下圆心坐标,这篇文章将解决算法三个核心中的第二个核心:        一 根据机械臂的几何数据以及DH参数,确定机械臂等效的圆柱体的上下圆心坐标。        二 将一个圆柱......
  • 【目标检测数据集】瓶子分类识别数据集1万张3类VOC+YOLO格式(玻璃瓶金属瓶塑料瓶数据集
     数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):10106标注数量(xml文件个数):10106标注数量(txt文件个数):10106标注类别数:3标注类别名称:["glass-bottle","metal-bottle","p......
  • 【目标检测数据集】道路下水井盖破损丢失完好检测数据集2890张4类别VOC+YOLO格式
     数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):2890标注数量(xml文件个数):2890标注数量(txt文件个数):2890标注类别数:4标注类别名称:["broke","good","lose","uncovered"]......
  • Comsol&Matlab 扩张式消声器理论解及仿真解
    简单扩张式消声器是工业中广泛采用的一类抗性消声器。扩张式消声器是一种常见的声学装置,用于减少噪音和消除声音的回声。它通常由一系列管道和腔体组成,通过利用声波的传播特性来实现消声效果。扩张式消声器的工作原理基于声波的干涉和相消干涉。当声波进入消声器的管道时,管道......
  • Comsol&Matlab 两级串联扩张式消声器仿真解与解析解
        消声器的声学性能通常要求消声器在工作频率范围内有较大的消声量以及较宽的消声频带。常用的消声器声学性能评价指标通常有传递损失、插入损失、减噪量三种。其中插入损失只能反映整个系统在安装消声器前后声学特性的变化,并不能直接反映消声器本身单独具有的属性。减......