GDAL库学习

2023-09-16 23:12:50

GDAL库学习

GDAL是一个操作栅格数据和矢量数据的库,对图像而言,可以进行包括读取、写入、转换、处理各种操作。

RasterIO()函数

RasterIO(GDALRWFlag eRWFlag,int nXOff,int nYOff,int nXSize,int nYSize,void *pData,int nBufXSize,int nBufYSize,GDALDataType eBufType,int nPixelSpace,int nLineSpace)

(1). 第一个参数eRWFlag 读写标记 :GF_Read or GF_Write,指定是读取影像还是写入影像
(2). 2345四个参数指定读写图像的范围,从坐标(nXoff,nYOff)开始读入,读取影像行列数为(nXSize,nYSize) 即W,H。
(3). 678三个参数, pData为用来存储图像的数值的地方,读取则存储在pData中,写入则pData中的数据将被写入图像指定位置去,pData大小不得小于[nBufXSize, nBufYSize]
(4). nBufType用来标记pData的类型 比如pData是char,那么nBufType就是GDT_Byte,float–GDT_Float32,double–GDT_Float64
(5). nPixelSpace和nLineSpace一般默认取0,用来控制参数pData中像元的存储顺序,表示当前像素值和下一个像素值之间的间隔;当前行和下一行的间隔

配置好GDAL环境后,在c++中使用GDAL步骤为

1. 添加引用

#include "gdal_priv.h"
#include "gdalwarper.h"

2. 读取图像

	//注册所有的格式驱动
	GDALAllRegister();
	//支持中文路径
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");

	//打开图像
	const char* filepath = "input.tif";
	GDALDataset* image = (GDALDataset *)GDALOpen(filepath, GA_ReadOnly);

以只读方式打开了路径为filepath的图像

3. 获取图像基本信息

获取图像size、图像类型、将某个波段读入

 	//定义图像的长宽
	int W = image->GetRasterXSize();
	int H = image->GetRasterYSize();
	int C = image->GetRasterCount();
	GDALDataType ImgType = image->GetRasterBand(1)->GetRasterDataType();   //数字图像类型

	//将第一个波段的影像读入到数据之中
	GDALRasterBand *band1 = image->GetRasterBand(1);    
	unsigned char* bdata = new unsigned char[W*H];  //创建存放数据的内存
	//将第一波段读入band1中
	band1->RasterIO(GF_Read, 0, 0, W, H, bdata, W, H, ImgType, 0, 0);   

在最后一行代码中,读取image第一波段,从像素(0,0)到(W,H)范围的数据,即整张图像。读入的数据大小为(W,H) 类型为ImgType,所以先定义了一个大小为(WH) 的bdata,存放其中。
需要注意的是,GDAL将二维图像保存在W
H的一维数组中,则第(i,j)个像元为data[(j)*W + i]

4. 保存输出图像

	//创建保存影像数据集
	GDALDriver* imgDriver = GetGDALDriverManager()->GetDriverByName("GTiff");   //获取驱动
	const char* outFilename1 = "img2.tif";
	GDALDataset* outIMG1 = imgDriver->Create(outFilename1, W, H, 1,ImgType, NULL);
	unsigned char* newdata = new unsigned char[W*H];

	//图像处理子函数MeanFiter(输入影像,输出影像,宽,高)
	MeanFilter(bdata,newdata, W, H);
	//将处理过的图像数据写入outImg1中
	outIMG1->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, W, H, newdata, W, H, ImgType, 0, 0);

5. 释放

	GDALClose(outIMG1);
	delete bdata;
	delete newdata;
更多推荐

安防监控视频AI智能分析网关:人流量统计算法的应用场景汇总

TSINGSEE青犀人流量检测算法是内置在智能分析网关中的一种能够通过AI分析和计算人群数量以及密度的算法技术,在提升城市管理效率、改善用户体验和增加安全性方面发挥着重要作用。人流量检测算法在许多领域都有广泛的应用,如智慧城市、智慧交通、智慧景区等。人流量检测算法在一网统管与智慧城市中,可以用于日常交通管理中,例如实时

