Google Earth Engine教學之二:調整衛星影像的外觀
在上一篇教學中,我們第一次操作Google Earth Engine(之後會簡稱為「GEE」),用GEE載入Landsat 8衛星影像集,並篩選出台灣北部的特定日期影像,最後將Band5–4–3的疊圖畫到地圖上,外加調整影像的對比。
在這次的教學,我會先詳細說明,上一篇文章沒有講得很清楚的一些觀念,以防沒有搞清楚一些基本觀念,之後學新的東西難以吸收。
首先,還是先把GEE打開,貼上下方的程式碼到撰寫區
不知道讀者有沒有發現,我們並沒有進行Google搜尋「Landsat」,點擊特定搜尋結果,再點擊「import」的動作,但我們還是成功載入了Landsat資料集。
原因在於,載入資料集的方法有兩種:
- 用搜尋功能載入:你可以在搜尋區塊中,輸入關鍵字,找到需要的衛星影像資料後,再點擊import
- 用程式碼載入:你也可以在撰寫區塊中,直接輸入Javascript的指令,之後點擊「Run」,同樣可以載入你需要的資料集
第二種方法聽起來有點玄,我們用上面的實際例子進行說明
var imageCollection = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT");ee.ImageCollection是用來載入衛星影像集的指令,只要在括號內輸入你需要的資料集路徑,就可以讀取該路徑指向的資料集。在此例,我們把讀取結果存放在名為「imageCollection」的變數中。
你或許會問,為什麼我知道Landsat 8衛星資料集的路徑是「LANDSAT/LC08/C01/T1_RT」,原因很簡單,因為這在搜尋頁面就查得到了

在搜尋結果頁中,有一個名為「imageCollection ID」的項目,就是該資料集在Google雲端資料庫中存放的路徑。我們只要複製貼上這段ID,就可以用ee.ImageCollection指令,載入該ID代表的資料集。
那麼,為什麼我們不直接用搜尋功能載入資料集就好了,還要自己敲一堆程式碼載入呢?其實單純只是為了日後操作方便:如果下次你又需要同一份資料集,與其再搜尋一次關鍵字,用滑鼠點來點去的,不如直接複製上次的程式碼,輕輕鬆鬆就可以載入同一份資料集了。
其實,有更簡單的方法,可以取得載入特定資料集的程式碼

當你用搜尋功能載入資料集時,撰寫區塊的最上方會出現剛剛載入的資料集的訊息。上圖紅框框處,有一個長得像文件的按鈕,按下去

就會跳出載入該資料集所需的程式碼了,就不需要自己記ee.ImageCollection的指令就怎麼打啦!
搞懂用程式碼載入資料集之後,接下來我們來弄清楚,到底資料集是什麼。
- 衛星影像集(image collection):顧名思義,衛星影像集就是由許多衛星影像資料構成的資料集。裡面可能會有數百筆衛星影像,地理範圍涵蓋某個國家、洲、甚至整個地球,涵蓋日期可能一路回到Landsat衛星剛升空的1980年代
- 衛星影像(image):衛星影像本身,則是單一個衛星影像,可以想像成衛星拍攝的「一張」衛星照片。例如上一篇文章最後畫出來的台灣北部衛星影像,就是用Landsat 8衛星在2016年7月29日,拍攝台灣北部的一張衛星照片
在一開始請大家複製貼上的範例程式碼中,我們首先讀取了整個Landsat 8的衛星影像集,但是GEE沒辦法繪製衛星影像集,一定要把衛星影像集,篩選成單一個衛星影像,GEE才知道怎麼繪製它。
因此,才會有之後的篩選步驟
var filterImage = imageCollection .filterBounds(ee.Geometry.Point(121.551129, 25.054875)) .filterDate("2016-07-28", "2016-07-30");
var image = ee.Image(filterImage.first());首先,我們把imageCollection用filterBounds篩選,篩出位於台灣北部的眾多衛星影像。但篩選完地理範圍之後,我們還是得到一個衛星影像集,因為還沒篩選日期,裡頭有好幾年份的衛星影像。
filterDate就是用來篩選出特定日期的衛星影像。我們設定篩選出介於2016年7月28日和2016年7月30日之間的衛星影像。由於我事先在NASA網站上確認過,2016年7月29日Landsat 8有拍攝台灣北部的衛星影像,因此經過兩道收選手續後,我們就能篩出台灣北部2016年7月29日的單一個衛星影像。
註:關於如何到NASA網站查詢特定日期的衛星影像,之後會另闢文章教大家
但是,經過兩道手續篩出來的結果,其實還是「衛星影像集」,原因出在程式語言的邏輯,跟我們日常生活的邏輯不同:就算把資料集篩到只剩下一個內容,它的「格式」還是資料集。
要得到一個「衛星影像」,我們需要first這個功能
var image = ee.Image(filterImage.first());first會從丟到括號裡的衛星影像集中,取出「第一個」衛星影像,取出的結果,再餵給ee.Image這個功能,將結果讀取為衛星影像「image」,就可以得到最終的「衛星影像」了。
做個小總結:
- 衛星影像集內含許多衛星影像,需要運用filterBounds、filterDate等篩選功能,找到我們需要的衛星影像
- 我們還需要first等將衛星影像集轉成衛星影像的功能,才能把結果拿來繪製衛星影像
搞懂以上幾個概念之後,就可以來談談衛星影像視覺化的技巧了
還記得上一篇文章,第一次畫出來的衛星影像,色彩偏灰暗,比較難辨識植被和都市區域。之後,我們加入一串很長串的程式碼之後,影像就變得清楚多了。那一長串的程式碼,是做什麼用的呢?
上面由<>構成的格式,被稱作SLD(Styled Layer Descriptors),是GEE用來微調衛星影像視覺化的方式。
基本上,你不需要硬背上面那一串程式碼,只要知道改哪些地方會有哪些效果就可以了
'<ContrastEnhancement><Histogram/></ContrastEnhancement>'先看這一行,兩個<ContrastEnhancement>的中間,夾了一個<Histogram>。這個<Histogram>,就是用來增加影像對比的演算法。
GEE支援的增加影像對比演算法,主要有「Histogram」和「Normalize」兩種。我們可以把上面的<Histogram>改成<Normalize>,畫出來的衛星影像,會變得不太一樣

上圖是不同的演算法畫出來的影像。Histogram演算法在這個例子的效果較佳,不過Normalize的影像,也有比沒有任何演算法的影像鮮明。
要注意的是,不同的疊圖搭配,以及不同的衛星影像,適合的演算法可能不同,在調整視覺效果時,最好把兩個演算法都試過一次,才能得到最佳的視覺效果。
'<RedChannel>' + '<SourceChannelName>B5</SourceChannelName>' + '</RedChannel>'緊接著演算法設定之後的程式碼,是設定RGB三個channel,要放哪些波段。在此例,紅色channel釋放Band 5(B5),綠色channel放Band 4(B4),藍色channel放Band 3(B3)。這樣才能畫出紅藍分界的植被/都市分野圖。
註:除了5–4–3的搭配以外,還有很多其他有趣的波段搭配,可以看這篇文章「imagej處理大地衛星Landsat的影像」的整理,多學幾種波段搭配。
學會怎麼調整衛星影像的外觀之後,我們就可以往更複雜的技巧前進了,包括遮罩要怎麼用、彙整不同日期的衛星影像為一個影像等等,還要請大家先熟悉第一和第二篇文章教的概念囉!
