05-SNAP處理Sentinel-2 L2A級數據(三)


(原創文章,轉載請註明來源!)

前言

上一篇博客製作一個用於上海市崇明島(小部分屬於江蘇省)地物分類的Sentinel-2無雲影像特徵工程數據集,這次利用這個特徵工程數據來進一步探索SNAP中的地物分類模塊,主要涉及到無監督分類、樣本製作、監督分類、掩膜等功能。

數據集

特徵工程數據集見與04篇百度鏈接的文件是相同的:
鏈接:https://pan.baidu.com/s/1WfLrhjEFz3sT66StQ8pXZQ
提取碼:1pya
使用的是Chongming_Island_data文件夾下的Final_result_data文件夾下的chongming_mosaic_stack.dim數據集。
chongming_mosaic_stack.dim數據集包含12個光譜特徵,10個紋理特徵,4個指數特徵,合計26個特徵,具體制作過程見04篇
打開SNAP,並將文件chongming_mosaic_stack.dim拖入到SNAP中,即可打開該數據集,打開RGB真彩色(R:B4波段;G:B3波段;B:B2波段),效果如下:
在這裏插入圖片描述

崇明島簡況

崇明島與臺灣島、海南島並稱中國三大島嶼,同時它是中國最大的河口沖積島,中國最大的沙島[1]。全島地勢平坦,土地肥沃,林木茂盛,物產富饒,適宜各類需要量大的作物生長,如水稻、玉米等。根據上海市相關規劃,上海市政府要把崇明島建設成爲現代化生態島區。崇明區的工業、服務業相比上海市其它區域來說要差很多,該地區是上海市的重要農產品(瓜、果、蔬菜、糧食等)來源。

無監督分類

無監督分類也可以稱爲聚類,是指對不加標籤的數據特徵進行分類,可以看作“讓數據自己介紹自己”的過程。其分類結果只是對不同類別達到了區分,但並不能確定類別的屬性,其類別的屬性是通過分類結束後目視判別或實地調查後確定[2]。無監督分類不需要訓練樣本集。SNAP(V6.0)的無監督分類算法目前只有K-Means和EM兩種分類算法,其具體原理請查閱機器學習有關的書籍。這裏以K-Means算法爲例,簡單介紹一下SNAP中無監督分類過程:
準備好數據特徵集好,在下圖位置打開K-Means Cluster Analysis工具:
在這裏插入圖片描述

輸入輸出參數面板,修改或者保持默認即可(這裏保留默認值)。
在這裏插入圖片描述

參數面板設置,說明見下圖:
在這裏插入圖片描述

這裏選擇的聚類類別數目(Number of clusters)是5;算法迭代次數(Number of iterations)是30次;隨機數種子(Random seed)設置爲31415(系統默認值),你可以修改爲別的整數;Source band names選擇了所有的波段(也就是默認的情況);ROI-Mask這裏設置爲空。設置好參數好,點擊Run。K-Means分類過程耗費的時間和你設置的參數和分類數據集數據量大小都有關,一般分類類別數目和迭代次數波段數目越大,耗費的時間越長。

點擊Run,大約45分鐘後,分類結束。看下結果:
在這裏插入圖片描述

將分類結果和RGB真彩色圖水平分屏對比顯示,選擇Windows—>Tile Horizontally:
在這裏插入圖片描述

圖中某處位置,可以看到分類結果是比較差的(大紅圈中的水體存在混淆,小紅色圈建築沒有識別出來等):
在這裏插入圖片描述

可以看到無監督分類結果不理想。不過,博主在這個K-Means分類時,並不嚴謹,因爲各個特徵的量綱和數量級不一樣,這裏是需要對特徵數據集進行標準化。K-Means是基於某種距離進行分類(SNAP中使用的歐式距離,參考該算法的幫助文檔),如果不對特徵數據集進行標準化,會導致不同的特徵對距離的貢獻存在明顯差異。當然,K-Means參數設置(分類數目等)也可能對分類結果有較大影響。一般而言,無監督分類的結果要比監督分類的結果要差。這樣,重點是監督分類,對無監督分類不過多地加以討論。

監督分類

在遙感影像地物分類中,現在基本上都是選擇監督分類,因爲其精度相對較高。監督分類通過對數據的若干特徵與若干標籤(類型)之間的關聯性進行建模,只要模型被確定,就可以應用到新的數據集上。

SNAP中關於監督分類算法有好幾種,這裏以目前主流的隨機森林分類算法爲例,選擇隨機森林算法的原因有好幾個:一是算法分類效率高(訓練和預測速度都比較快),即使數據集很大,也不要很長時間(相較於支持向量機等算法);二是集成分類算法(隨機決策樹集成),算法分類精度一般比較高(分類精度其實取決於很多參因素,與數據集,樣本,算法及其參數等都有關,這裏是通常情況下的對比);三是特徵數據集不要標準化,因爲其是基於特徵區間進行的概率分類,而不是基於距離進行的分類

監督分類需要有訓練樣本。下面以SNAP中的監督分類隨機森林分類算法爲例,對其分類過程進行介紹。

分類類別的確定

在分類之前,首先,要確定的就是分類目標(類別)。結合崇明島以及數據集的分辨率、數量等實際情況,這裏確定分類類別爲5類,分別爲:林地,農用地,裸地,建設用地,水體。這裏的類別確定還是比較簡單直接了,實際上結合實際需要和結果好好考慮的。不過,作爲演示,這裏不太講究了。

創建訓練樣本集

在創建訓練樣本之前,可以先把前面的無監督分類算法的結果關掉。SNAP創建樣本集與別的遙感軟件不太一樣,雖然都是通過矢量圖來創建區域,但是,其不是通過直接添加一個類別屬性來加以區分的,二是通過矢量數據集來區別類別的。SNAP每一類地物需要建立一個矢量數據集,五類就需要5個。

創建矢量容器

我們通過矢量容器(Vector Data Container,相當於GIS中的圖層)來創建每一類訓練樣本矢量數據集,點擊Vector—>New Vector Data Container:
在這裏插入圖片描述
在這裏插入圖片描述

矢量編輯工具

查看矢量數據管理器幫助文檔

首先,可以通過在搜索框中輸入Vector Data,打開Vector Data Management的幫助文檔,查看矢量數據管理器的幫助文檔:
在這裏插入圖片描述
如果你比較耐心看的話,應該是可以看懂幫助文檔的說明的:
在這裏插入圖片描述

勾繪多邊形

創建矢量容器後,可以在左側Vector Data文件夾下找到該矢量容器(如forest)。在右上角上可以找到多種矢量編輯工具,用於勾選樣本。
在這裏插入圖片描述
在勾選林地或者農作物的時候可以打開ndvi等植被相關的波段,來指導勾選樣本,這裏打開ndvi波段,水平分屏(Windows—>Tile Horizontally),藉助ndvi能協助勾選樣本:
在這裏插入圖片描述

回到導航窗口,鼠標單擊一下RGB圖,並勾選同步滾動的兩個選項,移動(鼠標左鍵)和放大(鼠標滾動)窗口到崇明島西北部分,準備開始勾選樣本(崇明島這個地方,博主去過幾次,雖然沒跑遍,一些基本的認識是有的,通常林地河道兩側,通常林地輪廓不是規則的矩形,在島邊會存在一些溼地林地,種植區可能存在一些果樹之類的作物。要將其和農作物相靠目視相區分還是比較困難的,並且不同林地密度也不一樣,不過這裏作爲演示,不要太講究了)。

這裏使用的是不規則多邊形編輯工具,鼠標單擊該工具(圖中紅褐色(乃至黑色)的應該是林地,可以打開Google Earth看下)。

鼠標左鍵放至合適位置,鼠標左鍵勾選多邊形頂點(不應少於3個),繪製最後一個頂點時,鼠標左鍵雙擊結速繪製。
在這裏插入圖片描述

修改或刪除圖形位置或者端點

選擇模式1

繪製多邊形時,有可能後續還需要修改頂點位置。若要圖形位置或修改頂點或者刪除該矢量圖形,則先要選中該矢量圖形。先勾選選擇工具,隨後移動鼠標可以在該圖形位置上鼠標單擊(如果要選擇多個,可以按住Ctrl鍵,點擊鼠標左鍵選擇多個多邊形),圖中的矢量圖的矩形黃色虛線輪廓表明這是選擇模式1形態。
在這裏插入圖片描述
也可以通過下面方式選中該矢量圖形:
在這裏插入圖片描述

從幫助文檔中,可以看到矢量編輯工具有三種選擇模式,可以從圖形矩形輪廓和端點形態區別這三種形態。
在這裏插入圖片描述

在選擇模式1下,可以在該圖形上按住鼠標左鍵直接平移該矢量圖形的位置。選擇模式1中有黃色矩形虛線輪廓。

選擇模式2

如果再在該矢量圖形上鼠標左鍵單擊一次,將進入選擇模式2。該模式下可以平移、添加或者刪掉矢量圖形的端點選擇模式2除了有黃色矩形虛線輪廓,端點會顯示爲白色,表示端點可以移動。

平移端點:鼠標箭頭移動到要移動位置的端點上,鼠標左鍵點擊該端點(會選中該端點,端點會變成黃色),長按住鼠標左鍵移動位置即可;

添加端點:鼠標箭頭放在從某個矢量圖端點上,鼠標左鍵單擊該端點(會選中該端點,端點會變成黃色),再同時按住Ctrl鍵和鼠標左鍵即可拖動一個新的端點出來;

刪減端點:在刪減掉的矢量圖形端點上鼠標左鍵單擊,以選中該矢量圖形,再移動鼠標將該端點至其前一個端點或後一個端點上,再按一下Ctrl鍵即可刪掉該端點。

選擇模式3

在模式2下,再在矢量圖形範圍內鼠標左鍵(非端點位置)單擊一次,將進入選擇模式3上。選擇模式3除了有黃色矩形虛線輪廓,其輪廓端點會顯示爲白色。選擇模式3下,可以拉伸放大或縮小該矢量圖形(當然也可以平移)

3種選擇模式同時激活

進入模式3後,如果再在矢量圖形範圍內鼠標左鍵(非端點位置)單擊一次,三種選擇模式將同時激活,三種模式可以編輯的內容,都可以編輯
在這裏插入圖片描述

刪除矢量圖形

刪除圖形:可以在上述該矢量圖形的四種選擇模式下,按鍵盤上的Delete(Del)刪掉該矢量圖形

退出矢量編輯選擇模式

在三種選擇模式同時激活的情況下,如果再在矢量圖形範圍內鼠標左鍵(非端點位置)單擊一次,所有退出所有選擇模式

剛開始可能不習慣,需要多次練習。熟悉後,操作就會快很多。

確認該矢量多邊形無誤後。再通過選擇工具(箭頭)和平移工具(手指圖標),移動窗口位置至下一個區域,再次選擇不規則多邊形編輯工具,勾繪訓練樣本區域。
在這裏插入圖片描述
再次將鼠標左鍵放至合適位置,鼠標左鍵勾選多邊形頂點(不應少於3個),繪製最後一個頂點時,鼠標左鍵雙擊結速繪製。
在這裏插入圖片描述
如此反覆,勾繪30-80個樣本區域(注意覆蓋崇明島東西南北區域,也就是說,如果可能的話,訓練樣本儘量分散開。這裏的樣本數量比較多,因爲區域比較大,你可以結合實際情況進行調整。)

爲了評價分類的效果,還需要每一個地物創建驗證樣本(每一個地物,10-30個樣本),其它要求和訓練樣本相同,如分佈儘量均勻,同質等。在創建混淆矩陣時需要用到這個驗證樣本。

博主這裏創建了5個地物的訓練樣本區域以及它們對應的驗證樣本區域供10個矢量數據集,其中,帶有_valid後綴的是驗證樣本集(見下圖紅色框)。如下圖所示(bare_land,construction_land,crop,forest,water分別代表裸土、建設用地,農用地,林地,水體):

