• 关于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
  • 相关阅读:
    简单的UDP网络程序
    Python基于宽度优先搜索的程序综合-SyGus求解器
    y49.第三章 Kubernetes从入门到精通 -- k8s实战案例(二二)
    让reviewdog支持gitlab-push-commit,守住代码质量下限
    __builtin_expect(x,0)
    原生小程序开发大坑component的生命周期函数created中setData无效(小程序弹层代码封装)
    图机器学习在蚂蚁集团推荐业务中的应用
    计算机毕业设计Java大学生就业招聘系统(源码+系统+mysql数据库+lw文档)
    【学习笔记】ARC147/ARC141/ARC145
    Android入门第6天-RelativeLayout
  • 原文地址:https://blog.csdn.net/weixin_42727069/article/details/138120593