python——遥感影像分块

python 遥感影像分块

在深度学习或其他一些应用中,往往需要对较大的遥感影像进行分块输出,并且保留原始的地理信息,以备后续使用。

本篇文章的目的即对遥感影像进行分块输出,按照网格顺序进行重新命名,其中边缘部分可能存在不足裁剪大小的情况,通过向前填补方式进行填充,故分块结果可能导致边缘部分存在一定重复率。

具体代码如下:

#!usr/bin/env python
# -*- coding: utf-8 -*-
"""
date:2022/9/2
author:甲戌_Tr
email: liu_xxxi@163.com
"""

import sys,os
from osgeo import gdal
import numpy as np
from pathlib import Path as Path

class TifCrop:
    def __init__(self,infile,crop_size,save_path,repete_rate=0):
        '''
        遥感影像分块函数
        :param infile: 输入tif文件
        :param crop_size: 分块大小,单值或元祖,int型。eg:200表示以 200*200个像元大小的方形进行分块,(100,200)表示以 100*200个像元大小的矩形进行分块
        :param repete_size:重复率, float, 其中值的范围为[0,1)之间, 默认值为0
        '''
        self.infile = infile
        self.crop_size = crop_size
        self.save_path = save_path
        self.repete_rate = repete_rate

        # crop_size 参数判断
        if not isinstance(crop_size, int):
            if not isinstance(crop_size, tuple):
                raise Exception('crop_size 输入参数错误')
            else:
                if not (isinstance(crop_size[0], int) and isinstance(crop_size[1], int)):
                    raise Exception('crop_size 输入参数错误')

        # repete_rate 参数判断
        if repete_rate >= 1 or repete_rate < 0:
            raise Exception('repete_rate 输出参数错误')

    def crop_tif(self):
        if isinstance(self.crop_size,tuple):
            crop_size_r = self.crop_size[0]
            crop_size_c = self.crop_size[1]
        else:
            crop_size_r = self.crop_size
            crop_size_c = self.crop_size

        repete_size_r = int(crop_size_r * (1 - self.repete_rate))
        repete_size_c = int(crop_size_c * (1 - self.repete_rate))

        ds = gdal.Open(self.infile)
        data = ds.ReadAsArray()

        geotrans = ds.GetGeoTransform()
        self.projection = ds.GetProjection()

        # 将单波段影像添加一个维度
        if len(data.shape) == 2:
            data = np.array([data])

        channel, rows, cols = data.shape

        # 向上取整
        col_num = int(np.ceil(cols / repete_size_c))
        row_num = int(np.ceil(rows / repete_size_r))

        # 循环读取
        # 边缘部分按照向前扩充原则进行提取

        # 当重复率较高或分块尺寸较小时,遇到边缘部分可能存在分割相同的情况,故用以下参数进行判断避免该情况发生
        start_point = (-1,-1)

        for i in range(col_num):
            for j in range(row_num):
                row_s = repete_size_r * j
                row_e = repete_size_r * j + crop_size_r

                # 是否超出边界判断
                if row_e > rows:
                    row_s = rows - crop_size_r
                    row_e = rows

                col_s = repete_size_c * i
                col_e = repete_size_c * i + crop_size_c

                # 是否超出边界判断
                if col_e > cols:
                    col_s = cols - crop_size_c
                    col_e = cols

                data_crop = data[:,row_s:row_e,col_s:col_e]

                # 判断输出内容是否与之前存在重复情况,非完全重叠部分再进行分块输出
                if (row_s,col_s) != start_point:
                    start_point = (row_s,col_s)
                    # 地理信息存放
                    new_geotrans = (geotrans[0] + geotrans[1] * col_s, geotrans[1], geotrans[2], geotrans[3] + geotrans[5] * row_s,geotrans[4],geotrans[5])

                    # 输出文件名称
                    out_file = self.save_path + os.sep + Path(self.infile).stem + '_' + str(j) + '_' + str(i) + Path(self.infile).suffix

                    self.tif_write(data_crop,new_geotrans,out_file)

    def tif_write(self,data,trans,ofile):
        '''
        tif写入
        :param data: 分块后数组
        :param trans: 更新后的geotransform,包括六参数
        :param ofile: 输出全路径
        :return: None
        '''
        # 数据类型获取
        if 'int8' in data.dtype.name:
            datatype = gdal.GDT_Byte
        elif 'int16' in data.dtype.name:
            datatype = gdal.GDT_UInt16
        else:
            datatype = gdal.GDT_Float32

        # 输出tif文件按照单波段或多波段划分
        bands,height,width = data.shape

        # 创建文件
        driver = gdal.GetDriverByName("GTiff")
        dataset = driver.Create(ofile, int(width), int(height), int(bands), datatype)

        if (dataset != None):
            dataset.SetGeoTransform(trans)  # 写入仿射变换参数
            dataset.SetProjection(self.projection)  # 写入投影
        for i in range(bands):
            dataset.GetRasterBand(i + 1).WriteArray(data[i])
        del dataset

