R語言將多景遙感影像拼接在一起的方法

疯狂学习GIS發表於2024-07-11

  本文介紹基於R語言中的raster包,遍歷資料夾,讀取資料夾下的大量柵格遙感影像,並逐一對每一景柵格影像加以拼接融合,使得全部柵格遙感影像拼接為完整的一景影像的方法。

  其中,本文是用R語言來進行操作的;如果希望基於Python語言實現類似的批次拼接、鑲嵌操作,大家可以參考Python arcpy建立柵格、批次拼接柵格Python ArcPy批次拼接長時間序列柵格影像這兩篇文章。

  首先,來看一下本文所需實現的需求。如下圖所示,現有一個資料夾,其中含有大量柵格遙感影像;這些遙感影像均為同一成像時間不同空間範圍的遙感影像。我們希望做到的,就是對這些遙感影像加以拼接,最終的結果影像就是一景將這裡各個影像拼接後的大影像。

image

  明確了需求,我們即可開始程式碼的撰寫。本文所用到的程式碼如下所示。

library(raster)
tif_file_name <- list.files(path = r"(E:\02_Project\01_Chlorophyll\Select\Result)", pattern = ".tif$", full.names = TRUE, ignore.case = TRUE)
tif_file_list <- list()
for (i in 1:length(tif_file_name)){
  tif_file_list[i] <- raster(tif_file_name[i])
}

tif_file_list$fun <- max
tif_file_list$na.rm <- TRUE
tif_mosaic <- do.call(mosaic, tif_file_list)
plot(tif_mosaic)

# tif_merge <- do.call(merge, tif_file_list)

rf <- writeRaster(tif_mosaic, filename = r"(E:\02_Project\01_Chlorophyll\Select\NewClip\LCC_SC_3.tif)", overwrite = TRUE)

  首先,需要透過library(raster)程式碼,匯入本文所需的R語言raster包;關於這一包的配置,大家可以參考基於R語言的raster包讀取遙感影像。接下來,我們透過list.files()函式,遍歷指定資料夾,從而獲取當前資料夾下所包含的全部.tif格式的遙感影像,也就是全部待拼接的遙感影像。

  接下來,我們需要為柵格遙感影像的拼接做準備——也就是for迴圈內部的內容。此時,tif_file_name變數中存放的是指定資料夾下的全部柵格遙感影像的檔名稱,而不是遙感影像檔案自身;而接下來我們進行拼接、融合的函式,都需要保證函式引數中的遙感影像是一個柵格物件Raster* object)型別的變數。因此,我們需要在這個for迴圈中,透過raster()函式,將每一個遙感影像的檔名(字串型別)轉為柵格物件型別。至於什麼是柵格物件型別的變數,我們可以參考下圖:其中Formal class RasterLayer即表示這一變數為柵格物件型別的。

  接下來,程式碼分為2個部分。其中,for迴圈後的4行程式碼是第一部分,為柵格拼接的程式碼;同時為了對比柵格拼接與柵格融合的操作,這裡還將柵格融合的程式碼也一併列出了,也就是註釋掉的那一行程式碼。

  我們首先來看第一部分程式碼,這裡透過mosaic()函式來實現柵格遙感影像的拼接。這一函式原本的引數中,只有2個柵格物件(Raster* object)型別的引數,換句話說就是原本這個函式只能同時拼接2個柵格遙感影像;如果我們有更多的遙感影像,就需要每一次拼接2個柵格影像,不斷重複這一操作,直到全部的柵格遙感影像拼接完畢。這樣操作無疑是比較麻煩的,因此我們需要藉助do.call()函式來實現2個以上柵格的拼接工作——這個do.call()函式可以接受可變數量的引數,例如本文中我們需要對大量柵格遙感影像加以逐一拼接,具體有多少景遙感影像我們自己也不一定確定,且也不關心;因此就結合這一函式,將剛剛已經轉為柵格物件(Raster* object)型別的影像所組成的列表tif_file_list作為引數,用do.call()函式來呼叫mosaic()函式,直到將tif_file_list列表中全部的柵格物件(Raster* object)型別的元素都帶入到mosaic()函式執行後,do.call()函式就結束了。

  此外,由於mosaic()函式在執行時,除了兩個柵格物件(Raster* object)型別的引數,還有其他的一些輔助引數,比如拼接時重疊區域該如何處理、處理時是否考慮NoData值的影響等;由於我們時透過do.call()函式來呼叫mosaic()函式,因此這些引數就不太好直接指定了。因此,我們可以透過$運算子,將mosaic()函式所需要的其他引數一併放入tif_file_list中,在後期do.call()函式呼叫mosaic()函式時,將同時讀取這些引數,起到將引數傳遞到mosaic()函式中的功能。其中,在本文中我們需要指定mosaic()函式的fun引數與na.rm引數,二者分別是指拼接時重疊區域像元值的計算方法,以及計算重疊區域像元值時,是否考慮NoData值的影響;我們將這2個引數分別設定為maxTRUE,二者分別是指重疊區域的像元以2景遙感影像中的最大值像元為準,以及在計算時不考慮NoData值的影響。

  接下來,就是第二部分,即柵格融合的程式碼;在這裡,我們透過merge()函式來實現遙感影像的融合。其實,這裡的merge()函式與前述的mosaic()函式功能大致一樣,但merge()函式在處理重疊區域時,預設選擇位於頂層的遙感影像的像元數值,就沒有mosaic()函式中的這麼多計算方法選擇了。

  最後,這裡末尾的一句程式碼,就是將結果影像透過writeRaster()函式加以儲存;這句程式碼的解釋大家同樣參考R語言求取大量遙感影像的平均值、標準差:raster庫這篇文章即可。

  隨後,執行上述程式碼,我們就可以獲得將指定資料夾內全部柵格遙感影像加以拼接(執行程式碼中的第一部分)或者融合(執行程式碼中的第二部分)的結果了。

  至此,大功告成。

相關文章