Python+GDAL实现遥感图像Mosaic拼接完整指南

温以宁
温以宁
发布时间:2026-10-13| 2人浏览过
原创

本文详细介绍使用Python和GDAL库进行遥感图像Mosaic(镶嵌)拼接的完整流程。涵盖从读取多幅TIFF影像、计算地理坐标范围、确定输出图像行列数,到创建新文件、写入数据及建立金字塔的全过程。附带读写展示代码,适用于GIS数据处理与批量自动化处理场景。

GDAL遥感图像镶嵌背景与步骤概述

作为摄影测量与遥感领域的专业人员,近期笔者深入钻研了GDAL库,旨在为日常工作夯实基础。虽然GDAL本质上是对底层API的封装调用,看似技术门槛不高,但掌握算法应用层面的技能对提升工作效率至关重要,多学总无坏处。

遥感图像的镶嵌(Mosaic)操作主要包含以下六个核心步骤:

第一步:

1)针对每一幅输入图像,计算其行数和列数;

2)获取图像左上角的X和Y坐标值;

3)获取单个像素的宽度和高度信息;

4)计算输出图像的最大X坐标和最小Y坐标。需要注意的是,像素高度通常为负值。计算公式如下:

maxX1 = minX1 + (cols1 * pixelWidth) minY1 = maxY1 + (rows1 * pixelHeight)

第二步:计算最终输出图像的边界范围,即最小X、最大X、最小Y和最大Y。

minX = min(minX1, minX2, …) maxX = max(maxX1, maxX2, …)

Y坐标的计算逻辑与X坐标相同,取所有输入图像Y坐标的最小值和最大值。

第三步:根据确定的边界范围和像素尺寸,计算输出图像的行数和列数。

cols = int((maxX – minX) / pixelWidth) rows = int((maxY – minY) / abs(pixelHeight)

第四步:利用GDAL驱动创建一个全新的输出图像文件。

driver.create()

第五步:

1)计算每幅输入图像左上角坐标在最终输出图像中的偏移量;

2)依次读取每幅输入图像的数据,并依据步骤1计算的偏移量,将数据写入到新创建的图像文件中。

第六步:对输出图像进行后续处理。

1)刷新磁盘缓存,并计算图像的统计信息;

2)设置输出图像的几何变换参数和投影信息;

3)为输出图像建立金字塔(Overviews),以优化显示性能。

Python+GDAL实现Mosaic拼接代码详解

以下是笔者整理的完整实现代码:


#mosica 两张图像
import os, sys, gdal
from gdalconst import *
os.chdir('c:/temp/****')#改变文件夹路径
# 注册gdal(required)
gdal.AllRegister()

# 读入第一幅图像
ds1 = gdal.Open('**.img')
band1 = ds1.GetRasterBand(1)
rows1 = ds1.RasterYSize
cols1 = ds1.RasterXSize

# 获取图像角点坐标
transform1 = ds1.GetGeoTransform()
minX1 = transform1[0]
maxY1 = transform1[3]
pixelWidth1 = transform1[1]
pixelHeight1 = transform1[5]#是负值(important)
maxX1 = minX1 + (cols1 * pixelWidth1)
minY1 = maxY1 + (rows1 * pixelHeight1)

# 读入第二幅图像
ds2 = gdal.Open('**.img')
band2 = ds2.GetRasterBand(1)
rows2 = ds2.RasterYSize
cols2 = ds2.RasterXSize

# 获取图像角点坐标
transform2 = ds2.GetGeoTransform()
minX2 = transform2[0]
maxY2 = transform2[3]
pixelWidth2 = transform2[1]
pixelHeight2 = transform2[5]
maxX2 = minX2 + (cols2 * pixelWidth2)
minY2 = maxY2 + (rows2 * pixelHeight2)

# 获取输出图像坐标
minX = min(minX1, minX2)
maxX = max(maxX1, maxX2)
minY = min(minY1, minY2)
maxY = max(maxY1, maxY2)

#获取输出图像的行与列
cols = int((maxX - minX) / pixelWidth1)
rows = int((maxY - minY) / abs(pixelHeight1))

# 计算图1左上角的偏移值(在输出图像中)
xOffset1 = int((minX1 - minX) / pixelWidth1)
yOffset1 = int((maxY1 - maxY) / pixelHeight1)

# 计算图2左上角的偏移值(在输出图像中)
xOffset2 = int((minX2 - minX) / pixelWidth1)
yOffset2 = int((maxY2 - maxY) / pixelHeight1)

# 创建一个输出图像
driver = ds1.GetDriver()
dsOut = driver.Create('mosiac.img', cols, rows, 1, band1.DataType)#1是bands,默认
bandOut = dsOut.GetRasterBand(1)

# 读图1的数据并将其写到输出图像中
data1 = band1.ReadAsArray(0, 0, cols1, rows1)
bandOut.WriteArray(data1, xOffset1, yOffset1)

