首页 > 其他分享 >【正在编辑中...】ENVI56扩展工具:添加自定义光谱指数——以NDWI和NDBSI为例

【正在编辑中...】ENVI56扩展工具:添加自定义光谱指数——以NDWI和NDBSI为例

时间:2024-07-25 10:54:22浏览次数:18  
标签:... swir1 自定义 为例 指数 NDBSI json green nir

本工具适用于ENVI 5.6及以上版本(本人测试最低版本为5.6.3)。

ENVI内置了上百种指数公式,但是大家在使用过程中肯定会有自定义指数的需求。在之前只能通过波段运算工具实现指数计算,现在可以通过本工具方便的添加自定义光谱指数,然后可以通过如下工具或API使用新指数:

  • 光谱指数工具:Toolbox/Band Algebra/Spectral Indices

  • 虚拟栅格APIENVISpectralIndexRaster

  • ENVITask APISpectralIndex、SpectralIndices

 

1 安装工具

方法1使用 ENVI App Store 进行 ENVI 扩展工具的安装与管理。

App Store 下载地址:https://envi.geoscene.cn/appstore

 

方法2手动下载安装 https://envi.geoscene.cn/appstore/addssclces

 

2 以NDWI为例

2.1 添加指数

ENVI中其实内置了一个NDWI指数(公式如下),由于使用了不太常见的1241nm波段,所以不太实用。

还有另一个NDWI指数公式,用到了最常见的绿波段和近红外波段,所以更加实用。

NDWI = (green-nir)/(green+nir)

下面介绍添加方法。

新建一个文本文件,重命名为NDWI2.json,内容为JSON格式,包含如下信息(建议严格区分大小写):

{
    "NDWI2": {
        "name": "Normalized Difference Water Index 2",
        "type": ["Vegetation", "Canopy Water Content", "Normalized"],
        "equation": "(green - nir) / (green + nir)",
        "bands": ["green", "nir"]
    }
}

或者可以直接下载NDWI2.json文件:https://envi.geoscene.cn/spectral_indices

其中,

  • name指数名称,保持唯一(不能与ENVI内置指数name一样),将显示在Spectral Indices工具面板中,建议尽量规范。

  • type指数类型,可选项为Broadband Greenness、Canopy Nitrogen、Canopy Water Content、Dry or Senescent Carbon、Gas、Leaf Pigments、Light Use Efficiency、Mineral、Narrowband Greenness、Normalized、Vegetation。其中Normalized表示归一化指数。

  • equation指数公式,运算符(加减乘除等)前后必须加空格。变量名使用波段标识(双击运行Toolbox/Band Algebra/View Band Names and Wavelength Ranges,查看可用的波段标识、波长范围、中心波长)。

  • bands列出公式中使用的所有波段标识。

 

在Toolbox中,双击运行/Band Algebra/Add Custom Spectral Indices,再弹出的对话框中选择刚才编辑好的NDWI2.json文件,点击OK,自动添加指数并弹出提示。

注:本工具可一次性选择多个json文件,每个json文件中也可包含多个指数信息。

 

2.2 使用指数

2.2.1 工具中使用

启动工具Toolbox/Band Algebra/Spectral Indices,选择多光谱图像,选择新添加的Normalized Difference Water Index 2指数,设置输出路径,点击OK执行。

 

如下图所示,左图为多光谱图像,右图为NDWI计算结果。

 

2.2.2 调用虚拟栅格接口

 

2.2.3 调用ENVITask接口

可以调用SpectralIndexSpectralIndices两个Task计算NDWI2,语法类似。

 

3 以NDBSI为例

干度指标(NDBSI)可由裸土指数SI和建筑指数IBI合成,常用于RSEI生态环境监测中。公式如下:

式中,b2、b3、b4、b8、b11分别为哨兵2数据B2(490nm - blue)、B3(560nm - green)、B4(665nm - red)、B8(842nm - nir)、B11(1610nm – swir1)波段的反射率。

为了在json文件中更清晰的编辑公式,把公式修改为如下格式:

SI = (tmp1 - tmp2) / (tmp1 + tmp2)

tmp1 = b11 + b4

tmp2 = b8 + b2

IBI = (tmp3 - tmp4) / (tmp3 + tmp4)

tmp3 = 2.0 * b11 / (b11 + b8)

tmp4 = b8 / (b8 + b4) + b3 / (b3 + b11)

替换为波段标识,整理最终公式如下:

NDBSI = ((tmp1 - tmp2) / (tmp1 + tmp2) + (tmp3 - tmp4) / (tmp3 + tmp4)) / 2.0

tmp1 = swir1 + red

tmp2 = nir + blue

tmp3 = 2.0 * swir1 / (swir1 + nir)

tmp4 = nir / (nir + red) + green / (green + swir1)

 

新建一个文本文件,重命名为NDBSI.json,内容为JSON格式,包含如下信息(建议严格区分大小写):