矢量圖層屬性修改

有時候在SNAP中新建一個矢量容器集(相當一個矢量圖層)需要修改矢量(這裏的樣本是不規則多邊形)圖形的屬性,如顏色,邊框,線條等。可以利用Layer Editor (圖層編輯器)來修改。

方式一

在打開的影像集中,先點擊要修改的矢量圖層(例如這裏選擇的crop_valid矢量圖層),然後選擇Layer—>Layer Editor

在這裏插入圖片描述

打開的圖層的編輯器在左下角。
在這裏插入圖片描述

方式二

在這裏插入圖片描述

我覺得方式二更方便一些,可以更快地切換矢量數據集。通常,我們只需要修改填充顏色(Fill)即可,某一些情況下也可以需要調整其它選項(例如填充顏色透明度)。

例如修改water_valid(水體驗證樣本)的顏色(這裏選擇的是深藍色,選擇More可以選擇更多顏色):
在這裏插入圖片描述
每一個地物的訓練樣本是相同顏色的,bare_land(裸地)是棕色,construction_land(建設用地)是紅色,crop(農用地)是淡藍色forest(林地)是,water(水體)是深藍色。

你可以自行調整各個矢量圖層(樣本集)的屬性。

查看矢量圖層屬性表

如果你將鼠標移動到某個矢量圖層上(停留幾秒),可以看到其旁邊會顯示一些提示(如下面water_valid旁的淡黃色提示語)

圖中geometry存放的是幾何屬性(多邊形端點的座標),style_css存放的是樣式屬性(css表示其採用的和Web前端中CSS樣式定義相同的樣式規則)。
在這裏插入圖片描述

樣本的導出與導入

從上面的屬性表可以看出,樣本(矢量)數據的geometry保存的幾何圖形格式和ESRI Shapefile(.shp)文件保存的幾何圖形格式(如果你瞭解格式的話)是一樣的。本質上說,SNAP創建樣本的過程和創建ESRI Shapefile文件是一樣的,因此,其轉換爲.shp文件是很容易的事情。這樣看來,SNAP的樣本數據與GIS軟件(QGIS與ArcGIS等)可以很容易進行對接。

樣本的導出

以農用地樣本數據(crop數據集)導出爲例。

方式一

在這裏插入圖片描述

方式二

隨後可以看到保存爲.shp的文件窗口打開,(選擇適當的路徑,.shp文件名默認即可):
在這裏插入圖片描述
需要注意的是,SNAP導出的.shp文件名,默認會添加後綴"_Polygon"(爲何是Polygon,因爲我們創建的是不規則的多邊形),不過文件名,不過,這不重要,不會影響GIS軟件的讀入與操作,這裏crop_Polygon.shp(默認添加了後綴)是導出的crop.shp。
在這裏插入圖片描述
將所有的訓練樣本導出後,再導入到QGIS(圖中增加了OpenStreetMap標準圖層)中看看效果:
在這裏插入圖片描述
可以看到導出的樣本數據和崇明島實際分佈的範圍完全一致。

樣本的導入

導入.shp文件是比較簡單的。可以在Vector—>Import下找到該導入方式:
在這裏插入圖片描述
選擇相應的路徑下的.shp文件即可:

在這裏插入圖片描述
接下來是一個提示,提示我們是否允許其每一個polygon作爲掩膜圖層用途,還有就是圖層的屬性字段(style_css),點擊no即可(不要選擇yes,否則.shp中每一個圖形都是一個圖形)。
在這裏插入圖片描述
導入成功後,可以在導入的數據集下Vector文件夾(Mask文件夾下也有)找到該矢量圖層:
在這裏插入圖片描述
(導入後,記得刪掉它,以免造成混亂,在該圖層上右擊,點Delete即可)

隨機森林算法分類

