本文介紹基於R語言中的raster包,遍歷讀取多個文件夾下的多張柵格遙感影像,分別批量對每一個文件夾中的多個柵格圖像計算平均值,並將所得各個結果柵格分別加以保存的方法。
其中,本文是用R語言來進行操作的;如果希望基於Python語言實現類似的平均值求取操作,大家可以參考Python ArcPy批量計算多時相遙感影像的各像元平均值與Python忽略NoData計算多張遙感影像的像元平均值:whitebox庫這兩篇文章。
首先,來看一下本文所需實現的需求。如下圖所示,現有多個文件夾,其中每一個文件夾內部都含有大量的柵格遙感影像。

其中,上圖中的每一個文件夾的命名都是以遙感影像的分幅條帶號為依據的。例如,打開第一個名為47RMN的文件夾,其中均為條帶號為47RMN(即同一空間範圍)、不同成像時間的遙感影像,如下圖所示;其中,紫色框內的遙感影像文件名即可看出,這些圖像是同一條帶號、不同時間的遙感影像數據。

我們要做的,就是分別對每一個文件夾中的全部遙感影像計算平均值,從而得到不同條帶號遙感影像的平均值;最終我們將得到多張結果圖像,每一景結果圖像就是這一條帶號、不同成像時間對應的遙感影像的平均值。同時為了方便區分,我們需要將每一景結果圖像文件的文件名設置為與條帶號有關的內容。
明確了需求,我們即可開始代碼的撰寫。本文所用到的代碼如下所示。
library(raster)
result_path <- r"(E:\02_Project\01_Chlorophyll\Select\Result)"
tif_folder <- list.files(path = r"(E:\02_Project\01_Chlorophyll\Select)", pattern = NULL, all.files = FALSE, full.names = TRUE)
for (folder in tif_folder){
folder_name <- substr(folder, nchar(folder) - 4, nchar(folder))
tif_file_name <- list.files(path = folder, pattern = ".tif$", full.names = TRUE, ignore.case = TRUE)
tif_file_all <- stack(tif_file_name)
NAvalue(tif_file_all) <- -10000
tif_mean <- calc(tif_file_all, fun = mean, na.rm = TRUE)
tif_mean_new <- tif_mean / 100
# plot(tif_mean_new)
result_file_name <- file.path(result_path, paste(folder_name, "_mean.tif", sep = ""))
rf <- writeRaster(tif_mean_new, filename = result_file_name, overwrite = TRUE)
cat(folder_name, "is completed!", "\n")
}
首先,需要通過library(raster)代碼,導入本文所需的R語言raster包;關於這一包的配置,大家可以參考基於R語言的raster包讀取遙感影像。接下來,我們需要指定結果存放的路徑,並將其放入變量result_path中。
接下來,我們通過list.files()函數,將包含有各個條帶號的小文件夾的大文件夾(也就是本文開頭第一張圖所示的文件夾)加以遍歷,將每一個小文件夾的路徑存入tif_folder。執行上述前3行代碼後,得到的tif_folder結果如下圖所示。

可以看到,tif_folder是一個字符串,其中每一個元素都是每一個小文件夾的路徑。
接下來的for循環,就是對tif_folder加以遍歷,即對每一個小文件夾進行操作。其中,我們首先通過substr()函數,獲取當前操作的小文件夾名稱,並將其存放於folder_name中;隨後,對當前對應的小文件夾加以遍歷,取出其中的全部遙感影像文件,並存放於tif_file_name;接下來,就是讀取全部遙感影像,並計算其平均值;這裏具體的代碼解釋大家可以參考文章R語言求取大量遙感影像的平均值、標準差:raster庫。此外需要注意的是,由於我這裏每一景遙感影像原本沒有專門設置NoData值,而是用-10000作為其NoData值,因此需要通過NAvalue(tif_file_all) <- -10000這句代碼,將值為-10000的像元作為NoData值的像元,防止後期計算平均值時對結果加以干擾。
接下來,我們通過file.path()函數配置一下輸出結果的路徑——其中,結果遙感影像文件的名稱就可以直接以其所對應的條帶號來設置,並在條帶號後添加一個_mean後綴,表明這個是平均值的結果圖像;但此外,這個僅僅是文件的名字,還需要將文件名與路徑拼接在一起,才可以成為完整的保存路徑,因此需要用到file.path()函數。最後,將結果圖像通過writeRaster()函數加以保存即可,這句代碼的解釋大家同樣參考R語言求取大量遙感影像的平均值、標準差:raster庫這篇文章即可。
最後,由於我們要處理的文件夾比較多,因此可以通過cat()函數輸出一下當前代碼的運行進度。
運行上述代碼,我們將在指定的結果保存路徑中看到每一個條帶號對應的平均值結果圖像,如下圖所示。

至此,大功告成。