Google Earth Engine教學之二:調整衛星影像的外觀

Andy Lin
Andy Lin
Jul 21, 2017 · 7 min read

在上一篇教學中,我們第一次操作Google Earth Engine(之後會簡稱為「GEE」),用GEE載入Landsat 8衛星影像集,並篩選出台灣北部的特定日期影像,最後將Band5–4–3的疊圖畫到地圖上,外加調整影像的對比。

在這次的教學,我會先詳細說明,上一篇文章沒有講得很清楚的一些觀念,以防沒有搞清楚一些基本觀念,之後學新的東西難以吸收。

首先,還是先把GEE打開,貼上下方的程式碼到撰寫區

不知道讀者有沒有發現,我們並沒有進行Google搜尋「Landsat」,點擊特定搜尋結果,再點擊「import」的動作,但我們還是成功載入了Landsat資料集。

原因在於,載入資料集的方法有兩種:

  1. 用搜尋功能載入:你可以在搜尋區塊中,輸入關鍵字,找到需要的衛星影像資料後,再點擊import
  2. 用程式碼載入:你也可以在撰寫區塊中,直接輸入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的指令就怎麼打啦!


搞懂用程式碼載入資料集之後,接下來我們來弄清楚,到底資料集是什麼。

  1. 衛星影像集(image collection):顧名思義,衛星影像集就是由許多衛星影像資料構成的資料集。裡面可能會有數百筆衛星影像,地理範圍涵蓋某個國家、洲、甚至整個地球,涵蓋日期可能一路回到Landsat衛星剛升空的1980年代
  2. 衛星影像(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」,就可以得到最終的「衛星影像」了。

做個小總結:

  1. 衛星影像集內含許多衛星影像,需要運用filterBoundsfilterDate等篩選功能,找到我們需要的衛星影像
  2. 我們還需要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的影像」的整理,多學幾種波段搭配。

學會怎麼調整衛星影像的外觀之後,我們就可以往更複雜的技巧前進了,包括遮罩要怎麼用、彙整不同日期的衛星影像為一個影像等等,還要請大家先熟悉第一和第二篇文章教的概念囉!

)

    Andy Lin

    Written by

    Andy Lin

    Data journalist and map nerd.

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade