IDL开发专题IDL运算符与ENVI波段运算举例.docx
《IDL开发专题IDL运算符与ENVI波段运算举例.docx》由会员分享,可在线阅读,更多相关《IDL开发专题IDL运算符与ENVI波段运算举例.docx(7页珍藏版)》请在冰豆网上搜索。
IDL开发专题IDL运算符与ENVI波段运算举例
运算符是各个语言中必不可少的部分,IDL作为一种基于矩阵运算的语言,实际应用实际应用中运算符操作有很多的技巧。
很多的时候一个语句能实现复杂的功能,这点在波段运算中能够体现出来。
1运算符
IDL中的数学运算符有加(+)、增运算(++)、减(-)、减运算(--)、乘(*)、除(/)、幂(^)、取余(mod)、取小(<)和取大(>)。
增运算和减运算(++、--)
这两个运算跟C里面的是一样的;
IDL>var=20
IDL>print,var++
20
IDL>print,var
21
IDL>var=indgen
(2)
IDL>print,var++
0 1
IDL>print,var
12
幂运算(^)
IDL>var=2
IDL>print,var^4
16
IDL>print,var^5
32
IDL>var=[2,3]
IDL>print,var^2
49
取余运算(mod)
IDL>var=32
IDL>print,varmod4
0
IDL>print,varmod5
2
IDL>var=[2,3]
IDL>print,varmod2
01
取大和取小运算(> 、<)
IDL>var=32
IDL>print,var>39
39
IDL>print,var<39
32
IDL>var=[20,30]
IDL>print,var>25
2530
IDL中逻辑运算有几个:
&&, ||, 和 ~。
1.2.1&&
逻辑的与运算,如果表达式为真或非零则返回1否则返回0。
IDL>PRINT,5&&2
1
IDL>PRINT,5&&0
0
IDL>PRINT,"sd"&&"d"
1
IDL>PRINT,"sd"&&""
1
IDL>PRINT,"sd"&&""
0
1.2.2|| 逻辑的或运算
IDL>PRINT,5||2
1
IDL>PRINT,5||0
1
IDL>PRINT,0||0
0
IDL>IF((5GT3)||(4GT5))
THENPRINT,'True'
True
1.2.3~逻辑的非运算
IDL>print,~3
0
IDL>print,~0
1
IDL中有四个位运算符:
AND, NOT, OR,and XOR.。
位加运算符(AND)
IDL>print,5AND6
4
0110 ← 5
0111 ← 6
————————
0110 ← 4
位取反运算符(NOT)
IDL>print,not1
-2
位或运算符(OR)
IDL>print,5or10
15
0101 ← 5
1010 ← 10
————————
1111 ← 15
位与或运算符(XOR)
IDL>print,3XOR5
6
0011 ← 3
0110 ← 5
————————
0110 ← 6
IDL中的关系运算符包括EQ、NE、GE、GT、LE、LT几个,关系运算符返回的是真“True”或假“False”。
(Equalto)
等运算符,如果运算符两边相同则返回真,否则返回假;
1
IDL>var=[2,3]
IDL>print,vareq2
10
(NotEqualto)
不等运算符,如果运算符两边不等则返回真,否则返回假;
0
IDL>print,2NE1
1
IDL>var=[2,3]
IDL>print,varne2
01
GE(Greaterthanorequalto)
大于等于运算符,如果运算符两边左边大于等于右边则返回真,否则返回假;
IDL>print,2GE1
1
IDL>var=[2,3]
IDL>print,varge2
11
GT(Greaterthan)
大于运算符,如果运算符两边左边大于右边则返回真,否则返回假;
IDL>print,2GT1
1
IDL>var=[2,3]
IDL>print,vargt2
01
(Lessthanorequalto)
小于等于运算符,如果运算符两边左边小于等于右边则返回真,否则返回假;
IDL>print,2LE1
0
IDL>print,2LE12
1
IDL>var=[2,3]
IDL>print,varle3
11
LT(Lessthan)
小于运算符,如果运算符两边左边大于右边则返回真,否则返回假;
IDL>print,2LT1
0
IDL>print,2LT12
1
IDL>print,2LT2
0
IDL>var=[2,3]
IDL>print,varlt3
10
1.4.6数组间运算
IDL>a=[2,3,5]
IDL>b=[1,4,5]
IDL>print,aGEb
1 01
IDL>b=[1,4,5,6]
IDL>print,aGEb
101
IDL>print,aLEb
011
1.5.1#数组乘(列乘行)
IDL>PRINT,array1
121
2-12
IDL>PRINT,array2
13
01
11
IDL>PRINT,array1#array2
7 -1 7
2 -1 2
3 1
1.5.2##矩阵乘(行乘列)
IDL>PRINT,array1
12 1
2-12
IDL>PRINT,array2
13
0 1
11
IDL>PRINT,array1##array2
26
47
1.6.1小括号()
表达式组合和控制一系列表达式的优先级;
IDL>PRINT,3+4*2^2/2
11
IDL>PRINT,(3+(4*2)^2/2)
35
1.6.2中括号[]
数组的连接或元素调用;
IDL>C=[0,1,3]
IDL>PRINT,[C,5]
0135
IDL>PRINT,C[2]
3
1.6.3条件表达式?
:
该运算符的用法是:
value=expr1?
expr2:
expr3
如果expr1是true,那么 value 等于expr2否则value=expr3.
IDL>A=6&B=4
IDL>print,(AGTB)?
A:
B
6
1.6.4对象方法调用符->
oWindow->Draw
1.6.5指针引用符*
指针调用符为*,调用格式为*指针变量。
IDL>point1=ptr_New(34)
IDL>print,*point1
34
2运算符波段运算举例
2.1 数据小于0的赋予0 b1>0
数据值小于0的赋予-999
(b1LT0)*-999+(b1GE0)*b1
三个波段求平均值,如该波段小于0则不参加运算。
如某点b1:
4;b2:
6;b3:
0;那平均值ave=(b1+b2+b3)/(1+1);
( b1>0+b2>0+b3>0)/(((b1ge0)+(b2ge0)+(b3ge0))>1)
两幅图像,图像1波段b1中的云部分(象元值大于200)用图像2的波段b2代替
(b1GT200)*b2+(b1LE200)*b1
波段分段赋值,如B1中小于0部分等于0,b1中值在[0,10]之间赋为原数值的100倍,如果b1值大于10则赋为原数值的10倍。
(b1LE0)*b1>0+((b1ge0)and(b1le10))*b1*100+(b1gt10)*b1*10
波段运算为图像的选择性更改和来自多幅图像的数据结合提供了简单的方法。
在下面的示例中,把两幅图像结合起来进行处理,从而从图像中消除云的影响。
在图像b1中,像元值大于200的像元被认为是云,希望用图像b2中的相应像元对它们进行替换。
(b1gt200)*b2+(b1le200)*b1
用类似的运算表达式,可以将一幅图像的黑色背景变成白色背景:
(b1eq0)*255+(b1gt0)*b1
下面的示例是一个较为复杂的表达式。
该表达式使用几个标准来生成一幅二进制掩膜图像,用于识别主要为云的像元。
该算法可以应用于经过定标的AVHRR日间图像中生成云的掩膜图像。
在该表达式中,b4(热红外波段)值必须为负,或b2(反射波段)值必须大于并且b3和b4(中红外和热红外波段)的差值必须大于15度。
由于关系运算符为真值(关系成立)返回1值,因此生成的掩膜图像在有云处值为1,在其他区域值为0。
(b4lt0)or()AND(b3–b4)gt15
2.8会做最大/最小合成,最大或者最小合成值通常是指从几个图像中取最大或者最小像元值重新生成一副新的图像,比如几个时相的温度、植被指数或者植被覆盖度的合成。
如下为合成9个波段的最大合成值:
b1>b2>b3>b4>b5>b6>b7>b8>b9