經過前面的步驟,訓練樣本和驗證樣本已經準備好了。接下來,我們利用隨機森林分類器來進行監督分類。SNAP中的監督分類器不是很全,但是一些比較重用的機器學習分類器是有的,但是這裏沒有支持向量機這個重要的分類器(可能的原因是這個分類器通常比較慢,相當於其它分類器而言)。我不會介紹隨機森林算法的具體原理,如果你想深入瞭解該分類算法的原理,請找本介紹機器學習算法的書來看下,網上也有很多關於這個分類算法的博客介紹,不再過多贅述。

本分類算法用到的樣本數據以及分類結果(原始特徵集數據見博客前面的百度雲盤鏈接),見下面的百度雲盤鏈接:
鏈接:https://pan.baidu.com/s/1Nt4hUZdORdNHvjFxnTiN8Q
提取碼:qls7
數據說明該百度雲盤鏈接下文件夾中的說明.txt文件

隨機森林分類器

選擇Raster—>Classification—>Supervised Classification—>Random Forest Classier,啓動隨機森林分類器:
在這裏插入圖片描述

選擇數據集

在這裏插入圖片描述

創建隨機森林分類訓練器

如果你接觸過隨機森林算法或者決策樹等算法,你會知道其實該分類器有很多影像分類精度的超參數。不過,實際上SNAP隨機森林分類訓練器只需要設置很少的參數,這裏比較重要的是Number of training samples(應該是劃分的最大樣本集數量,這個不是很確定,沒看到官方的詳細說明,這裏保持默認就好)和Number of trees(樹的數量)兩個參數,隨機森林分類算法涉及到其它的參數,算法有默認值。
通常樹的數量越大,精度越高,但是越往後,越難提高(而且提高多少也很難確定),但代價是耗費的時間也多。Number of trees樹的數量不宜超過300。

在這裏插入圖片描述
選擇用於分類的訓練樣本(矢量數據)集(不要選帶_valid後綴的樣本驗證集)以及所使用的特徵波段:
在這裏插入圖片描述

輸出數據集

保存默認即可。在這裏插入圖片描述
上述三個參數面板均設置完畢後,點擊Run即可。即可進行隨機森林分類。大概一小時多些後可以看到分類的結果(具體時間視數據量,電腦配置,分類參數設置等有關)。
在這裏插入圖片描述
分類結束後,還會自動打開一個newClassifier.txt文本文件,可以看到分類器的訓練情況:
在這裏插入圖片描述

該分類器文檔文件newClassifier.txt含有一些重要的指標,例如論文中常見的特徵重要性得分以及排序。
在這裏插入圖片描述
該newClassifier.txt文間默認存放在下圖所示的路徑:
在這裏插入圖片描述

分類結果

關閉隨機森林分類器窗口以及其對應的分類器.txt文件。在數據集2下Band文件夾下可以找到LabeledClasses這個波段。
在這裏插入圖片描述
在Colour Manipulation(顏色操作面板),設置地物類別的顏色,與訓練(驗證)樣本對應。

在這裏插入圖片描述

定性比較

和真彩色合成圖對比

先取消訓練樣本在真彩色合成圖上的顯示。
在這裏插入圖片描述
將兩個數據集水平分屏顯示(Windows—>Tile Horizontally),隨後關閉矢量圖層的顯示:
在這裏插入圖片描述
崇明島局部對比。可以看到裸地(bare_land,圈1)中有一部分被錯分爲建設用地,建設用地分類基本準確(圈2),農用地基本分類準確(圈3),林地分類基本準確(圈4),魚塘、河道等水體(圈5)基本準確(右圖LabeledClasses水體中的灰色部分是NaN值,原因是部分特徵可能存在一些缺失值或者異常值)。
在這裏插入圖片描述

和訓練樣本對比

再看看加上訓練樣本,看下效果(崇明島局部):
在這裏插入圖片描述

分類結果評價

前面的結果展示僅僅是定性的比較,更嚴謹的話,需要用到定量評價,這裏最常用的混淆矩陣方式進行評價。

