1. 程式人生 > >為影像資料去除無效值

為影像資料去除無效值

在使用柵格資料時,黑邊和白邊問題比較困擾我們,╮(╯-╰)╭ ,醜醜地如下所示:

這裡寫圖片描述

那如何處理這些問題呢?方法不是唯一的,我把 ArcMap 中最常用的幾種方式列舉一下,幫你給資料“化妝”,或者更確切的說是“整容”:



Option 1 柵格計算器

在去黑邊之前最先需要了解的是黑邊的像元值是什麼? 可以使用 Identify 工具這裡寫圖片描述 查檢視。 例如這份資料是 0。

這裡寫圖片描述

這時,你也許會想到設定圖層背景值的色彩可以吧?

這裡寫圖片描述

如果僅為了顯示使用,是可以解決問題的,但傳統意義上的去黑邊,我們一般理解成柵格資料的處理,也就是從儲存上修改特定值(本例中是 0)值為 Nodata。

單波段資料處理起來常常相對容易些,最常用的工具就是 柵格計算器/Raster Calculator 了。Raster Calculator 可以通過輸入的Python語法的表示式,對當前資料框內的柵格圖層進運算。它是個非常實用的柵格資料處理工具,如果你想 Dive In ,點 這裡瞭解 Raster Calculator 的工作原理。

例如這個需求中僅需要一個簡單表示式,使用到SetNull函式,如下所示:

這裡寫圖片描述

其中,表示式是 SetNull(“RasterLayer” == 0 , “RasterLayer” )

這樣執行工具之後,所有的 0 值變成了 Nodata,徹底去了黑邊。



Option 2 影像分析視窗

多波段資料同樣會受到黑邊的困擾,而且現實情況往往沒有單波段資料那麼理想,僅通過一個表示式就可以搞定。例如,我們常用的影像底圖資料,通常有三個波段,通過包含RGB三個波段的一組值來表示像元值,例如 (0,255,129)。我一般會根據需要處理的資料量的多少給出不同的處理方法建議:

同樣第一步需要確認黑邊值是什麼?本例中是 (0,0,0)

這裡寫圖片描述


ArcMap的 Windows 選單中有 Image Analysis 。在 Image Analysis 視窗中的 Processing 部分可以對當前資料框中的圖層賦予函式或函式鏈,從而對柵格資料實時處理。

這裡寫圖片描述

在彈出的視窗中,在 fx行右鍵插入函式,例如這個需求中會使用到 Mask Function。

這裡寫圖片描述

設定 Mask Function,(0,0,0) 組合是無效值。為什麼選擇 All 而不是 Any? 這個答案很顯見,同時都為0的像元值才是無效值,否則不是,例如(1,255,0)是有效的。或者說各個波段的0值是and關係,而不是or。

這裡寫圖片描述

這樣帶有函式的新柵格圖層會自動加入 ArcMap 的 TOC,看起來萬事大吉,然而這裡需要說明下,這個圖層需要Export到硬碟上的某個位置,它目前還是個臨時資料,當layer被移除掉,這個結果就不復存在。

這裡寫圖片描述

所以,最後重要的一步,匯出資料。

這裡寫圖片描述


( ̄ˇ ̄) 這種方法,還適用於具有多種無效值的情況。例如,除了(0,0,0) 還包含 (255,255,255) :

這裡寫圖片描述

我們需要做的僅是繼續增加柵格函式。在 Function Template Editor 中函式們順序相接,像個環環相接的鏈條,所以稱為 ”函式鏈/ Function Chain“,咦,好像跑題了。請繼續看如何設定無效值:

這裡寫圖片描述

這樣就實現了去掉兩組無效值。



Option 3 鑲嵌資料集

那麼擺在你面前的資料不是一個,而是“很多”呢?凡事保證質量之後,重複工作多了之後就同時需要保證效率,那麼這種方法適用於“很多”、“大量”……

ArcGIS 的鑲嵌資料集是個理想與實用兼備的影像資料管理模型,我們用它來“處理”大量柵格資料也是個不錯的選擇。

在地理資料庫中建立鑲嵌資料集,並將資料新增到鑲嵌資料集中,之後:

在”之後“之前的預備動作,此文中不贅述,但是你可以看這篇瞭解這些內容。

這裡寫圖片描述

這裡寫圖片描述

在鑲嵌資料集中可以使用工具 Define Mosaic Dataset Nodata 工具,對資料的無效值進行定義。

這裡寫圖片描述

從而批量去除了無效值。

鑲嵌資料集本身也支援柵格函式,類似影像資料視窗中函式模板的設定,同樣可以設定函式鏈來實現一些複雜的要求。

這裡寫圖片描述

有關鑲嵌資料集函式,也可以參考這篇


常見的操作一般就這幾種,總結下,單波段優先考慮柵格計算器;多波段可以使用影像分析視窗;如果資料量較大,建議使用鑲嵌資料集。

ArcGIS Desktop 雖然不是專業做影像資料處理的平臺,但是擁有的這些功能能很大程度上解決影像處理的常見問題。寫這一篇是因為不少使用者遇到類似問題,集中總結下比較有意義,希望給大家一些思路,下次遇到此類的問題時,自己動手試試吧。