ENVI下实现多张图像的最大或最小合成图像
最大或者最小合成值通常是指从几个图像中取最大或者最小像元值重新生成一副新的图像,比如几个时相的温度、植被指数或者植被覆盖度的合成。
咋一看这个过程实现起来挺复杂,首先想到的是利用编程方法,比较相同行列号的像素值的大小,由于需要对比很多像素值,甚至想到了数学结构中的冒泡排序等方法,一组像素好排序,如果遇到10000x10000的图像,那么好要考虑算法的效率等等。
其实利用ENVI下的bandmath,结合一个小技巧,很容易就能实现最大/最小值的合成。下面以植被覆盖度最大/最小合成值为例介绍这种方法。
(1)
(2)
b1~9表示植被覆盖度文件,根据文件数量输入变量。
图1
(3)
(4)
使用表达式:b1<b2<b3<b4<b5<b6<b7<b8<b9,可以得到9个时相植被覆盖度的最小合成图像。
图2: 9个时相植被覆盖度的最大合成图像
图3: 9个时相植被覆盖度的最小合成图像
这个过程中主要使用了IDL的最大/最小运算符:<、>。最小值和最大值运算符也是数组的基础运算符,但与关系运算符或Boolean运算符不同的是:它们不返还真值或假值,而返还实际的最小值和最大值。
在下面的例子中,对于图像中的每一个像元,0、b2或b3中的最大值将被加到b1中,该表达式确保加到b1中的值始终为正。
b1 +(0 > b2 > b3)
在下面的例子中,最小值和最大值运算符的同时运用使b1中的值被限制在0和1之间:b1中的值不会大于1或小于0,最后得到的结果在[0,1]范围内。
0 > b1 < 1
很多时候与关系运算符结合起来应用,如需要计算几年内的数据平均值(如NDVI),如果某数据的值为0则不参加计算,如果3个通道都为0,则赋值为0,比如某点b1=4;b2=6;b3=0;那么平均值ave = (b1+b2+b3)/(1+1),则可用以下运算表达式:
(b1>0+b2>0+b3>0) / ( ((b1 gt 0) + (b2 gt 0)+(b3 gt 0)) >1)