{
    "NDBSI": {
        "name": "Normalized Difference Built-Up and Soil Index",
        "type": ["Vegetation", "Normalized"],
        "equation": "((tmp1 - tmp2) / (tmp1 + tmp2) + (tmp3 - tmp4) / (tmp3 + tmp4)) / 2.0; tmp1 = swir1 + red; tmp2 = nir + blue; tmp3 = 2.0 * swir1 / (swir1 + nir); tmp4 = nir / (nir + red) + green / (green + swir1)",
        "bands": ["blue", "green", "red", "nir", "swir1"]
    }
}

或者可以直接下载NDBSI.json文件:https://envi.geoscene.cn/spectral_indices

注:此指数的公式有些特殊,使用“;”分隔了几个公式。其中第1个公式为主公式,变量使用tmpX标识,后边的几个公式指明了tmpX的计算公式,这样的好处是公式更简洁。

 

在Toolbox中,双击运行/Band Algebra/Add Custom Spectral Indices,在弹出的对话框中选择刚才编辑好的NDBSI.json文件,点击OK,自动添加指数并弹出提示,重启ENVI即可使用。

注:本工具可一次性选择多个json文件,每个json文件中也可包含多个指数信息。

 

如下图所示,左图为多光谱图像,右图为NDBSI计算结果。

标签:...,swir1,自定义,为例,指数,NDBSI,json,green,nir
From: https://www.cnblogs.com/enviidl/p/18322503

相关文章

  • 自定义菜单未显示在 odoo 门户视图上
    我想在odoo门户视图上显示自定义菜单。XML文件:<?xmlversion="1.0"encoding="UTF-8"?><odoo><data><templateid="portal_my_home_loan"name="PartnerLoan"customize_show="True"inh......
  • vue 2 实现自定义组件一到多个v-model双向数据绑定的方法(转)
    原文链接:https://blog.csdn.net/Dobility/article/details/110147985前言有时候我们需要对一个组件绑定自定义v-model,以更方便地实现双向数据,例如自定义表单输入控件。甚至有时候,我们想要实现绑定多个“v-model”,也就是多个“双向绑定”,例如带表单输入的模块框,想同时控制模态......
  • 几天没开启防盗链,花费 500 块......
    几天没开启防盗链,花费500块......‍‍2024年5月底,我因为在其他地方同步博客,为了方便就关闭了防盗链。然后过了几天,费用就有500+了.....:​‍‍而之前的账单都是才几块钱:​‍‍那几天确实是大意了,一下子花了好多钱。开启防盗链后访问量、带宽都激增了好多,这还是我......
  • 在 Gerrit 的 REST API 中,如何查找补丁集 ID 值?我有 url.../details Json 但在那里找
    我正在使用request.get来获取Json,并想使用最新的补丁集和扩展名/revisions/(patchSetNumber)/files再次执行此操作以查找所有修改的文件。我无法弄清楚如何通过请求找到补丁集ID。我尝试通过url/details扩展进行搜索,但无法找到修订选项卡或补丁集选项卡是对的,Ger......
  • Flask-WTF:如何在 Flask FormField 中定义自定义变量
    我正在尝试在Flask中设置一个动态表单,其中该表单具有动态填充的FormFieldsFieldList。虽然大部分都有效,但我不断遇到每个FormField的变量问题。我需要每个FormField有一个标签,它是FormField的名称(并在页面上呈现)和一个在显示/隐藏脚本中使用的自定义ID,该脚本使用动态......
  • 一文弄清楚自定义流程表单开发的多个优势特征
    随着行业竞争的激烈化,很多企业都希望实现降本、提质、增效的发展目的。什么样的软件平台可以帮助企业实现这一目标?低代码技术平台、自定义流程表单开发拥有可视化界面、易操作、更灵活等优势特点,在助力降本增效的过程中事半功倍,深得客户喜爱。要了解它的重要性,可以先学习它的定义......
  • SpringSecurity:hasAuthority与自定义权限校验
    springsecurity中有两种权限控制方法1.基于注解@PreAuthorize("hasAuthority('syst:add')")他的作用是在controller方法上进行权限校验,如果该用户具有对应的权限则放行,否则抛出AccessDeniedHandler,403(权限不足)2.基于配置//基于配置的权限控制http......
  • 25 Docker网络管理_自定义网络
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。​   专栏:java全栈C&C++Python......
  • 求解!do...while 语句嵌套switch语句为何会出现死循环?
    这是我写的一段实现通讯录的代码voidmenu(){ printf("**************************************\n"); printf("*******1.Add2.Del*****\n"); printf("*******3.Search4.Modify*****\n"); printf("*******5.Show......
  • 达梦dmp导出导入命令包含特殊字符例子(以密码包含#为例)
    1WINDOWS导出导入1.1导出达梦客户端目录\dexp.exeuserid=TEST/\"TEST#12345678\"@10.10.100.100:5237DIRECTORY=D:\1FILE=dm_exp_test_10.dmpCOMPRESS=YLOG=dm_exp_test_10.log1.2导入--TABLE_EXISTS_ACTION=TRUNCATE对dimp不生效,如果需要truncate表数据后导入,自行......