Stories

Detail Return Return

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

  本文介紹基於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庫這篇文章即可。

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

  至此,大功告成。

user avatar s0611163 Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.