很遺憾地告訴你,SNAP並沒有直接的分類精度評價功能,這個,有用戶向SNAP官方反映過,可能遲點官方會增加這個功能。不過,確實有一些方法可以間接獲取建立監督分類的混淆矩陣,用於評價該監督分類結果。接下來,我們利用SNAP的掩膜圖層統計(或者說是ROI統計)功能(有點類似GIS軟件的柵格圖像的區域統計)創建混淆矩陣。

思路:因爲SNAP中創建的樣本數據(矢量容器數據集)是以文件名區分,而分類後的LabeledClasses是一個索引值柵格值(柵格值是整數值,每個整數代表一類地物)。並且SNAP允許我們通過一個矢量圖層(掩膜)來構建直方圖。這樣,我們將每一個地物驗證樣本數據作爲一個掩膜圖層,在分類後的LabeledClasses柵格影像對該驗證樣本覆蓋範圍的像元值執行直方圖統計,即可以得到該類地物在LabeledClasses的分類結果(監督算法得到的預測值)。只要對每類地物進行一次這樣的直方圖統計,即組合成混淆矩陣,進而計算總體精度和Kappa係數等指標。

創建混淆矩陣

先關閉數據集1。如果你認真觀察隨機森林分類得到的數據集2,會發現其Vector Data(和Mask)文件夾相比數據集1少了訓練樣本矢量圖層,僅有檢驗樣本圖層保留下。
在這裏插入圖片描述
在分類時創建的檢驗樣本已經保留下來,不用我們再次導入,這很好!我們已經有了ROI掩膜圖層數據。

掩膜圖層直方圖統計

在菜單欄下Analysis—>Histogram下,可以打開柵格直方圖統計功能(你可以看下灰色網格背景的提示語):

因爲默認的直方圖統計統計索引,畫出的圖以及導出的數據都不是很好。所以我們需要修改一下直方圖統計作圖屬性,見下圖:
在這裏插入圖片描述
我們需要根據分類得到的LabeledClasses索引圖像元值範圍調整,後來我發現,掩膜圖層範圍裏沒有-1(缺失值的情況),其值範圍爲[0, 4]。我們略微調大一點調整直方圖的顯示的x座標軸範圍爲[-0.5, 4.5]。按下圖修改後,點擊OK!

在這裏插入圖片描述
還需要選擇ROI掩膜圖層,修改統計的區間個數,這裏應該爲5(因爲只有索引值0,1,2,3,4 ,共種情況)。你需要結合你的實際分類類別數目情況自己修改一下。下圖中的Bins,Min和Max需要和索引圖地物類別數目,最小值和最大值對應,否則會得到錯誤的統計結果
在這裏插入圖片描述
點擊Refresh View即可得到該掩膜圖層(ROI區域)範圍的直方圖統計(上圖是bare_land_valid圖層)。
在這裏插入圖片描述

我們新建一個excel文件,命名爲confusion_matrix.xlsx,將上述的粘貼板的數據粘貼表bare_land。可以看到該結果。
在這裏插入圖片描述

該統計表的結果顯示,表示真實地物爲裸土(bare_land)的像元中,26127個被分爲裸土(bare_land),4731個被分爲建設用地(construction),68個被分爲農用地(crop),0個被分爲林地(forest),0個被分爲水體。將Bins counts列(後5個值)複製以轉置複製到混淆矩陣的第一行上(圖中紅色框部分)。
在這裏插入圖片描述
對其它四個驗證樣本執行同樣的掩膜圖層統計。
在這裏插入圖片描述

即可以利用這些直方圖統計結果建立起我們的混淆矩陣,最終可以得到以下的混淆矩陣:
在這裏插入圖片描述

總體精度與Kappa係數計算

爲了說明總體精度與Kappa係數是如何計算,下圖建立一個虛擬的混淆矩陣,如下:
在這裏插入圖片描述

總體精度

Overall accurrcyP0=(a+b+c+d+e)N總體精度(Overall \space accurrcy)P_0=\frac{(a+b+c+d+e)}{N}
其中,N=A+B+C+D+E=A’+B’+C’+D’+E’。
在這裏插入圖片描述

Kappa係數

