原文链接:https://blog.csdn.net/qq_27045589/article/details/81062586
图像校正本质是建立一种从原始图像行列号到某种投影的数学关系,即实现图像行列坐标到投影坐标的转换。不同的校正方法利用了不同的方法来表示转换关系,但本质上式相同的。常用的几何校正方法包括:几何多项式校正、有理函数模型校正、局部区域校正模型、地理查找表校正等。
GDAL库中可以实现的校正方法就包括以上四种方法,即:1~3次的几何多项式校正、RPC(有理函数系数)校正、TPS(薄板样条)校正、GeoLoc校正。
不同的校正方法需要的信息也不相同,通常我们采用地面控制点(GCPs)的方式来建立转换关系,如果是RPC校正,则需要RPC文件来提供RPC系数。有的卫星数据,例如MODIS是包含GeoLocation Arrays提供每个像素的经纬度,例如Himawari-8卫星数据则直接提供了投影和地理变换参数(仿射变换六参数。
Python中的几何校正主要靠 gdal.Warp()
函数来实现的,下面说一下主要流程:
利用 gdal.Open()
:
from osgeo import gdal
from osgeo import osr
dataset = gdal.Open(r'xxx.tif', gdal.GA_Update)
# 实际控制点肯定要多的多,这里只写了四个点.做成人机交互更好
gcps_list = [gdal.GCP(-111.931075, 41.745836, 0, 1078, 648),
gdal.GCP(-111.901655, 41.749269, 0, 3531, 295),
gdal.GCP(-111.899180, 41.739882, 0, 3722, 1334),
gdal.GCP(-111.930510, 41.728719, 0, 1102, 2548)]
附控制点构造函数gdal.GCP()
的说明
gdal.GCP([x], [y], [z], [pixel], [line], [info], [id])
在添加之前需要指定一个空间参考,这里以WGS84基准的地理坐标系(经纬度)为例:
sr = osr.SpatialReference()
sr.SetWellKnownGeogCS('WGS84')
dataset.SetGCPs(gcps, sr.ExportToWkt())
校正就直接调用gdal.Warp()
就可以了:
# tps校正 重采样:最邻近法
dst_ds = gdal.Warp(r'xxx_dst.tif', dataset, format='GTiff', tps=True,
xRes=0.05, yRes=0.05, dstNodata=65535, srcNodata=65535,
resampleAlg=gdal.GRIORA_NearestNeighbour, outputType=gdal.GDT_Int32)
附gdal.Warp()
的参数说明:
gdal.Warp(destNameOrDestDS, srcDSOrSrcDSTab, **kwargs)
gdal.WarpOptions(options = [], format = 'GTiff', outputBounds = None,
outputBoundsSRS = one, xRes = None, yRes = None,
targetAlignedPixels = False, width = 0, height = 0, srcSRS = None,
dstSRS = None, srcAlpha = False, dstAlpha = False, warpOptions = None,
errorThreshold = None, warpMemoryLimit = None, creationOptions = None,
outputType = GDT_Unknown, workingType = GDT_Unknown, resampleAlg = None,
srcNodata = None, dstNodata = None, multithread = False, tps = False,
rpc = False, geoloc = False, polynomialOrder = None,
transformerOptions = None, cutlineDSName = None, cutlineLayer = None,
cutlineWhere = None, cutlineSQL = None, cutlineBlend = None,
ropToCutline = False, copyMetadata = True, metadataConflictValue = None,
setColorInterpretation = False, callback = None, callback_data = None):
多项式校正和TPS校正经过上述步骤即可实现,分为两种情况:
gdal.Info()
查看波段信息,直接利用gdal.Warp()
设置geoloc=True
后,对目标波段进行校正即可:ds = gdal.Warp(r'X:\ModisNearest.tif',
r'HDF4_EOS:EOS_SWATH:"X:\MOD021KM.A2018130.0220.061.2018130132414\MOD021KM.A2018130.0220.061.2018130132414.hdf":MODIS_SWATH_Type_L1B:EV_1KM_RefSB',
width=2030, height=1354, format='GTiff', geoloc=True,
dstSRS=sr.ExportToWkt(), resampleAlg=gdal.GRIORA_NearestNeighbour)
其中关键的是
有了VRT文件,我们就可以进行校正了,输入改为vrt文件路径,geoloc=True用Warp()校正。
RPC校正
rpc = [ "HEIGHT OFF=l09", "LINE NUM COEFF=-0. 001245683 -0. 09427649 -1. 006342 "
"-1. 954469e-05 0. 001033926 2.020534e-08 -3.845472e-07 一0.002075817 "
"0.0005520694 0 -4.642442e-06 -3.271793e-06 2. 705977e-05 -7.634384e-07 "
"-2.132832e-05 -3.248862e-05 -8.17894e-06 -3.678094e-07 2.002032e-06 "
"3.693162e-08", "LONG OFF=7.1477"
"SAMP DEN COEFF=l " ……]
ds.SetMetadata(rpc,'RPC')
dst_ds = gdal.Warp('output.xxx', ds, dstSRS='EPSG:4326', xRes=0.0002, yRes=0.0002,
rpc=True, transformerOptions = [r'RPC_DEM=X:\DEM.tif'])
手机扫一扫
移动阅读更方便
你可能感兴趣的文章