1. 程式人生 > 其它 >波段運算(bandmath)工具中運算表示式的幾個典型例子

波段運算(bandmath)工具中運算表示式的幾個典型例子

1.避免整型資料除法

當對整型資料波段進行除法運算時,運算結果不是被向上或向下取整,而是直接被簡單地捨去(小數點後面的資料被捨棄)。要避免這種情況發生,通常將資料型別轉換為浮點型。

b1 / float(b2)

如果想將除法資料結果保持為整型,最好先將資料轉換為浮點型進行除法運算,然後再將結果轉換為所需的資料型別。例如:如果輸入波段為8-bit位元組型,想將結果取整並存儲為16-bit整型資料,使用下面的表示式:

fix(ceil(b1 / float(b2)))

2.避免整型運算溢位

整型資料包含一個動態的資料範圍。如果波段運算將生成的資料相當大或相當小,無法以輸入波段的資料型別表示出來,要注意提升相應的資料型別。例如:如果示例表示式中的波段b1和b2為8-bit位元組型資料,生成結果的最大值可能為(256*256)=65,025。由於位元組型資料所能表示的最大值為255,因此結果的資料型別只有被提升為16-bit無符號整型才能返回正確的值,否則,大於255的值將溢位,並記錄一個錯誤的值。因此使用下面表示式避免資料範圍溢位:

uint(b1) * b2

關於IDL資料型別動態範圍的詳細介紹,參考表15.1。

3.生成混合影象

波段運算為多幅影象的混合提供了簡單的方法。例如:如果b1和b2為8-bit位元組型資料,下面的表示式將生成一幅新的8-bit位元組影象,b2所佔權重為0.8,b1所佔權重為0.2。

byte(round((0.2 * b1)+(0.8 * b2)))

4.使用陣列運算子對影象進行選擇性更改

波段運算為影象的選擇性更改和來自多幅影象的資料結合提供了簡單的方法。在下面的示例中,把兩幅影象結合起來進行處理,從而從影象中消除雲的影響。在影象b1中,像元值大於200的像元被認為是雲,希望用影象b2中的相應像元對它們進行替換。

(b1 gt 200)* b2 +(b1 le 200)* b1

用類似的運算表示式,可以將一幅影象的黑色背景變成白色背景:

(b1 eq 0)*255+(b1 gt 0)*b1

下面的示例是一個較為複雜的表示式。該表示式使用幾個標準來生成一幅二進位制掩膜影象,用於識別主要為雲的像元。該演算法可以應用於經過定標的AVHRR日間影象中生成雲的掩膜影象。在該表示式中,b4(熱紅外波段)值必須為負,或b2(反射波段)值必須大於0.65並且b3和b4(中紅外和熱紅外波段)的差值必須大於15度。由於關係運算符為真值(關係成立)返回1值,因此生成的掩膜影象在有云處值為1,在其他區域值為0。

(b4 lt 0)or(b2 gt 0.65)AND(b3 – b4)gt 15

5.最小值和最大值運算子的使用

最小值和最大值運算子也是陣列的基礎運算子,但與關係運算符或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)

6.利用波段運算修改NaN

NaN為Not a Number的縮寫,在遙感影象中屬於異常值。很多使用者有修改NaN的需求,比如把0值修改為NaN,或把NaN修改為0值等。由於波段運算公式較為複雜,現歸納如下。

(1)修改0值為NaN

float(b1)*b1/b1

   提示:分母為0時,返回的就是NaN。

(2)修改特定值(如250)為NaN

b1*float(b1 ne 250)/(b1 ne 250)

   提示:分母為0時,返回的就是NaN。

(3)修改NaN為特定值(-999):

finite(b1, /nan)*(-999) or (~finite(b1, /nan))*b1

   提示:finite()是IDL函式,獲取無效值的下標。

(4)修改NaN為0值

第一步、將NaN值修改為-999或其他影象中不存在的值,表示式為:finite(b1, /nan)*(-999) or (~finite(b1, /nan))*b1。

第二步、將-999修改為0值,表示式為:(b1 ne -999)*b1。

摘自《ENVI遙感影象處理方法 第二版》高等教育出版社