R語(yǔ)言拼接多張柵格圖像的方法

??本文介紹基于R語(yǔ)言中的raster包,遍歷文件夾,讀取文件夾下的大量柵格遙感影像,并逐一對(duì)每一景柵格圖像加以拼接融合,使得全部柵格遙感影像拼接為完整的一景圖像的方法。

??其中,本文是用R語(yǔ)言來(lái)進(jìn)行操作的;如果希望基于Python語(yǔ)言實(shí)現(xiàn)類似的批量拼接、鑲嵌操作,大家可以參考文章Python中ArcPy實(shí)現(xiàn)柵格圖層創(chuàng)建與多景遙感影像批量拼接Mosaic的方法http://www.itdecent.cn/p/09f237b4b3d4)與Python中ArcPy依據(jù)成像時(shí)間對(duì)不同時(shí)相柵格圖像依次批量拼接http://www.itdecent.cn/p/ae7048b660e9)這兩篇文章。

??首先,來(lái)看一下本文所需實(shí)現(xiàn)的需求。如下圖所示,現(xiàn)有一個(gè)文件夾,其中含有大量柵格遙感影像;這些遙感影像均為同一成像時(shí)間、不同空間范圍的遙感影像。我們希望做到的,就是對(duì)這些遙感影像加以拼接,最終的結(jié)果圖像就是一景將這里各個(gè)圖像拼接后的大圖像。

??明確了需求,我們即可開(kāi)始代碼的撰寫(xiě)。本文所用到的代碼如下所示。

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)

??首先,需要通過(guò)library(raster)代碼,導(dǎo)入本文所需的R語(yǔ)言raster包;關(guān)于這一包的配置,大家可以參考R語(yǔ)言讀取柵格遙感影像數(shù)據(jù)的方法http://www.itdecent.cn/p/675f2edb16c3)。接下來(lái),我們通過(guò)list.files()函數(shù),遍歷指定文件夾,從而獲取當(dāng)前文件夾下所包含的全部.tif格式的遙感影像,也就是全部待拼接的遙感影像。

??接下來(lái),我們需要為柵格遙感影像的拼接做準(zhǔn)備——也就是for循環(huán)內(nèi)部的內(nèi)容。此時(shí),tif_file_name變量中存放的是指定文件夾下的全部柵格遙感影像的文件名稱,而不是遙感影像文件自身;而接下來(lái)我們進(jìn)行拼接、融合的函數(shù),都需要保證函數(shù)參數(shù)中的遙感影像是一個(gè)柵格對(duì)象Raster* object)類型的變量。因此,我們需要在這個(gè)for循環(huán)中,通過(guò)raster()函數(shù),將每一個(gè)遙感影像的文件名(字符串類型)轉(zhuǎn)為柵格對(duì)象類型。至于什么是柵格對(duì)象類型的變量,我們可以參考下圖:其中Formal class RasterLayer即表示這一變量為柵格對(duì)象類型的。

??接下來(lái),代碼分為2個(gè)部分。其中,for循環(huán)后的4行代碼是第一部分,為柵格拼接的代碼;同時(shí)為了對(duì)比柵格拼接與柵格融合的操作,這里還將柵格融合的代碼也一并列出了,也就是注釋掉的那一行代碼。

??我們首先來(lái)看第一部分代碼,這里通過(guò)mosaic()函數(shù)來(lái)實(shí)現(xiàn)柵格遙感影像的拼接。這一函數(shù)原本的參數(shù)中,只有2個(gè)柵格對(duì)象(Raster* object)類型的參數(shù),換句話說(shuō)就是原本這個(gè)函數(shù)只能同時(shí)拼接2個(gè)柵格遙感影像;如果我們有更多的遙感影像,就需要每一次拼接2個(gè)柵格圖像,不斷重復(fù)這一操作,直到全部的柵格遙感影像拼接完畢。這樣操作無(wú)疑是比較麻煩的,因此我們需要借助do.call()函數(shù)來(lái)實(shí)現(xiàn)2個(gè)以上柵格的拼接工作——這個(gè)do.call()函數(shù)可以接受可變數(shù)量的參數(shù),例如本文中我們需要對(duì)大量柵格遙感影像加以逐一拼接,具體有多少景遙感影像我們自己也不一定確定,且也不關(guān)心;因此就結(jié)合這一函數(shù),將剛剛已經(jīng)轉(zhuǎn)為柵格對(duì)象(Raster* object)類型的圖像所組成的列表tif_file_list作為參數(shù),用do.call()函數(shù)來(lái)調(diào)用mosaic()函數(shù),直到將tif_file_list列表中全部的柵格對(duì)象(Raster* object)類型的元素都帶入到mosaic()函數(shù)運(yùn)行后,do.call()函數(shù)就結(jié)束了。

??此外,由于mosaic()函數(shù)在運(yùn)行時(shí),除了兩個(gè)柵格對(duì)象(Raster* object)類型的參數(shù),還有其他的一些輔助參數(shù),比如拼接時(shí)重疊區(qū)域該如何處理、處理時(shí)是否考慮NoData值的影響等;由于我們時(shí)通過(guò)do.call()函數(shù)來(lái)調(diào)用mosaic()函數(shù),因此這些參數(shù)就不太好直接指定了。因此,我們可以通過(guò)$運(yùn)算符,將mosaic()函數(shù)所需要的其他參數(shù)一并放入tif_file_list中,在后期do.call()函數(shù)調(diào)用mosaic()函數(shù)時(shí),將同時(shí)讀取這些參數(shù),起到將參數(shù)傳遞到mosaic()函數(shù)中的功能。其中,在本文中我們需要指定mosaic()函數(shù)的fun參數(shù)與na.rm參數(shù),二者分別是指拼接時(shí)重疊區(qū)域像元值的計(jì)算方法,以及計(jì)算重疊區(qū)域像元值時(shí),是否考慮NoData值的影響;我們將這2個(gè)參數(shù)分別設(shè)定為maxTRUE,二者分別是指重疊區(qū)域的像元以2景遙感影像中的最大值像元為準(zhǔn),以及在計(jì)算時(shí)不考慮NoData值的影響。

??接下來(lái),就是第二部分,即柵格融合的代碼;在這里,我們通過(guò)merge()函數(shù)來(lái)實(shí)現(xiàn)遙感影像的融合。其實(shí),這里的merge()函數(shù)與前述的mosaic()函數(shù)功能大致一樣,但merge()函數(shù)在處理重疊區(qū)域時(shí),默認(rèn)選擇位于頂層的遙感影像的像元數(shù)值,就沒(méi)有mosaic()函數(shù)中的這么多計(jì)算方法選擇了。

??最后,這里末尾的一句代碼,就是將結(jié)果圖像通過(guò)writeRaster()函數(shù)加以保存;這句代碼的解釋大家同樣參考R語(yǔ)言批量計(jì)算大量柵格圖像平均值、標(biāo)準(zhǔn)差http://www.itdecent.cn/p/309c1beb656c)這篇文章即可。

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

??至此,大功告成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容