python gdal遥感影像基础操作(读写、增加波段、添加坐标系)

30 篇文章 30 订阅

1.读写

def read_img(filename):

    dataset=gdal.Open(filename)

    im_width = dataset.RasterXSize

    im_height = dataset.RasterYSize

    im_geotrans = dataset.GetGeoTransform()

    im_proj = dataset.GetProjection()

    im_data = dataset.ReadAsArray(0,0,im_width,im_height)

    del dataset 

    return im_proj,im_geotrans,im_width, im_height,im_data

 

def write_img(filename, im_proj, im_geotrans, im_data):

    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 

    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])

2.增加波段

# -*- coding: utf-8 -*-

import os

import cv2

from osgeo import gdal

import numpy as np

import time

 

#多波段

def add_band(imgPath1, imgPath2, outpath):

    (filepath,fullname) = os.path.split(imgPath1)

    filename = fullname.split('.')[0]

    driver = gdal.GetDriverByName('GTiff')

    driver.Register()

    dataset = gdal.Open(imgPath1)

    bands = dataset.RasterCount

    geotrans = dataset.GetGeoTransform()

    proj = dataset.GetProjection()

    im_width=dataset.RasterXSize  #col

    im_height=dataset.RasterYSize  #row

    datas = dataset.ReadAsArray(0,0,1,1)

    if 'int8' in datas.dtype.name:

        datatype = gdal.GDT_Byte

    elif 'int16' in datas.dtype.name:

        datatype = gdal.GDT_UInt16

    else:

        datatype = gdal.GDT_Float32

    dataset = gdal.Open(imgPath2)

    bands2 = dataset.RasterCount

    new_bands = bands + bands2

    slice_img = driver.Create(outpath + filename + '.tif',im_width,im_height,new_bands,datatype)

    for band in range(new_bands-1):

        slice_img.GetRasterBand(band + 1).WriteArray(dataset.GetRasterBand(band + 1).ReadAsArray(0,0,im_width,im_height))

    for band in range(bands,new_bands):

        slice_img.GetRasterBand(band + 1).WriteArray(dataset.GetRasterBand(band + 1).ReadAsArray(0,0,im_width,im_height))

    slice_img.SetGeoTransform(geotrans)

    slice_img.SetProjection(proj)

 

#单波段

def add_band2(imgPath, addPath, outPath):

    driver = gdal.GetDriverByName('GTiff')

    driver.Register()

    dataset = gdal.Open(imgPath)

    bands = dataset.RasterCount

    im_width=dataset.RasterXSize  #col

    im_height=dataset.RasterYSize  #row

    geotrans = dataset.GetGeoTransform()

    proj = dataset.GetProjection()

    data = dataset.ReadAsArray(0,0,im_width,im_height)

    dataset2 = gdal.Open(addPath)

    data2 = dataset.ReadAsArray(0,0,im_width,im_height)

    slice_img = driver.Create(outPath,im_width,im_height,4,gdal.GDT_Byte)

    for band in range(3):

        slice_img.GetRasterBand(band + 1).WriteArray(dataset.GetRasterBand(band + 1).ReadAsArray(0,0,im_width,im_height))

    for band in range(3,4):

        slice_img.GetRasterBand(band+1).WriteArray(dataset2.GetRasterBand(1).ReadAsArray(0,0,im_width,im_height))

    slice_img.SetGeoTransform(geotrans)

    slice_img.SetProjection(proj)

if __name__=='__main__':

    add_band2('D:/wcs/test/1/0717/image_3/fuse3.tif', 'D:/wcs/test/1/0717/image_3/img_log.tif', 'D:/wcs/test/1/0717/image_3/fuse4.tif')

3.添加坐标系

# -*- coding: utf-8 -*-

import os

import cv2

from osgeo import gdal

import numpy as np

import time

 

def addcoor(img1,img2):

    dataset1 = gdal.Open(img1)

    geotrans = dataset1.GetGeoTransform()

    proj = dataset1.GetProjection()

    dataset2 = gdal.Open(img2,1)

    dataset2.SetGeoTransform(geotrans)

    dataset2.SetProjection(proj)

    del dataset1

    del dataset2

if __name__=='__main__':

    addcoor('D:/wcs/test/outhillshd.tif','D:/wcs/test/outhillshd_edge.tif')

    # path = 'D:/wcs/test/dem_test/sample_16bit/'

    # imgs = os.listdir(path)

    # for img in imgs:

    #   addcoor(os.path.join(path,img),'D:/wcs/test/dem_test/img/')

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Python中使用GDAL库进行遥感影像配准,您可以使用以下代码示例: ```python from osgeo import gdal def image_registration(input_image_path, reference_image_path, output_image_path): # 打开需要配准的影像 src_ds = gdal.Open(input_image_path) # 打开参考影像 ref_ds = gdal.Open(reference_image_path) # 获取需要配准影像的地理转换信息 src_geo_transform = src_ds.GetGeoTransform() # 获取参考影像的地理转换信息 ref_geo_transform = ref_ds.GetGeoTransform() # 创建一个空的输出影像,用于存储配准结果 out_ds = gdal.GetDriverByName('GTiff').Create(output_image_path, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, src_ds.GetRasterBand(1).DataType) # 设置输出影像的地理转换信息为参考影像的地理转换信息 out_ds.SetGeoTransform(ref_geo_transform) # 设置输出影像的投影信息为参考影像的投影信息 out_ds.SetProjection(ref_ds.GetProjection()) # 进行影像配准 gdal.ReprojectImage(src_ds, out_ds, src_ds.GetProjection(), ref_ds.GetProjection(), gdal.GRA_NearestNeighbour) # 关闭数据集 src_ds = None ref_ds = None out_ds = None # 调用函数进行影像配准 input_image_path = 'input_image.tif' reference_image_path = 'reference_image.tif' output_image_path = 'output_image.tif' image_registration(input_image_path, reference_image_path, output_image_path) ``` 请确保将`input_image.tif`替换为需要配准的影像路径,`reference_image.tif`替换为参考影像路径,`output_image.tif`替换为输出影像路径。 这个示例代码中的`image_registration`函数接受三个参数,分别是需要配准的影像路径、参考影像路径和输出影像路径。函数会打开需要配准的影像和参考影像,并根据参考影像的地理转换信息和投影信息创建一个空的输出影像。然后使用最近邻插值方法进行影像配准,最后关闭数据集。 希望这能对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如雾如电

随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值