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
第一个投入的第二个分量的方差(全局统计)idxX
和idxY
是当前像素的索引(泛型变量)
- 二元运算符:
+
此外,-
减法,*
乘法,/
分部^
将x乘以y的幂<
少于,>
大于,<=
小于或等于,>=
大于或等于==
平等,!=
不相等- 逻辑运算符:
or
,and
,xor
- 位操作:
&
(和),|
(或),<<
(左移)和>>
(右移位)*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
是表示邻域大小的两个数字(第一个与水平方向相关)
注:所有邻里居中,因此 K
和 P
一定是奇数。
许多运营商都附带了这一新功能:
- Dotpr
- 小气
- 变量
- 中位数
- Vmin
- VMAX
- 等。
例如,如果 im1
表示3个波段图像的像素::
im1 - mean( im1b1N5x5, im1b2N5x5, im1b3N5x5 )
可以表示高通滤波器(请注意,通过隐含三个邻域,运算符Mean返回三个分量的行向量。这是该应用程序的许多操作员的典型行为)。
除了前面的运营商外,还可以使用其他运营商:
- 来自muParserX的现有运算符/函数,最初不是为向量和矩阵(例如cos,sin)定义的。这些新的运算符/函数保留了我们添加了前缀的原始名称
v
对于向量 (vcos
,vsin
等)mult
,div
和pow
运算符,用于执行向量/矩阵的元素乘法、除法或指数运算(例如im1 div im2
)。mlt
,dv
和pw
运算符,用于执行向量/矩阵与标量的乘法、除法或指数运算(例如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 参数(因为分号 ;
运算符需要定义矩阵,并且已经有了另一种含义)。定义矩阵变量时应使用上下文文件。