当前位置: 首页 > news >正文

教程:使用Python裁剪TIF影像为多个自定义大小的小块(分割栅格)

教程:使用Python裁剪TIF影像为多个自定义大小的小块(分割栅格)

随着遥感技术的不断发展,影像数据的处理和分析在地理信息系统(GIS)和遥感领域显得尤为重要。在实际项目中,处理大规模的TIF影像数据往往需要对影像进行裁剪,以便后续分析和处理。本文将通过一段Python代码,详细讲解如何使用滑动窗口方法裁剪TIF影像。

一、引言

在遥感图像处理中,TIF格式的影像数据非常常见。这些影像数据通常包含多个波段,并且其大小可能非常庞大,直接使用和处理会消耗大量计算资源。为了更有效地处理这些数据,我们可以使用裁剪技术将大尺寸的影像分割成更小的块。

本文将展示一段Python脚本,利用滑动窗口裁剪方法将大幅TIF影像分割成多个自定义大小的小块,便于后续的分析与处理。
在这里插入图片描述

影像为2023年4月获取的北京平谷区的一景多光谱影像。在这篇文章中,我们的任务是将上述影像裁剪成多个540x540大小的TIF影像,以便后续使用和分析。
在这里插入图片描述

二、Python脚本的功能概述

该脚本的主要功能是:

  1. 读取TIF影像:通过GDAL库读取影像及其地理信息。
  2. 滑动窗口裁剪:将影像按照指定的窗口大小和重叠率进行裁剪。
  3. 保存裁剪后的影像:将裁剪后的影像保存为新的TIF文件,同时保留其地理坐标和投影信息。

三、关键代码解析

接下来,我们将详细解析代码的关键部分,帮助您更好地理解每个功能模块的实现。

3.1 导入必要的库

import os
import sys
try:import gdal
except:from osgeo import gdal
import numpy as np
from PIL import Image
  • ossys:用于文件路径操作和系统级操作。
  • gdal:用于读取和处理地理空间数据。
  • numpy:用于数值计算和数组操作。
  • PIL:用于处理图像。

3.2 保存TIF文件的函数

首先,我们定义了一个函数writeTiff,用于将裁剪后的影像保存为新的TIF文件。

def writeTiff(im_data, im_geotrans, im_proj, path):datatype = gdal.GDT_Float32im_data = np.array([im_data])_, im_bands, im_height, im_width = im_data.shapedriver = gdal.GetDriverByName("GTiff")dataset = driver.Create(path, int(im_width), int(im_height), int(im_bands), datatype)if (dataset != None):dataset.SetGeoTransform(im_geotrans)dataset.SetProjection(im_proj)for i in range(im_bands):dataset.GetRasterBand(i + 1).WriteArray(im_data[0,i])del dataset
  • im_data:裁剪后的影像数据。
  • im_geotrans:地理坐标信息。
  • im_proj:投影信息。
  • path:保存路径。

3.3 坐标转换函数

在裁剪影像时,我们需要保持地理坐标信息。CoordTransf函数用于将像素坐标转换为地理坐标。

def CoordTransf(Xpixel, Ypixel, GeoTransform):XGeo = GeoTransform[0] + GeoTransform[1] * Xpixel + Ypixel * GeoTransform[2]YGeo = GeoTransform[3] + GeoTransform[4] * Xpixel + Ypixel * GeoTransform[5]return XGeo, YGeo
  • XpixelYpixel:像素坐标。
  • GeoTransform:仿射变换参数。

3.4 滑动窗口裁剪TIF影像

核心函数TifCrop用于将影像按指定尺寸和重叠率进行裁剪。
在这个函数中,我们首先读取影像的尺寸、波段数和地理信息。接着,我们根据裁剪尺寸和重叠率计算行和列的分块数目。随后,使用滑动窗口进行裁剪,并保存裁剪后的影像。

3.5 裁剪与保存影像

完整代码及无偿获取请查看公众号:Python与遥感
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • K8S 探针
  • 创建、使用、删除 数据库
  • web的发展历史,互联网和万维网的关系
  • QT自定义信号槽
  • python 压力测试脚本
  • 主要内容和创新点、研究方法和实现途径这两个概念在学术研究和技术开发中各有侧重点
  • Matplotlib基本操作
  • kubernetes的pod基础
  • MySQL 数据库管理
  • 微信小程序——弹出隐私指引教程(含代码)
  • C:每日一练:单身狗(2.0版本)
  • 【JAVA CORE_API】Day18 网络编程、线程、在线聊天室v1.0
  • 单片机存储芯片 W25QXX、AT24C02
  • Python数据库的使用
  • F1 F4 Fn lock 指示灯不亮 联想笔记本 thinkpad
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 77. Combinations
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java多线程(4):使用线程池执行定时任务
  • python3 使用 asyncio 代替线程
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Swift 中的尾递归和蹦床
  • Web Storage相关
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 工作中总结前端开发流程--vue项目
  • 关于List、List?、ListObject的区别
  • 理解在java “”i=i++;”所发生的事情
  • 如何编写一个可升级的智能合约
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​​​【收录 Hello 算法】9.4 小结
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转) ns2/nam与nam实现相关的文件
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)c++ std::pair 与 std::make
  • (转)linux 命令大全
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net 中viewstate的原理和使用
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET单元测试
  • .Net中间语言BeforeFieldInit
  • .NET中使用Protobuffer 实现序列化和反序列化
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