波段運算(bandmath)工具中資料型別及轉換函式
波段運算的強大功能是由IDL的功能、速度和靈活性所提供的。但是要熟練使用波段運算功能,並不需要成為一個熟悉IDL程式設計的專家。下面的知識可以幫助熟練使用波段運算功能並避免一些經常出現的問題。
- 注意資料型別
IDL中的數學運算與簡單的使用計算器進行運算是有一定差別的。要重視輸入波段的資料型別和表示式中所應用的常數。每種資料型別——尤其是非浮點型的整型資料都包含一個有限的資料範圍。例如:8-bit位元組型資料表示的值僅為0-255,如果對16-bit整型資料波段求和(b1 + b2)並且其值大於255,那麼得到的結果將與期望值不等。當一個值大於某個資料型別所能容納的值的範圍時,該值將會溢位(overflow)並從頭開始計算,例如:將8-bit位元組型資料250和10求和,結果為4。
類似的情況經常會在波段運算中遇到,因為遙感影象通常會被儲存為8-bit位元組型或16-bit整型。要避免資料溢位,可以使用IDL中的一種資料型別轉換功能(參見表15.1)對輸入波段的資料型別進行轉換。例如,在對8-bit位元組型整型影象波段求和時(結果有大於255),如果使用IDL函式fix()將資料型別轉換為整型,就可以得到正確的結果。
fix(b1)+ b2
因此在上面的求波段和(b1+b2+b3)的例子中,正確的表示式應該是fix(b1)+b2+b3。
你可能會有這樣的想法:既然浮點型資料可以表示所有的資料值,為什麼不在所有的計算中都使用浮點型資料呢?這是因為一個數據所能表現的動態資料範圍越大,它佔用的磁碟空間越多。例如:位元組型資料的一個像元僅佔用1個位元組;整型資料的一個像元佔用2個位元組;浮點型資料的一個像元佔用4個位元組。浮點型結果將比整型結果多佔用一倍的磁碟空間。關於IDL資料型別的佔用磁碟空間和資料範圍的詳細介紹,參考表15.1。
表15.1資料型別及說明
資料型別 |
轉換函式 |
縮寫 |
資料範圍 |
Bytes/ Pixel |
8-bit位元組型(Byte) |
byte() |
B |
0-255 |
1 |
16-bit整型(Integer) |
fix() |
-32768-32767 |
2 |
|
16-bit無符號整型(Unsigned Int) |
uint() |
U |
0-65535 |
2 |
32-bit長整型(Long Integer) |
long() |
L |
大約+/-20億 |
4 |
32-bit無符號長整型(Unsigned Long) |
ulong() |
UL |
0-大約40億 |
4 |
32-bit浮點型(Floating Point) |
float() |
. |
+/-1e38 |
4 |
64-bit雙精度浮點型(Double Precision) |
double() |
D |
+/-1e308 |
8 |
64-bit整型(64-bit Integer) |
long64() |
LL |
大約+/-9e18 |
8 |
無符號64-bit整型(Unsigned 64-bit) |
ulong64() |
ULL |
0-大約2e19 |
8 |
複數型(Complex) |
complex() |
+/-1e38 |
8 |
|
雙精度複數型(Double Complex) |
dcomplex() |
+/-1e308 |
16 |
- IDL資料型別的動態變換
一些數字可以使用幾種不同的資料型別表達出來,IDL制定了一些預設規則對這些資料進行解譯。因此IDL的資料型別是可以進行動態變換的,也就是說IDL能夠將表示式中的資料型別提升為它在表示式中所遇到的最高資料型別。例如:不包含小數點的整型數字,即使它在8-bit位元組型的動態範圍,也常被解譯為16-bit整型資料。如果想為一幅8-bit位元組型資料影象加5,並且使用如下的波段運算表示式:
B1 + 5
資料5將被解譯為16-bit整型資料,因此波段運算結果將被提升為16-bit整型資料影象(佔用8-bit位元組型影象的兩倍磁碟空間)。如果想保持結果為位元組型影象,可以使用資料型別計算函式byte():
b1 + byte(5)
或使用IDL中將16-bit整型資料轉換為8-bit位元組型資料的縮寫:
b1 + 5B
在資料後緊跟一個字母B表示將該資料解譯為位元組型資料。如果在波段運算表示式中經常使用常數,這些類似的縮寫是很有用的。詳細介紹參考表15.1。
摘自《ENVI遙感影象處理方法 第二版》高等教育出版社