MyBatis-Plus的常用注解

一、@TableName在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表,由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和

Challenges and Applications of Large Language Models

本文是LLM系列文章,针对《ChallengesandApplicationsofLargeLanguageModels》的翻译。大语言模型的挑战与应用摘要1引言2挑战3应用3.1聊天机器人3.2计算生物学3.3计算机程序3.4创造性工作3.5知识工作3.6法律3.7医学3.8推理3.9机器人和嵌入式代理3.10社会科

Continual Pre-Training of Large Language Models: How to (re)warm your model?

本文是LLM系列文章,针对《ContinualPre-TrainingofLargeLanguageModels:Howto(re)warmyourmodel?》的翻译。大型语言模型的持续预训练:如何(重新)预热你的模型摘要1引言2设置3相关工作4持续加热5讨论/局限性6结论摘要大型语言模型(LLM)通常在数十亿个to

【Python】多线程编程 ② ( 进程与线程 | 进程的内存空间 | 并行执行概念 | 线程的创建和执行 | threading.Thread() 函数解析 )

文章目录一、进程与线程1、进程的内存空间2、线程之间的共享内存3、并行执行概念二、Python多线程编程1、线程的创建和执行2、threading.Thread()函数解析3、代码示例-线程创建运行4、代码示例-线程并行运行一、进程与线程1、进程的内存空间在操作系统中,进程之间的内存空间是隔离的,不同的进程拥有各自的内

前端面试八股(持续更新)

文章目录一、CSS1.说一下CSS的盒模型。2.CSS选择器的优先级?3.隐藏元素的方法有哪些?4.px和rem的区别是什么?5.重绘重排有什么区别?6.让一个元素水平垂直居中的方式有哪些?7.CSS的哪些属性哪些可以继承?哪些不可以继承?8.有没有用过预处理器?二、JavaSscipt1.JS由哪三部分组成?2.JS

Maven

目录Maven安装及配置使用IDEA创建Maven项目MavenPOM​编辑什么是Maven?Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。主要作用?Maven就是是专门为Java项目打造的管理和构建工具,它的主要功能有:标准化的

实用!Python大型Excel文件处理:快速导入、导出与批量处理

Python是一种功能强大的编程语言,它提供了丰富的库和工具,使得处理大型Excel文件变得容易和高效。下面将介绍如何使用Python快速导入、导出和批量处理大型Excel文件。下面是一些建议和实践经验,希望能对你有所帮助。一、Excel文件处理库的选择在开始之前,我们需要选择一个适合处理Excel文件的库。以下是一些

【React】单页面应用限制多开登录

react单页面应用限制多开登录情景测试小姐姐提了一个BUG:在同一浏览器中打开两个页面,两个页面分别登录不同的账号.A页面先登录A,B页面再登录B,此时回到A页面,交互时账号数据应该刷新为B登录的账号分析这个问题,其实没什么必要,因为我不认为我们这个系统的单个使用者会同时拥有多个账号,但人家非说会有,那行吧,我说了不

ChatGPT批量写作文章软件

什么是ChatGPT批量写作文章。简单来说,它是一种使用ChatGPT技术的方法,可以帮助您批量生成各种类型的文章和内容。无论您是需要新闻报道、博客文章、产品描述、社交媒体帖子还是其他类型的内容,ChatGPT都能满足您的需求。它可以在极短的时间内为您生成大量文章,让您事半功倍。147GPT批量文章生成工具​www.1

linux动态扩容系统盘(非lvm磁盘)

查看磁盘状态执行df-Th查看磁盘情况[root@iotdbtest1~]#df-ThFilesystemTypeSizeUsedAvailUse%Mountedondevtmpfsdevtmpfs7.7G07.7G0%/devtmpfstmpfs7.7G07.7G0%/dev/shmtmpfstmpfs7.7G456

热文推荐