if __name__ == '__main__':
    file = r'F:\input.tif'
    cropsize = 300
    savepath = r'F:\outpath'
    TifCrop(file,cropsize,savepath).crop_tif()

欢迎指正~

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 遥感影像多尺度分割是遥感图像处理和机器学习领域的重要研究方向,其目的是将原始遥感影像分成多个具有不同语义的区域。Python作为一种广泛使用的编程语言,在遥感图像处理和机器学习领域也广泛应用。以下是Python实现遥感影像多尺度分割的方式: 1. 使用Python图像处理库(如opencv、PIL)读取原始遥感影像,并进行图像预处理(如尺度变换、颜色转换、滤波等)。 2. 对预处理后的遥感影像进行多尺度分割。常用的多尺度分割算法包括Fuzzy C-means聚类、K-means聚类、Mean-shift聚类等。Python中可以使用sklearn等机器学习库来实现这些算法。 3. 对多尺度分割结果进行后处理,包括去除小区域、填充空洞、边缘平滑等。这些后处理算法可以使用Python中的图像处理库来实现。 4. 最后将处理后的遥感影像输出为标准格式(如Tiff、png等)供后续应用使用。 需要注意的是,Python实现遥感影像多尺度分割需要较高的计算资源和较长的运行时间。因此,使用合适的硬件设备和优化算法是非常重要的。同时还要注意遥感影像多尺度分割算法的准确性和鲁棒性,避免过拟合和欠拟合现象的出现。 ### 回答2: Python遥感影像多尺度分割中是一种成熟且广泛使用的编程语言。遥感影像多尺度分割是指将遥感影像通过均值漂移、分水岭等算法划分成多个区域,以便更好地分析和处理遥感数据。 Python中能够实现遥感影像多尺度分割的库很多,比如在scipy中的ndimage子模块查找图片的局部最大值,然后使用连通组分分离出不同的区域。还有在opencv-python库中的image分割模块实现图像分割。 在Python中实现遥感影像多尺度分割的具体步骤如下: 1. 读取遥感影像,并对其进行预处理:消除噪声、增强对比度等。 2. 使用算法处理影像,将其分为多个不同的区域。最常用的算法包括:均值漂移、分水岭、K均值聚类、基于区域的分割等。 3. 对分割结果进行后处理,使其更加平滑并去除不必要的分割。 4. 可以对分割结果进行分类与识别,以提取感兴趣区域。比如使用机器学习算法对分割结果进行分类,识别出其中的植被、水域、道路等。 Python的灵活性和开源性使得其成为遥感影像多尺度分割的理想工具。与其他语言相比,Python的开发速度快,且可以支持更多的算法和模型库。同时,Python拥有丰富的可视化工具,可以对分割结果进行可视化,能够更加直观地展示分割结果。此外,Python代码也易于分享,使得不同的研究者之间能够更方便地交流和合作。 ### 回答3: Python是一种广泛应用于各种领域的编程语言,包括遥感影像领域。在遥感影像处理中,多尺度分割是一种常用的方法,它可以对影像进行分层处理,将大尺度的结构分解成更小的尺度结构。Python提供了一系列强大的遥感图像处理库,如GDAL、OpenCV和Scikit-image,它们可以在实现多尺度分割时提供重要的支持。 多尺度分割的过程可以分为以下几个步骤: 1. 数据准备。首先,需要从遥感数据源中读取影像数据,这通常可以使用GDAL库来完成。读入的影像通常是大的TIFF文件,需要注意像素值的数据类型和投影坐标系。 2. 图像预处理。图像预处理是保证多尺度分割算法准确性的基础,常见的预处理方法包括灰度变换、直方图均衡、尺度变换等。这一步可以使用NumPy和Pillow库来实现。 3. 多尺度分割算法。多尺度分割算法有很多种,比如分水岭算法、区域生长算法、基于聚类的算法等。其中,分水岭算法是最常用的方法之一,可以使用Scikit-image库来进行实现。 4. 分割结果处理和后续分析。分割完成后,需要对分割结果进行后处理,这包括去除假阳性区域、合并通路等。此外,还需要对分割结果进行可视化、分类和存储等处理,这可以借助Pillow和NumPy库完成。 总的来说,Python遥感影像多尺度分割中起到了非常重要的作用。Python提供了丰富的图像处理库和数据处理工具,可以帮助分析师更加高效地完成遥感影像多尺度分割任务。同时,Python还具有丰富的社区和文档资源,可以帮助用户充分掌握Python语言在遥感影像处理领域的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值