Kappa=P0Pe1PeKappa = \frac{P_0-P_e}{1-P_e}
其中,Pe=(AA)+(BB)+(CC)+(DD)+(EE)N2P_e=\frac{(A*A')+(B*B')+(C*C')+(D*D')+(E*E')}{N^2}

上面的兩個指標在得到混淆矩陣都可以計算得到,最終可以利用Excel可以得到下表:
在這裏插入圖片描述
看來分類結果很可以。儘管我所選的地物類別有些少,並且,我在勾選樣本時是憑經驗選的,這不是很正確的,更可靠的辦法是實際測量。

如果你將混淆矩陣保存爲以下格式的csv文件,也可以使用我用numpy編寫的Python程序(需要numpy庫支持)來計算用戶精度,生產者精度,總體精度,Kappa係數。confusion_matrix_py.csv的元素和上面的excel文件矩陣元素是一一對應的。列表示真實地物,行表示分類結果。confusion_matrix_py.csv文件內容如下:
在這裏插入圖片描述
Python代碼如下:

import numpy as np

# 導入混淆矩陣文件,該混淆矩陣列表示真實地物類別,行表示分類地物類別
# 需要修改對應的路徑名
confusion_matrix = np.loadtxt('G:\Test_Sentinel_2_L1C\confusion_matrix\confusion_matrix_py.csv', delimiter=',')
# 'bare_land','construction','crop','forest','water'
# 分別代表地物裸土,建設用地,農用地,林地,水體
label=['bare_land','construction','crop','forest','water']

#計算用戶精度函數
def get_user_accuracy(confusion_matrix:np.ndarray)->np.ndarray:
    # 獲取混淆矩陣對角線元素
    (M, N) = confusion_matrix.shape
    # 混淆矩陣是方陣M和N應該相等
    if M!=N:
        return None
    diag = np.diag(confusion_matrix)
    # 獲取每一列和
    col_sum = np.sum(confusion_matrix,axis=0)
    return diag/col_sum

# 計算生產者精度
def get_producer_accuracy(confusion_matrix:np.ndarray)->np.ndarray:
    # 獲取混淆矩陣對角線元素
    (M, N) = confusion_matrix.shape
    # 混淆矩陣是方陣M和N應該相等
    if M!=N:
        return None
    diag = np.diag(confusion_matrix)
    # 獲取每一行和
    row_sum = np.sum(confusion_matrix,axis=1)
    return diag/row_sum

# 計算總體精度
def get_overall_accuracy(confusion_matrix:np.ndarray)->np.float:
        # 獲取混淆矩陣對角線元素
    (M, N) = confusion_matrix.shape
    # 混淆矩陣是方陣M和N應該相等
    if M!=N:
        return None
    # 對角線元素和 
    diag_sum = np.sum(np.diag(confusion_matrix))
    # 所有元素和
    matrix_sum = np.sum(confusion_matrix)
    return diag_sum/matrix_sum

# 計算kappa係數
def get_kappa(confusion_matrix:np.ndarray)->np.float:
    
    # 獲取總體精度
    P_0 = get_overall_accuracy(confusion_matrix)
    # 列和與行和乘積和除以所有元素和的平方
    P_e = np.sum(np.sum(confusion_matrix, axis=0) * np.sum(confusion_matrix, axis=1)) / np.square(np.sum(confusion_matrix))
    return (P_0 - P_e) / (1 - P_e)

# 輸出各類地物的用戶精度
print("(地物類別,用戶精度)")
print(list(zip(label, get_user_accuracy(confusion_matrix))))

# 輸出各類地物的生產者精度
print("(地物類別,生產者精度)")
print(list(zip(label, get_producer_accuracy(confusion_matrix))))

# 輸出混淆矩陣總體精度,保留5位小數
print("總體精度: {0:.5f}".format(get_overall_accuracy(confusion_matrix)))

# 輸出kappa係數
print("kappa係數: {0:.5f}".format(get_kappa(confusion_matrix)))

分類後處理

分類後處理,可能涉及下面三個操作。區域掩膜可以在SNAP中直接完成,後兩個可以利用QGIS(ArcGIS等GIS軟件)或者OTB(ENVI等遙感處理軟件)。我只介紹第一個操作。

區域掩膜(裁剪)

有時候,我們需要的區域不是規則的矩形區域,而是像行政邊界等不規則的矩形。這裏,我需要的是崇明島範圍的分類圖,所以,我需要對得到分類圖利用崇明島邊界(.shp文件)對其進行掩膜裁剪。這裏,我利用的是SNAP的容器集手動勾繪的崇明島邊界文件chongming_island_mask_Polygon.shp對其進行裁剪。

矢量掩膜文件導入

其導入方式同樣本(矢量)數據相同。見下面兩圖:
在這裏插入圖片描述
在這裏插入圖片描述

導入成功後數據集2中可以看到其子文件夾Vector Data下,看到導入的shp圖層名。

在這裏插入圖片描述

掩膜裁剪

可以在Raster—>Masks—>Land/Sea Mask,打開陸地/海洋掩膜功能:

Land/Sea Mask操作,輸出輸入參數面板:
在這裏插入圖片描述
Land/Sea Masks操作處理參數,確認正確的矢量數據,點擊OK:
在這裏插入圖片描述掩膜成功後的結果:
在這裏插入圖片描述
導出爲geotiff格式後,導入到QGIS中看下(可以看到的確成功地進行了掩膜):
在這裏插入圖片描述

處理碎斑

面向像素分類得到的分類結果圖,一般會含有較多的碎斑,這時可以通過衆數濾波器得到減少或消除。

柵格圖矢量化

經過上述兩個步驟後,可以將分類得到的柵格圖結果矢量化,這樣,後續可以用於更多的GIS處理。

延伸

如果你想獲取更好的隨機森林分類體驗,QGIS中有兩個插件可以幫助你,分別是EnMap-Boxdzetsaka後者還含有支持向量機分類算法。當然OTB(Orfeo Toolbox)也可以,並且其支持面向對象分類。要介紹其分類過程,需要寫很長的教程,這裏不再展開了,也許日後有時間再來展開。如果你感興趣的話,可以看下其官網的幫助文檔。兩者均可以很方便地創建

當然,如果你編程比較厲害的話,你可以自己實現該算法的分類(Python、matlab、R等都可以)。Python中利用scikit-learn和gdal庫(或者snappy)是可以實現的。

結語

關於SNAP處理Sentinel-2數據的教程暫時告一段落先,地物分類只是其中的一個小應用。製作一幅高質量的地物分類圖是有許多要求的,並不是像我們想象中那麼簡單,許多細節都會影響到其分類精度,其中過程,只有自己實踐過才知道。不過,這幾篇教程中涵蓋一些SNAP基本操作,在,往後利用snappy和gpt(SNAP的命令行工具)處理數據,肯定有所幫助。需要學習的仍然有很多,不過,接下來要將精力轉向SAR數據(Sentinel-1)的處理和應用。但願,本篇博客能讓你有所收穫。

最近,新冠病毒比較嚴重,許多人的生活都受到了影響。這篇博客是在家裏完成了,效率比在學校低很多,也不知道什麼時候能回校。希望這次疫情儘快結束吧。

如果你對SNAP感興趣的話,可以加入歐空局SNAP處理交流羣(QQ羣:665903216)。最後,祝身體健康,生活愉快,事業進步!

參考文獻

[1] 馬明睿, 韓華, 王昊彬, 等. 基於RS和GIS的崇明縣生態系統健康評價[J]. 生態科學, 2014, 33(4):788-796.
[2] 孫家抦. 遙感原理與應用[M]. 武漢: 武漢大學出版社,2009.
[3] Jake VanderPlas(陶俊傑,陳小莉譯). Python數據科學手冊[M]. 北京:人民郵電出版社,2018.
[4] 李航. 統計學習方法[M].北京:清華大學出版社,2012.
[5] 朱文泉,林文鵬. 遙感數字圖像處理----原理與方法[M]. 北京:高等教育出版社,2016.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章