ArcGIS Pro高效图像分割方案:如何将大图自动切分为1000*1000像素块

1次阅读
没有评论

共计 2266 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

痛点分析

在处理大尺寸遥感影像时,尤其是为深度学习准备训练样本时,我们经常需要将大图分割成统一尺寸的小块。传统的手动分割方式不仅耗时耗力,而且容易出现尺寸不统一的问题,严重影响后续处理的效率和质量。

ArcGIS Pro 高效图像分割方案:如何将大图自动切分为 1000*1000 像素块

  • 耗时问题:手动分割一张 GB 级别的大图可能需要数小时,而且容易出错。
  • 尺寸不统一:手动操作难以保证每个小块都是严格的 1000*1000 像素。
  • 重复性工作:面对大量数据时,手动分割几乎不可行。

技术方案

GDAL vs arcpy

  • GDAL:开源工具,功能强大,但学习曲线较陡,且在某些 GIS 特定功能上支持不足。
  • arcpy:ArcGIS Pro 的 Python API,与 ArcGIS 生态无缝集成,特别适合需要保持空间参考一致性的场景。

arcpy.SplitRaster_management 关键参数

  1. Tile_Size:设置为 1000,确保每个小块都是 1000*1000 像素。
  2. Overlap:根据需求设置重叠区域,常见于深度学习样本准备。
  3. Cellsize:保持与原图一致,避免分辨率变化。
  4. Split_Method:通常选择 ”SIZE” 模式,按尺寸分割。

代码实现

import arcpy
import os
from tqdm import tqdm

def split_raster(input_raster, output_folder, tile_size=1000, overlap=0):
    """
    分割大图为指定尺寸的小块
    :param input_raster: 输入栅格路径
    :param output_folder: 输出文件夹
    :param tile_size: 分割尺寸
    :param overlap: 重叠像素数
    """
    # 确保输出文件夹存在
    os.makedirs(output_folder, exist_ok=True)

    # 获取栅格信息
    desc = arcpy.Describe(input_raster)
    band_count = desc.bandCount
    spatial_ref = desc.spatialReference

    # 设置输出基础名称
    base_name = os.path.basename(input_raster).split('.')[0]

    # 使用 tqdm 显示进度
    with tqdm(total=100, desc="Processing") as pbar:
        # 调用 SplitRaster 工具
        arcpy.SplitRaster_management(
            in_raster=input_raster,
            out_folder=output_folder,
            out_base_name=base_name,
            split_method="SIZE",
            tile_size=f"{tile_size} {tile_size}",
            overlap=overlap,
            cellsize="#",
            resampling_type="NEAREST",
            out_format="TIFF"
        )
        pbar.update(100)

if __name__ == "__main__":
    # 示例用法
    split_raster(
        input_raster="C:/data/large_image.tif",
        output_folder="C:/data/tiles",
        tile_size=1000,
        overlap=50
    )

代码说明

  • 多波段支持:代码自动识别输入栅格的波段数,保持输出一致。
  • 坐标系保持:通过 Describe 对象获取原始空间参考,确保输出保持一致。
  • 进度显示:集成 tqdm 库,提供友好的进度反馈。

性能优化

内存管理

  • 使用 in_memory 工作空间存放中间结果,减少 IO 开销。
  • 处理完成后及时清理临时数据。

多核并行

import multiprocessing

def parallel_split(raster_list):
    """并行处理多个栅格"""
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
    results = []

    for raster in raster_list:
        result = pool.apply_async(split_raster, args=(raster, "output_folder"))
        results.append(result)

    pool.close()
    pool.join()

避坑指南

常见错误

  • 无效的 NoData 值:确保设置的 NoData 值确实存在于数据中。
  • 文件名冲突:在输出文件名中加入行列号等唯一标识。

文件名冲突预防

# 在输出基础名称中加入行列信息
out_base_name = f"{base_name}_row{{0}}_col{{1}}"

验证环节

QGIS 检查方法

  1. 在 QGIS 中新建项目
  2. 使用 Layer > Add Layer > Add Raster Layer 加载切分结果
  3. 检查拼接处是否有重叠或缝隙
  4. 使用 Identify Features 工具验证像素值是否正确

输出日志示例

[2023-08-20 10:00:00] INFO: 开始处理 large_image.tif
[2023-08-20 10:00:05] INFO: 原始尺寸: 10000x8000
[2023-08-20 10:02:30] INFO: 生成 100 个 1000x1000 的瓦片
[2023-08-20 10:02:30] INFO: 处理完成

思考题

在分割非整数倍尺寸的边界块时,常见的处理方式有三种:

  1. 丢弃不足尺寸的部分
  2. 填充边缘(如镜像、重复或指定值)
  3. 调整边界块尺寸(可能导致尺寸不一致)

你会选择哪种方式?为什么?在实际项目中,这个决策可能需要考虑哪些因素?

正文完
 0
评论(没有评论)