#读图2的数据并将其写到输出图像中
data2 = band2.ReadAsArray(0, 0, cols2, rows2)
bandOut.WriteArray(data2, xOffset2, yOffset2)
''' 写图像步骤'''
# 统计数据
bandOut.FlushCache()#刷新磁盘
stats = bandOut.GetStatistics(0, 1)#第一个参数是1的话,是基于金字塔统计,第二个
#第二个参数是1的话:整幅图像重度,不需要统计
# 设置输出图像的几何信息和投影信息
geotransform = [minX, pixelWidth1, 0, maxY, 0, pixelHeight1]
dsOut.SetGeoTransform(geotransform)
dsOut.SetProjection(ds1.GetProjection())

# 建立输出图像的金字塔
gdal.SetConfigOption('HFA_USE_RRD', 'YES')
dsOut.BuildOverviews(overviewlist=[2,4,8,16])#4层

GDAL库读写遥感数据基础与环境配置

补充知识:利用Python第三方库GDAL进行遥感数据的读写操作。

0 背景及配置环境

0.1 背景

GDAL(Geospatial Data Abstraction Library)是一个基于X/MIT许可协议的开源栅格空间数据转换库。它通过抽象数据模型来支持多种文件格式,并提供了一系列命令行工具用于数据转换和处理。

该开源库提供了与其他多种编程语言的接口。对于Python,有对应的第三方包GDAL,其下载安装方法已在之前的文章中提及。

主要目的:利用Python第三方包GDAL实现遥感数据的读写,从而方便进行批处理操作。

0.2 配置环境

电脑系统:win7x64 Python版本: 3.6.4 GDAL版本: 2.3.2

TIFF格式数据的读取与写入处理

1 读取操作

1.1 TIFF格式

标签图像文件格式(Tag Image File Format,简称TIFF)是一种灵活的位图格式,主要用于存储照片和艺术图等图像。它最初由Aldus公司与微软公司合作为PostScript打印开发。目前,TIFF与JPEG和PNG并列为流行的高位彩色图像格式。

TIFF文件通常以.tif为扩展名。


 def tif_read(tifpath, bandnum):
  """
  Use GDAL to read data and transform them into arrays.
  :param tifpath:tif文件的路径
  :param bandnum:需要读取的波段
  :return:该波段的数据,narray格式。len(narray)是行数,len(narray[0])列数
  """
  image = gdal.Open(tifpath) # 打开该图像
  if image == None:
   print(tifpath + "该tif不能打开!")
   return
  lie = image.RasterXSize # 栅格矩阵的列数
  hang = image.RasterYSize # 栅格矩阵的行数
  im_bands = image.RasterCount # 波段数
  im_proj = image.GetProjection() # 获取投影信息
  im_geotrans = image.GetGeoTransform() # 仿射矩阵
  print('该tif:{}个行,{}个列,{}层波段, 取出第{}层.'.format(hang, lie, im_bands, bandnum))
  band = image.GetRasterBand(bandnum) # Get the information of band num.
  band_array = band.ReadAsArray(0,0,lie,hang) # Getting data from zeroth rows and 0 columns
  # band_df = pd.DataFrame(band_array)
  del image # 减少冗余
  return band_array, im_proj, im_geotrans

2 写入操作

2.1 TIFF格式

TIFF格式支持的数据类型包括:Byte、int16、uint16、int32、uint32、float32、float64等7种以上。

在写入数据前,首先需判断数据的实际格式,以便按需进行写入操作。


def tif_write(self, filename, im_data, im_proj, im_geotrans):
  """
  gdal数据类型包括
  gdal.GDT_Byte,
  gdal.GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
  gdal.GDT_Float32, gdal.GDT_Float64
  :param filename: 存出文件名
  :param im_data: 输入数据
  :param im_proj: 投影信息
  :param im_geotrans: 放射变换信息
  :return: 0 
  """
  if 'int8' in im_data.dtype.name: # 判断栅格数据的数据类型
   datatype = gdal.GDT_Byte
  elif 'int16' in im_data.dtype.name:
   datatype = gdal.GDT_UInt16
  else:
   datatype = gdal.GDT_Float32
  # 判读数组维数
  if len(im_data.shape) == 3:
   im_bands, im_height, im_width = im_data.shape
  else:
   im_bands, (im_height, im_width) = 1,im_data.shape # 多维或1.2维
  #创建文件
  driver = gdal.GetDriverByName("GTiff")   #数据类型必须有,因为要计算需要多大内存空间
  dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
  dataset.SetGeoTransform(im_geotrans)    #写入仿射变换参数
  dataset.SetProjection(im_proj)     #写入投影
  if im_bands == 1:
   dataset.GetRasterBand(1).WriteArray(im_data) #写入数组数据
  else:
   for i in range(im_bands):
    dataset.GetRasterBand(i+1).WriteArray(im_data[i])
  del dataset

遥感图像拼接结果展示

3 展示效果

3.1 TIFF格式


# 这个展示的效果并不是太好,当做示意图用
 def tif_display(self,im_data):
  """
  :param im_data: 影像数据,narray
  :return: 展出影像
  """
  # plt.imshow(im_data,'gray') # 必须规定为显示的为什么图像
  plt.imshow(im_data) # 必须规定为显示的为什么图像
  plt.xticks([]), plt.yticks([]) # 隐藏坐标线
  plt.show() # 显示出来,不要也可以,但是一般都要了

以上关于python+gdal+遥感图像拼接(mosaic)的实例就是分享的全部内容,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。