python使用gdal实现影像重采样

gdal实现影像的重采样

对于tif格式的遥感影像而言,通常使用左上角那个像元真实的x坐标值,像素宽度,x像素旋转角度,原点y坐标,y像素旋转角度,像素高度(负值)共六个参数来表示整幅影像像素点的坐标。
在这里插入图片描述
当影像分辨率改变后,x坐标值和y坐标值度都不会改变,但像素高度和宽度会改变,而像素高度和宽度改变的话,影像的行列数也会改变。

1.gdal实现影像重采样至高分辨率

这里,将一幅影像的像元高度和宽度都变为原来的0.5倍,实现代码如下:

'''
Created on 2020年2月10日

@author: Sun Strong
'''
from osgeo import gdal
import os
path=r"C:\Users\Sun Strong\Desktop\gdal" 
os.chdir(path)
in_ds=gdal.Open("p047r027_7t20000730_z10_nn10.tif")
in_band=in_ds.GetRasterBand(1)
xsize=in_band.XSize
ysize=in_band.YSize
geotrans=list(in_ds.GetGeoTransform())
geotrans[1]/=2#像元宽度变为原来的0.5倍
geotrans[5]/=2#像元高度变为原来的0.5倍
#重采样后的影像
if os.path.exists('resampled.tif'):#如果已存在同名影像
    os.remove('resampled.tif')#则删除之
out_ds=in_ds.GetDriver().Create('resampled.tif',xsize*2,ysize*2,1,in_band.DataType)#创建一幅重采样后的影像的句柄,行列数都变成原来的2倍
out_ds.SetProjection(in_ds.GetProjection())#设置投影坐标
out_ds.SetGeoTransform(geotrans)#设置地理变换参数
data=in_band.ReadAsArray(buf_xsize=xsize*2, buf_ysize=ysize*2)#使用更大的缓冲读取影像,与重采样后影像行列对应
out_band=out_ds.GetRasterBand(1)
out_band.WriteArray(data)#写入数据到新影像中
out_band.FlushCache()
out_band.ComputeBandStats(False)#计算统计信息
out_ds.BuildOverviews('average',[1,2,4,8,16,32])#构建金字塔
del out_ds#删除句柄
del in_ds
print("This process has succeeded!")

2.gdal实现重采样至更低分辨率

这里,将一幅影像的像元高度和宽度都变为原来的2倍,实现代码如下:

'''
Created on 2020年2月10日

@author: Sun Strong
'''
from osgeo import gdal
import os
import numpy as np
path=r"C:\Users\Sun Strong\Desktop\gdal"
os.chdir(path)
image_name='p047r027_7t20000730_z10_nn30.tif'
in_ds=gdal.Open(image_name)
geotrans=list(in_ds.GetGeoTransform())
geotrans[1]*=2#像元宽度变为原来的两倍
geotrans[5]*=2#像元高度也变为原来的两倍
in_band=in_ds.GetRasterBand(1)
xsize=in_band.XSize
ysize=in_band.YSize
x_resolution=int(xsize/2)#影像的行列都变为原来的一半
y_resolution=int(ysize/2)
if os.path.exists('LowerResolutionImage.tif'):#如果存在重采样后的影像,则删除之
    os.remove('LowerResolutionImage.tif')
out_ds=in_ds.GetDriver().Create('LowerResolutionImage.tif',x_resolution,y_resolution,1,in_band.DataType)#创建一个构建重采样影像的句柄
out_ds.SetProjection(in_ds.GetProjection())#设置投影信息
out_ds.SetGeoTransform(geotrans)#设置地理变换信息
data=np.empty((y_resolution,x_resolution),np.int)#设置一个与重采样影像行列号相等的矩阵去接受读取所得的像元值
in_band.ReadAsArray(buf_obj=data)
out_band=out_ds.GetRasterBand(1)
out_band.WriteArray(data)
out_band.FlushCache()
out_band.ComputeStatistics(False)#计算统计信息
out_ds.BuildOverviews('average',[1,2,4,8,16,32])#构建金字塔
del in_ds#删除句柄
del out_ds
print("This process has succeeded!")

3.总结

影像的重采样,需要注意重采样前后六个地理变换参数的变化,还有重采样后影像像元的宽度、高度以及行列数目。上述例子提供了两种读取像元值的方法(对应重采样影像的行列数目):
一、指定重采样后影像的行列数目来读取像元值
data=in_band.ReadAsArray(buf_xsize=xsize2, buf_ysize=ysize2)
二、准备一个numpy数组来接收像元值
data=np.empty((y_resolution,x_resolution),np.int)
in_band.ReadAsArray(buf_obj=data)

您好!对于使用C++和GDAL库进行重采样的问题,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了GDAL库,并将其包含在您的C++项目中。您可以从GDAL官方网站(https://gdal.org/)下载并安装GDAL。 2. 在您的C++代码中,包含GDAL的头文件: ```cpp #include <gdal_priv.h> ``` 3. 创建一个GDAL数据集对象,并打开源图像文件: ```cpp GDALAllRegister(); // 注册所有的GDAL驱动 // 打开源图像文件 GDALDataset* srcDataset = (GDALDataset*)GDALOpen("path_to_source_image", GA_ReadOnly); if (srcDataset == nullptr) { // 处理打开源图像文件失败的情况 } ``` 4. 定义目标图像的宽度、高度和波段数目,并创建一个新的GDAL数据集对象: ```cpp int targetWidth = 800; // 目标图像宽度 int targetHeight = 600; // 目标图像高度 int targetBands = srcDataset->GetRasterCount(); // 目标图像波段数目与源图像相同 // 创建新的目标图像数据集 GDALDriver* memDriver = GetGDALDriverManager()->GetDriverByName("MEM"); GDALDataset* targetDataset = memDriver->Create("", targetWidth, targetHeight, targetBands, GDT_Byte, nullptr); if (targetDataset == nullptr) { // 处理创建目标图像数据集失败的情况 } ``` 5. 使用GDAL库提供的重采样方法,将源图像数据写入目标图像数据集中: ```cpp GDALResampleAlg resampleMethod = GRA_Bilinear; // 重采样方法,这里使用双线性插值 // 重采样 for (int band = 0; band < targetBands; ++band) { GDALRasterBand* srcBand = srcDataset->GetRasterBand(band + 1); // 获取源图像波段 GDALRasterBand* targetBand = targetDataset->GetRasterBand(band + 1); // 获取目标图像波段 // 执行重采样 GDALReprojectImage(srcBand, nullptr, targetBand, nullptr, resampleMethod); } ``` 6. 完成重采样后,您可以将目标图像保存到磁盘上: ```cpp GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("GTiff"); // 指定保存为GeoTIFF格式 driver->CreateCopy("path_to_target_image", targetDataset, 0, nullptr, nullptr, nullptr); ``` 7. 最后,别忘记释放使用的内存和关闭数据集: ```cpp GDALClose(srcDataset); // 关闭源图像数据集 GDALClose(targetDataset); // 关闭目标图像数据集 ``` 这些步骤提供了一个基本的框架,您可以根据您的具体需求进行修改和扩展。希望能对您有所帮助!如果您还有其他问题,请随时提问。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值