• 关于ENVI遥感影像的hdr元数据信息设置与读取(C++ 、Python)


    最近在做遥感影像高光谱纠正部分,要求输出ENVI格式(*.img),ENVI格式影像一般包括img文件(*.img)和hdr文件(*.hdr)两部分组成

    C++ 基于GDAL获取ENVI格式影像元数据

    C++常规做法使用GDAL获取元数据信息,然后再设置元数据,下面这段代码是基于GDAL的,前面初始化影像部分这里就不展示了,代码如下:

    char** SrcMeta = SrcRCPImg->m_SrcImg->poDataset->GetMetadataDomainList();#获取所有元数据
    
    //输出预览元数据
    if (SrcMeta != nullptr) {//遍历输出
    		for (int i = 0; SrcMeta[i] != nullptr; i++) {
    			// 遍历元数据
    			printf("%d:%s:", i, SrcMeta[i]);
    			char** testTemp = SrcRCPImg->m_SrcImg->poDataset->GetMetadata(SrcMeta[i]);
    			//char** testTemp = poDataset->GetMetadata(SrcMeta[i]);
    			//cout << testTemp << endl;
    
    			for (char** ppMetadataDomain = testTemp; *ppMetadataDomain != nullptr; ppMetadataDomain++) { cout << "- " << *ppMetadataDomain << endl; }
    		}
    	}
    
    //只设置“ENVI”元数据信息
    if (strcmp(OutImgFormat, "ENVI") == 0)
    	{//如果是ENVI格式,则需要把ENVI元数据拷贝出去
    		printf("Set ENVI Metadata!\n");
    		char** testTemp = SrcRCPImg->m_SrcImg->poDataset->GetMetadata("ENVI");
    		OutImg.poDataset->SetMetadata(testTemp, "ENVI");
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在实际预览的时候就发现这种方法获取到的元数据不完整,把波段信息字段都丢失了,导致很多信息没有,如下图:
    在这里插入图片描述

    我使用pthon的GDAL获取元数据是一样的,这可能是GDAL的一个bug吧,于是我查阅很多资料后,发现python另一个库可以很好解决这个问题

    python基于 spectral库进行解析ENVI元数据

    使用方法如下,我封装成了函数

    import spectral#解析hdr文件元数据库  pip install spectral
    import os
    
    def ReWriteHDR(SrcHDR_path,OrthoHDR_path,OutDir):
        OutHdrPath = os.path.join(OutDir,os.path.basename(OrthoHDR_path))
        HDRInfoDic = spectral.envi.read_envi_header(SrcHDR_path)#只需要*.hdr文件即可读取
        OrthoHDRDic = spectral.envi.read_envi_header(OrthoHDR_path)
    
        # HDRInfo = spectral.open_image(SrcHDR_path)#如果*.img文件存在,可以使用
        # OrthoHDR = spectral.open_image(OrthoHDR_path)
        NewMetaDataDic = OrthoHDRDic  # 把纠正的元数据给NewMetaDataDic
        # 重写新的键值对
        NewMetaDataDic["band names"] = HDRInfoDic["band names"]
        NewMetaDataDic["wavelength"] = HDRInfoDic["wavelength"]
        NewMetaDataDic["fwhm"] = HDRInfoDic["fwhm"]
        NewMetaDataDic["bbl"] = HDRInfoDic["bbl"]
        spectral.envi.write_envi_header(OutHdrPath, NewMetaDataDic)
        print("Success:",OutHdrPath)
        
    if __name__ == '__main__': 
        SrcHDR_path = "C:/Src.hdr"
        OrthoHDR_path= "C:/Ortho.hdr"
        OutDir="D:/temp"
        ReWriteHDR(SrcHDR_path,OrthoHDR_path,OutDir)#输出文件夹里导出了Ortho.hdr文件
        print("All done")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Mysql挂掉怎么办
    蓝牙基础-简述
    前端模块化开发
    机器学习知识总结 —— 15. 什么是支持向量机(对偶问题、核技巧)?
    Python字典(dict)的操作方法汇总(约18种操作方法),并附示例代码
    20240620日志:TAS-MRAM的电阻开放分析
    卷积、填充、步长;卷积神经网络的卷积核大小、个数,卷积层数如何确定呢;深度学习如何调参;
    MyBatis的二级缓存
    ElasticSearch集群搭建
    数据的内存分布笔记总结
  • 原文地址:https://blog.csdn.net/weixin_42727069/article/details/138120593