GDAL库学习

news/2024/7/20 12:29:50 标签: c++, 图像处理

GDAL库学习

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

文章目录

    • GDAL库学习
      • RasterIO()函数
      • 1. 添加引用
      • 2. 读取图像
      • 3. 获取图像基本信息
      • 4. 保存输出图像
      • 5. 释放

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;

http://www.niftyadmin.cn/n/5032012.html

相关文章

thinkphp:数据库查询操作六:查询的数据是否为空,如果为空就设置为0,并且保留数据小数点,查询的数据是时间戳转换为时间

完整代码 $result Db::table(so_headers_all)->field("DATE_FORMAT(FROM_UNIXTIME(creation_date), %Y-%m-%d) AS date, IFNULL(FORMAT(SUM(order_all_amount), 2), 0) AS total_amount")->whereTime(creation_date, >, $weekStart)->whereTime(creati…

java求算数平方根(整数部分)

package com.itheima;import java.util.Scanner;public class 求平方根 {public static void main(String[] args) {Scanner num new Scanner(System.in);int number num.nextInt();//键盘录入一个大于等于二的数 计算并返回x的平方根 只保留整数部分if(number < 2) {Syst…

buuctf web [极客大挑战 2019]LoveSQL

又是这样的界面&#xff0c;这糟糕的熟悉感&#xff0c;依旧使用上题套路 用户名&#xff1a; admin or 11# 密码&#xff1a; 1 有一串很像flag的字符&#xff0c;但是很可惜&#xff0c;这不是flag 看了一眼源代码&#xff0c;没有可以跳转的页面 要换个思路了&#xff0c…

Linux学习之MySQL主从复制

MySQL配置一主一从 环境准备&#xff1a; 两台服务器&#xff1a; Master&#xff1a;192.168.88.53&#xff0c;Slave&#xff1a;192.168.88.54 在两台服务器上安装mysql-server # 配置主服务器192.168.88.53 # 启用binlog日志 [rootmysql53 ~]# yum -y install mysql-ser…

Go 字符串处理

一、 字符串处理函数 我们从文件中将数据读取出来以后&#xff0c;很多情况下并不是直接将数据打印出来&#xff0c;而是要做相应的处理。例如&#xff1a;去掉空格等一些特殊的符号&#xff0c;对一些内容进行替换等。 这里就涉及到对一些字符串的处理。在对字符串进行处理时…

PHP8中删除数组中的重复元素-PHP8知识详解

在 php 8 中&#xff0c;你可以使用array_unique()函数来删除数组中的重复元素。该函数将返回一个新的数组&#xff0c;其中包含原始数组中的唯一元素&#xff0c;而重复的元素只保留第一个出现的。 array_unique()函数返回具有唯一性元素的数组&#xff0c;语法格式如下&#…

LabVIEW以编程方式查找系统中DAQ设备的设备名称

LabVIEW以编程方式查找系统中DAQ设备的设备名称 使用DAQmx VI&#xff0c;“创建虚拟通道”函数&#xff0c;这个函数需要物理通道输入端。当使用相同型号的新设备&#xff08;例如&#xff0c;两个不同的USB-6210&#xff09;运行可执行文件时&#xff0c;代码会中断&#xf…

Windows批处理for循环

文章目录 常规模式L模式D模式R模式F模式 批处理系列&#xff1a; set与变量&#x1fa9f; 函数传参和跳转&#x1fa9f; if语句 常规模式 程序之所以能替代人&#xff0c;就是因为它可以不眠不休地进行重复性操作&#xff0c;批处理指令自然也提供了循环工作的逻辑&#xf…