动态

详情 返回 返回

R語言求取大量遙感影像的平均值、標準差:raster庫 - 动态 详情

  本文介紹基於R語言中的raster包,批量讀取多張柵格圖像,對多個柵格圖像計算平均值標準差,並將所得新的柵格結果圖像保存的方法。

  在文章基於R語言的raster包讀取遙感影像中,我們介紹了基於R語言raster包,對單張或多張柵格圖像加以平均值標準差計算的方法;但這一篇文章中的標準差計算方法僅僅可以對一張柵格圖像的全部像元加以計算,即標準差計算結果是一個具體的數值,而不是一景結果影像;無法對多張、多時相的柵格圖像進行計算。本文就介紹另一種方法,可以對多個時相的大量柵格影像加以逐像元平均值、標準差的計算,從而使得最終的結果是一景表示各個像元在全部時相的圖像中的平均值或標準差的圖像

  首先,我們按照文章基於R語言的raster包讀取遙感影像中提到的方法,配置、加載raster包,並通過stack()函數讀取同一文件夾下的全部柵格圖像,具體代碼如下所示。其中,代碼的含義我們在上述這一篇文章中已經加以介紹,這裏就不再贅述。

library(raster)
tif_file_path <- list.files(r"(E:\02_Project\01_Chlorophyll\LCC_SC_2020\SD)", pattern = ".tif$", full.names = TRUE, ignore.case = TRUE)
tif_file_all <- stack(tif_file_path)

  運行上述代碼,可以看到已經得到了RasterStack格式的結果數據,如下圖所示。

image

  接下來,我們通過calc()函數,對多時相柵格遙感影像數據加以計算;其中,其第一個參數tif_file_all就是需要加以計算的多個柵格圖像,而第二個參數fun = sd表示我們需要計算標準差;如果我們需要計算平均值,那麼就將第二個參數修改為fun = mean即可,我們這裏就以標準差為例介紹後續的操作。當然,前述提到的文章基於R語言的raster包讀取遙感影像中的方法也是可以對多個柵格圖像計算平均值的。

tif_sd <- calc(tif_file_all, fun = sd)
plot(tif_sd)

  此外,上述代碼在calc()函數運行時,若某一空間位置上的像元多張柵格遙感影像中,存在至少一個無效值(NoData值),則這一像元在最終的結果圖像中同樣為無效值;若希望忽略無效值的這一影響,可以將上述第一句代碼修改為如下格式。其中,na.rm = TRUE就表示若某一景柵格遙感影像中某像元為無效值,則忽略這一景影像中的這一個像元。

tif_sd <- calc(tif_file_all, fun = sd, na.rm = TRUE)

  運行calc()函數後,我們可以通過plot()函數將結果圖像繪製出來,如下圖所示。

  上圖即為多個柵格圖像的像元數值時間序列依次計算標準差所得的結果。

  此外,由於我這裏的柵格像元數據實際表達的數值之間有一個縮放係數0.01,因此通過下述代碼將其像元值恢復為實際含義的數值。

tif_sd_new <- tif_sd / 100
plot(tif_sd_new)

  隨後,重新繪製結果圖;確認無誤後,即可依據writeRaster()函數,通過如下代碼保存我們剛剛得到的標準差結果柵格圖像。

rf <- writeRaster(tif_sd_new, filename = r"(E:\02_Project\01_Chlorophyll\LCC_SC_2020\SD\LCC_SD.tif)", overwrite = TRUE)

  運行代碼後,如下圖所示。其中,writeRaster()函數的第一個參數表示我們將要保存的柵格數據,第二個參數表示保存柵格文件的路徑與名稱,第三個參數表示,如果第二個參數指定的路徑與名稱已經有文件存在了,是否直接對其加以覆蓋。

  隨後,我們即可在指定的路徑下找到我們剛剛計算得到的多個柵格圖像的標準差結果。

  至此,大功告成。

user avatar fhey 头像 zcj-0928 头像
点赞 2 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.