Python 对ASCII文件(及TIF文件)进行批量掩模裁剪

第一步:ASCII转TIF文件

在裁剪时我们要用到Toolbox中的工具Extract By Mask,而这个工具在python的程序语言中体现出来就是
out_extract = arcpy.sa.ExtractByMask(ras, mask) #执行按掩模提取操作
官方对于 ExtractByMask工具 的描述请看 按掩膜提取
对于ExtractByMask工具,要求输入的被裁减的文件和掩膜文件都是raster格式

需要做的第一步就是将asc文件转化为raster格式的文件,下边是经本人修改调试过的程序,一并附上最初参考的链接: ArcGIS 10 影像、栅格数据格式批量转换

# Import system modules
import sys, string, os                                      #加载工具包
 
dir = 'C:/Users/DELL/Documents/ArcGIS/Budyko_ds/MODIS_asc'  #工作环境
 
# Import arcpy module
import arcpy
 
files = os.listdir(dir)
for f in files:                                             #遍历文件
    if os.path.splitext(f)[1] == '.asc':
        # Script arguments...
        Input_raster_file = dir + os.sep + f
 
        # Local variables...
        Output_data_type = "DOUBLE"
        Raster_Format = "TIFF"
        Output_Workspace = "C:/Users/DELL/Documents/ArcGIS/Budyko_ds/Conversion"
 
        # =============== file name process ======================
        basename = os.path.splitext(f)[0];
        Output_raster = Output_Workspace + os.sep + basename + ".tif";
 
        if os.path.exists(Output_raster) == False:
            print Input_raster_file
            # Process: Raster To Other Format (multiple)...
            arcpy.RasterToOtherFormat_conversion(Input_raster_file, 
                        Output_Workspace, Raster_Format)
 
            print Output_raster
print("ALL DONE")

所以只需要对上边程序进行修改,就将asc文件批量转为Tif文件(转为Tif是方便进行掩模裁剪, 有效的栅格类型包含TIF ——栅格数据集的标记图像文件,但不非得转成TIF,其他栅格文件也行官方对于ListRasters的定义和描述

第二步:TIF文件的裁减

接下来就是裁减了,目前我亲测成功是以下三个链接中的第三个,现将修改后的代码附上:

import arcpy

arcpy.CheckOutExtension("spatial")   #检查有没有授权ArcGIS Spatial Analyst 扩展模块,没有则授权

arcpy.gp.overwriteOutput=1

arcpy.env.workspace = "C:/Users/DELL/Documents/ArcGIS/Budyko_ds/Conversion"

rasters = arcpy.ListRasters("*", "tif")

mask= "C:/Users/DELL/Documents/ArcGIS/Budyko_ds/Conversion/c630_Australia_614006_Bounda5.shp"

for raster in rasters:

    print(raster)

    out= "C:/Users/DELL\Documents/ArcGIS/Budyko_ds/Extraction/"+"clip_"+raster

    arcpy.gp.ExtractByMask_sa(raster, mask, out)

    print("clip_"+raster+"  has done")

print("All done")

需要注意的是:
把边界和待裁剪的栅格数据放到一个文件下!
把边界和待裁剪的栅格数据放到一个文件下!
把边界和待裁剪的栅格数据放到一个文件下!
[经验总结] 栅格数据批量裁剪–Python脚本
原因是:如果在不同文件夹,就得切换程序的工作环境,很麻烦

另外还需注意的是自己的边界文件(掩膜文件)是个线文件还是面文件,如果只是一条线,得到的就是下图中的那条彩色栅格环,但如果想要裁下来一个面的话就要将线用Arcgis中 Feature To Polygon 工具将之转换为面的shp文件~,可以参考
Python 批量将线元素转化为面元素
在这里插入图片描述

4.这样我们就完成了对于上百个asc文件的掩膜裁减任务:
在这里插入图片描述

最后得到的结果图(只展示一个流域):
在这里插入图片描述

Over

这是一篇关于python和Arcgis的很基础的操作指引文章,我希望对像我这样的初学者有所裨益,毕竟我也受惠于CSDN中大佬们的诸多指导,所以想把这点小心得写下来,大佬请忽略~~ 在操作过程中肯定会有形形色色的问题存在,所以耐心百度吧,百度的过程就是成长进步的过程,科研木有捷径走啊
如果大家发现有什么问题或者可以改进的地方尽可以留言指出~~

在这里插入图片描述

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在C语言中,我们可以使用位运算来对图像进行掩模操作。掩模操作可以通过将图像的每个像素与一个掩模图像的每个像素进行逐个比较,从而实现图像的局部区域处理。 以下是一个简单的例子,演示如何使用掩模对图像进行二值化处理: ```c #include <stdio.h> #include <stdlib.h> #define BMP_HEADER_SIZE 54 typedef struct { unsigned char blue; unsigned char green; unsigned char red; } Pixel; int main() { FILE *input_file = fopen("input.bmp", "rb"); FILE *output_file = fopen("output.bmp", "wb"); if (input_file == NULL || output_file == NULL) { printf("Error: Failed to open input/output file!\n"); exit(1); } // 读取位图文件头 unsigned char bmp_header[BMP_HEADER_SIZE]; fread(bmp_header, 1, BMP_HEADER_SIZE, input_file); // 读取图像数据 int width = *(int *) (bmp_header + 18); int height = *(int *) (bmp_header + 22); int padding = (4 - ((width * sizeof(Pixel)) % 4)) % 4; Pixel pixel, mask_pixel; unsigned char mask[3][3] = {{ 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 }}; int sum; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { sum = 0; // 对于每个像素,计算掩模内像素的和 for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (y + i < 0 || y + i >= height || x + j < 0 || x + j >= width) { continue; } fseek(input_file, BMP_HEADER_SIZE + (y + i) * (width * sizeof(Pixel) + padding) + (x + j) * sizeof(Pixel), SEEK_SET); fread(&pixel, sizeof(Pixel), 1, input_file); mask_pixel.blue = mask[i + 1][j + 1] * pixel.blue; mask_pixel.green = mask[i + 1][j + 1] * pixel.green; mask_pixel.red = mask[i + 1][j + 1] * pixel.red; sum += mask_pixel.blue + mask_pixel.green + mask_pixel.red; } } // 根据掩模内像素的和决定当前像素的值 if (sum >= 127 * 3) { pixel.blue = 255; pixel.green = 255; pixel.red = 255; } else { pixel.blue = 0; pixel.green = 0; pixel.red = 0; } // 写入输出文件 fseek(output_file, BMP_HEADER_SIZE + y * (width * sizeof(Pixel) + padding) + x * sizeof(Pixel), SEEK_SET); fwrite(&pixel, sizeof(Pixel), 1, output_file); } } fclose(input_file); fclose(output_file); return 0; } ``` 在这个例子中,我们使用了一个 3×3 的掩模,对图像进行了简单的二值化处理。当掩模内像素的和大于等于 127×3 时,当前像素的值被设为白色,否则被设为黑色。 你可以根据自己的需求修改掩模和处理的方式,实现更加复杂的图像处理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值