BandMathX

这个应用程序对多个多波段图像执行数学运算。

描述

此应用程序对多个多波段图像执行数学运算,并将结果输出到图像(多波段或单波段,而不是 BandMath OTB-应用程序)。数学公式由muParserX库完成。

有关muParserX的功能和语法的列表,请访问 [1] 。

与muParser相反(因此 BandMath OTB-应用程序 [2] ),muParserX支持矢量表达式,允许输出多波段图像。

以下是muParserX语法的简要参考

基本面

可以使用以下命令来编写公式:

  • 数值(2.3、-5、3.1e4、...)
  • 包含像素值的变量(请注意输入从1到N的索引)。第一个输入图像的示例:
    • im1 来自第一个输入的像素,由n个分量(n个波段)组成
    • im1b2 来自第一个输入的像素的第二个分量(波段索引从1开始)
    • im1b2N3x4 像素的3x4像素邻接像素从第一个输入开始的像素的第二个分量
    • im1PhyX 第一个输入的水平(X轴)间距。
    • im1PhyY 第一个输入输入的垂直(Y轴)间距。
    • im1b2Mean 第一个投入的第二个组成部分的平均值(全球统计)
    • im1b2Mini 第一个输入的第二个分量的最小值(全局统计)
    • im1b2Maxi 第一个输入的第二个分量的最大值(全局统计)
    • im1b2Sum 第一个投入的第二个组成部分的总和(全球统计)
    • im1b2Var 第一个投入的第二个分量的方差(全局统计)
    • idxXidxY 是当前像素的索引(泛型变量)
  • 二元运算符:
    • + 此外, - 减法, * 乘法, / 分部
    • ^ 将x乘以y的幂
    • < 少于, > 大于, <= 小于或等于, >= 大于或等于
    • == 平等, != 不相等
    • 逻辑运算符: orandxor
    • 位操作: & (和), | (或), << (左移)和 >> (右移位)*IF-THEN-ELSE运算符: (condition ? value_true : value_false)
  • 函数:ABS()、exp()、log()、sin()、cos()、min()、max()、...

请始终记住,此应用程序只处理数学上定义良好的公式。例如,不可能将不同维度的向量相加(例如,行向量与列向量相加)、或向量或矩阵的标量相加、或将两个向量相除等。

因此,重要的是要记住,n个分量的像素始终表示为行向量。

示例:
im1 + im2 表示第一个和第二个输入的像素相加。只有当两个输入具有相同的频带数时,该表达式才是一致的。

请注意,也可以使用以下表达式来获得相同的结果:

  • im1b1 + im2b1
  • im1b2 + im2b2
  • ..。

然而,到目前为止,第一个表达要令人愉快得多。我们将这一新功能称为‘批处理模式’(以带到带的方式执行相同的操作)。

涉及像素邻域的运算

另一项新功能是可以执行涉及像素邻域的操作。与此类邻域相关的变量始终定义在 imIbJNKxP 模式,其中:

  • I 是标识图像输入的数字(记住,INPUT#0=IM1,依此类推)
  • J 是标识波段的数字(请记住,第一个波段的索引为1)
  • KxP 是表示邻域大小的两个数字(第一个与水平方向相关)

注:所有邻里居中,因此 KP 一定是奇数。

许多运营商都附带了这一新功能:

  • Dotpr
  • 小气
  • 变量
  • 中位数
  • Vmin
  • VMAX
  • 等。

例如,如果 im1 表示3个波段图像的像素::

im1 - mean( im1b1N5x5, im1b2N5x5, im1b3N5x5 )

可以表示高通滤波器(请注意,通过隐含三个邻域,运算符Mean返回三个分量的行向量。这是该应用程序的许多操作员的典型行为)。

除了前面的运营商外,还可以使用其他运营商:

  • 来自muParserX的现有运算符/函数,最初不是为向量和矩阵(例如cos,sin)定义的。这些新的运算符/函数保留了我们添加了前缀的原始名称 v 对于向量 (vcosvsin 等)
  • multdivpow 运算符,用于执行向量/矩阵的元素乘法、除法或指数运算(例如 im1 div im2 )。
  • mltdvpw 运算符,用于执行向量/矩阵与标量的乘法、除法或指数运算(例如 im1 dv 2.0 )。
  • bands, which is a very useful operator. It allows selecting specific bands from an image, or to rearrange them in a new vector (e.g.``bands( im1, { 1, 2, 1, 1 } )`` produces a vector of 4 components made of band 1, band 2, band 1 and band 1 values from the first input.

请注意,必须使用花括号才能选择所需的频带索引。

应用程序本身

应用程序可以使用随 -exp 参数。它还可以使用定义变量和表达式的输入上下文文件。下面给出一个上下文文件的示例:

#F expo 1.1
#M kernel1 { 0.1 , 0.2 , 0.3; 0.4 , 0.5 , 0.6; 0.7 , 0.8 , 0.9; 1 , 1.1, 1.2; 1.3 , 1.4 , 1.5 }
#E $dotpr( kernel1, im1b1N3x5 ); im2b1^expo$

正如我们所看到的,#I/#F允许定义整型/浮点型常量,而#M允许定义向量/矩阵。在后一种情况下,行的元素必须用逗号分隔,行必须用分号分隔。还可以使用#E<expr>在同一个txt文件中定义表达式(参见下面的限制)。

参数

Input image list -il image1 image2... Mandatory
Image list to perform computation on.

Output Image -out image [dtype] Mandatory
Output image.

Expressions -exp string Mandatory
Mathematical expression to apply.

Import context -incontext filename [dtype]
A txt file containing user's constants and expressions.

Export context -outcontext filename [dtype]
A txt file where to save user's constants and expressions.

Available RAM (MB) -ram int Default value: 256
Available memory for processing (in MB).

实例

从命令行执行以下操作:

otbcli_BandMathX -il verySmallFSATSW_r.tif verySmallFSATSW_nir.tif verySmallFSATSW.tif -out apTvUtBandMathOutput.tif -exp "cos( im1b1 ) + im2b1 * im3b1 - im3b2 + ndvi( im3b3, im3b4 )"

来自Python的评论:

import otbApplication

app = otbApplication.Registry.CreateApplication("BandMathX")

app.SetParameterStringList("il", ['verySmallFSATSW_r.tif', 'verySmallFSATSW_nir.tif', 'verySmallFSATSW.tif'])
app.SetParameterString("out", "apTvUtBandMathOutput.tif")
app.SetParameterString("exp", "cos( im1b1 ) + im2b1 * im3b1 - im3b2 + ndvi( im3b3, im3b4 )")

app.ExecuteAndWriteOutput()

局限性

与otbBandMathXImageFilter相反,应用程序当前无法为每个表达式生成一个输出图像。用分号分隔表达式 ; 将把它们的结果连接成唯一的多波段输出图像。

不能直接使用 -exp 参数(因为分号 ; 运算符需要定义矩阵,并且已经有了另一种含义)。定义矩阵变量时应使用上下文文件。