本文介绍基于R语言中的raster包,遍历文件夹,读取文件夹下的大量栅格遥感影像,并逐一对每一景栅格图像加以拼接融合,使得全部栅格遥感影像拼接为完整的一景图像的方法。

  其中,本文是用R语言来进行操作的;如果希望基于Python语言实现类似的批量拼接、镶嵌操作,大家可以参考Python arcpy创建栅格、批量拼接栅格Python ArcPy批量拼接长时间序列栅格图像这两篇文章。

  首先,来看一下本文所需实现的需求。如下图所示,现有一个文件夹,其中含有大量栅格遥感影像;这些遥感影像均为同一成像时间不同空间范围的遥感影像。我们希望做到的,就是对这些遥感影像加以拼接,最终的结果图像就是一景将这里各个图像拼接后的大图像。

  明确了需求,我们即可开始代码的撰写。本文所用到的代码如下所示。

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库这篇文章即可。

  随后,运行上述代码,我们就可以获得将指定文件夹内全部栅格遥感影像加以拼接(执行代码中的第一部分)或者融合(执行代码中的第二部分)的结果了。

  至此,大功告成。

R语言将多景遥感影像拼接在一起的方法的更多相关文章

  1. 用R语言实现对不平衡数据的四种处理方法

    https://www.weixin765.com/doc/gmlxlfqf.html 在对不平衡的分类数据集进行建模时,机器学**算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带 ...

  2. 吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)

    #-----------------------------------# # R in Action (2nd ed): Chapter 18 # # Advanced methods for mi ...

  3. R语言中将hello打印10次的两种方法

    我们有两种方法来做这件事情: 1.for结构 for循环重复的执行一个语句,直到某个变量的值不再包含在序列seq中为止. 语法: for (var in seq) statement 例如: > ...

  4. 大数据时代的精准数据挖掘——使用R语言

    老师简介: Gino老师,即将步入不惑之年,早年获得名校数学与应用数学专业学士和统计学专业硕士,有海外学习和工作的经历,近二十年来一直进行着数据分析的理论和实践,数学.统计和计算机功底强悍. 曾在某一 ...

  5. R语言(自定义函数、循环语句、管道函数)

    学习R语言半年多了,以前比较注重统计方法上的学习,但是最近感觉一些基础知识也很重要.去年的参考资料是<R语言实战>,今年主要是看视频.推荐网易云课堂里的教程,很多资料都是很良心的~ 目前学 ...

  6. 《R语言实战》读书笔记 第七章--基本统计分析

    在导入数据并且将数据进行组织和初步可视化以后,需要对数据进行分布探索和两两关系分析等.主要内容有描述性统计分析.频数表和列联表.相关系数和协方差.t检验.非参数统计. 7.1描述性统计分析 7.1.1 ...

  7. R语言- 实验报告 - 利用R语言脚本与Java相互调用

    一. 实训内容 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出. 在Java中调用R语言程序.本实验通过eclipse编写Java程序的方式,调 ...

  8. R 语言实战-Part 4 笔记

    R 语言实战(第二版) part 4 高级方法 -------------第13章 广义线性模型------------------ #前面分析了线性模型中的回归和方差分析,前提都是假设因变量服从正态 ...

  9. R 语言实战-Part 3 笔记

    R 语言实战(第二版) part 3 中级方法 -------------第8章 回归------------------ #概念:用一个或多个自变量(预测变量)来预测因变量(响应变量)的方法 #最常 ...

  10. R语言实战-Part 2笔记

    R 语言实战(第二版) part 2 基本方法 -------------第6章 基本图形------------------ #1.条形图 #一般是类别型(离散)变量 library(vcd) he ...

随机推荐

  1. 基于 three.js 加载器分别加载模型

    点击查看代码 /** * 参数:模型文件路径,成功回调函数 * * 基于 three.js 加载器分别加载模型 * * 全部加载后通过回调函数传出打印 */ import { FBXLoader } ...

  2. k8s master不可以被调度,修改deploy配置让这个可以单独调度上去

    给两个节点添加标签,让pod调度上去,但是kubectl describe pod  发现报错了,因为master不可以被调度,kube002也是设置了污点禁止被调度了 Warning FailedS ...

  3. uniapp android端和ios端铃声静音,但是还是会震动

    uniapp 使用了html5plus的api,可以实现调用原生的api功能,htm5plus官方api文档: https://www.html5plus.org/doc/zh_cn/ios.html ...

  4. 『手撕Vue-CLI』获取下载目录

    开篇 在上一篇文章中,简单的对 Nue-CLI 的代码通过函数柯里化优化了一下,这一次来实现一个获取下载目录的功能. 背景 在 Nue-CLI 中,我现在实现的是 create 指令,这个指令本质就是 ...

  5. 8.19考试总结(NOIP模拟44)[Emotional Flutter·Medium Counting·Huge Counting·字符消除2 ]

    在自称善意的之时,即存恶意. 前言 几乎是大暑假的最后一次考试了. 我也迎来了我的第一次报零(雾 T1 Emotional Flutter 解题思路 比较考验思维能力,其实就是区间覆盖问题. 我考场上 ...

  6. js 实现仿百度换肤效果

    图片自行换掉即可查看效果,原理就是基于tab切换的效果实现的 效果图 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <met ...

  7. python——入门

    操作系统 操作系统就是一个特殊的软件 作用有两个,第一个:直接操作硬件:第二个:把操作硬件的代码封装成一个又一个的系统调用 python的特点 python是完全面向对象的语言 函数,模块,数字,字符 ...

  8. Mesh快连

    Mesh快连 一.名词解释 Mesh快连是一种由多个节点组成的网络系统,这些节点可以相互连接,形成一个"网状"的结构. 二.如何使用 有线Mesh: 网络拓扑: 设备版本:3.7. ...

  9. ABC351

    我多久没更新这个系列了啊 E 把格子分成两类,每一类之间的坐标均可互相走到. 然后将这里面的点都旋转 \(45\) 度,于是这个问题就被转换成曼哈顿距离的问题了. 我们可以把 \(x\) 和 \(y\ ...

  10. MySQL数据库开发(2)

    单表查询 单表查询即对单个表进行查询. 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY fie ...