python如何使用gdal扩充影像

本文介绍了使用Python的GDAL库进行遥感影像读取、处理和扩充的方法,包括打开tif文件、获取元数据、创建和写入新的tif文件,以及计算并应用偏移量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import gdal
import numpy as np
import pandas as pd
import datetime
import glob

def readTif(fileName):
    dataset = gdal.Open(fileName)
    if dataset == None:
        print(fileName + "文件无法打开")
        
    width = dataset.RasterXSize 
    height = dataset.RasterYSize 
    bands = dataset.RasterCount 

    data = dataset.ReadAsArray()
    geotrans = dataset.GetGeoTransform()
    proj = dataset.GetProjection()
    del dataset
    return width, height, bands, data, geotrans, proj

def writeTiff(im_data,input_data,im_geotrans,xOffset,yOffset,im_proj, path):
    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
        
    im_bands, im_height, im_width = im_data.shape
        
    if len(input_data.shape) == 3:
        input_bands, input_height, input_width = input_data.shape
    elif len(input_data.shape) == 2:
        input_data = np.array([input_data])
        input_bands, input_height, input_width = input_data.shape
    else:
        print("image is error")
            
    #创建文件
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(path, int(im_width), int(im_height), int(input_bands), datatype)
    if(dataset!= None):
        dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数
        dataset.SetProjection(im_proj) #写入投影
        
    for i in range(input_bands):   
        
        dataset.GetRasterBand(i + 1).WriteArray(input_data[i],xOffset,yOffset)

    del dataset

if __name__ == '__main__':
    start = datetime.datetime.now()

    ref_tif = r"G:\xdn\class_result\sy_index_result_pro.tif"
    samplefile = r'G:\xdn\sample\sy_sample_pro211.tif'
    path = r'G:\xdn\sample\extecd_sample5.tif'

    width_ref, height_ref, bands_ref, data_ref, geotrans_ref, proj_ref = readTif(ref_tif)
    width_s, height_s, bands_s, data_s, geotrans_s, proj_s = readTif(samplefile)

    print("开始扩充影像。。。。。。。。")
    #计算待扩充影像在扩充影像左上角的偏移量
    xOffset=int((geotrans_s[0]-geotrans_ref[0])/geotrans_ref[1])
    yOffset=int((geotrans_s[3]-geotrans_ref[3])/geotrans_ref[5])

    im_data = data_ref
    input_data = data_s
    im_geotrans = geotrans_ref
    im_proj = proj_ref
    print(xOffset,yOffset)
    print(width_ref,height_ref)
    print(width_s,height_s)

    writeTiff(im_data,input_data,im_geotrans,xOffset,yOffset,im_proj, path)
    end = datetime.datetime.now()
    print(end-start)

<think>好的,用户想寻找用于ENVI样本扩充的工具或方法,特别是针对遥感图像的数据增强。首先,我需要回忆一下ENVI软件本身是否内置了数据增强的功能。ENVI主要用于遥感图像处理,可能在分类工具中有一些样本扩充的方法,比如通过旋转、镜像等几何变换来增加样本数量。此外,波段运算功能也可能被用来调整光谱信息,进行数据增强[^1]。 接下来,用户可能需要结合Python脚本或第三方工具进行更灵活的数据增强。比如使用GDAL库来处理遥感图像,或者利用深度学习框架如TensorFlow或PyTorch中的ImageDataGenerator模块。这些工具支持自动化的数据增强操作,如随机旋转、缩放、裁剪、添加噪声等,适用于批量处理遥感影像数据。 另外,用户提到的引用[2]是关于删除不匹配的标签文件的方法,这可能与数据预处理有关,确保影像和标签文件的一致性。在数据增强过程中,需要同步处理标签文件,尤其是进行几何变换时,标签也需要相应的变换,比如对图像进行旋转后,对应的目标检测框也要旋转相同的角度。这时候可能需要使用专门的工具如LabelImg或其他自动化脚本来调整标签数据。 还需要考虑遥感图像的特殊性,比如多光谱或高光谱数据,普通的数据增强方法可能不适用。可能需要针对光谱波段进行增强,例如通过主成分分析(PCA)来生成新的光谱特征,或者使用ENVI的波段运算功能来模拟不同光照条件下的光谱变化。 最后,建议用户结合ENVI内置工具和外部脚本工具,根据具体任务选择合适的数据增强方法。例如,对于几何变换,可以使用ENVI的ROI工具生成多样本,再导出为训练数据;对于复杂的数据增强,可以编写Python脚本调用OpenCV或PIL库进行处理,并同步更新标签文件。同时,推荐查阅相关的遥感处理文献,了解最新的数据增强技术应用案例。</think>### ENVI样本扩充工具与方法 在遥感图像处理中,样本扩充(数据增强)是提升模型泛化能力的重要手段。以下是几种适用于ENVI环境的工具和方法: #### 1. **ENVI内置工具** - **波段运算(Band Math)** 通过数学表达式调整像素值,例如添加噪声、调整对比度或亮度,生成新的光谱特征。例如,使用公式: $$I_{\text{new}} = I_{\text{original}} \times 1.2 + 10$$ 可增强图像亮度[^1]。 - **ROI(感兴趣区域)工具** 对标注的样本区域进行几何变换(如旋转、镜像、平移),生成多样化样本。ENVI支持ROI导出为训练数据格式,便于后续分类。 #### 2. **Python脚本扩展** - **GDAL/OGR库** 批量处理遥感影像的几何变换(旋转、裁剪、缩放): ```python from osgeo import gdal import numpy as np # 读取影像并进行仿射变换 dataset = gdal.Open('image.tif') data = dataset.ReadAsArray() rotated_data = np.rot90(data, k=1) # 旋转90度 ``` - **TensorFlow/PyTorch数据增强** 使用深度学习框架的增强模块: ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator(rotation_range=30, horizontal_flip=True) augmented_images = datagen.flow(images, batch_size=32) ``` #### 3. **标签同步处理** - **几何变换同步** 若对影像进行旋转或翻转,需对应调整标签坐标。例如,使用OpenCV计算变换矩阵: ```python import cv2 M = cv2.getRotationMatrix2D((width/2, height/2), 30, 1) # 旋转30度 transformed_label = cv2.warpAffine(label, M, (width, height)) ``` - **标签清理工具** 引用[2]中的方法可确保影像与标签文件一致,避免数据错位。 #### 4. **多光谱数据增强** - **主成分分析(PCA)** 通过ENVI的PCA工具生成光谱特征变异样本。 - **波段混合增强** 使用波段运算模拟不同地物光谱组合,例如: $$B_{\text{new}} = 0.6 \times B_3 + 0.4 \times B_5$$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值