一、RAW文件格式
芬兰SPECIM高光谱采集的数据和其他高光谱相机有些差别。芬兰SPECIM采集到的高光谱数据以RAW格式保存时,数据通常以最原始、未经处理的形式记录下来。RAW格式的数据具有极高的保真度,能够提供详细的光谱信息,适合用于后续的高级处理和分析。在数据文件夹中还包含了设备暗电流和白平衡数据。并且包含了数据的说明文件(XXX.hdr),其中包括数据的层数、尺寸、波段中采样的具体波长等等,可以点开文件查看。
二、将RAW和头文件HDR转换成mat格式的文件
1. 总体步骤
-
- 读取HDR文件:HDR文件包含关于RAW数据的元数据,例如行数、列数、波段数、数据类型等。需要先解析HDR文件以获取这些信息。
-
- 读取RAW文件:根据HDR文件中的信息读取RAW数据。
-
- 转换并保存为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文件。