利用ArcGIS与arcpy构建影像批量校正的GP工具


最近这个高分影像的数据处理项目,需要对遥感影像进行地理配准,这是首先考虑到的必然是利用影像匹配的算法进行自动匹配。但是由于配准影像和基准影像在分辨率、实相方面差异较大,导致自动匹配效果很差(识别出的同名点太少或分布极不均匀),为了保证匹配的精度,只能使用人工判读的方式了。
这时主要还是采用了ArcGIS的地理配准功能,便是这样,对照两图选同名点:
这里写图片描述

然后进行校正:这里写图片描述

但这里有一个问题,选完点后直接进行校正会占用大量的内存,给接下来的工作带来了不方便,便考虑到能不能利用影像与保存的GCP文件进行批量校正,这样就可以放到半夜去计算了。这时便想到了利用arcpy与GP框架。

查阅了ArcGIS帮助,在数据管理工具下面有一个方法可以根据文件校正:

WarpFromFile_management (in_raster, out_raster, link_file, {transformation_type}, {resampling_type})
其中link_file就是保存生成的GCP的txt文件;

下面的事情就好办了,由于需要批量进行,因此必须做一个GP工具箱,方便重复使用:
这里写图片描述

这里的思路是:输入影像、GCP、保存名三个地方的每一行都是一组,需必须保证时一一对应的关系,第n行所对应的GCP文件也是第n行,保存名也是第n行。同时这里还加入了分辨率,这是因为由于影像发生了扭曲,导致校正后分辨率发生了微小的变化,因此需要对校正后的影像再进行一次重采样。
这个GP工具所对应的脚本代码如下

def second_to_hms(second):
    hour = int(second/3600)
    miniute = int((second%3600)/60)
    miao = int((second%3600)%60)
    haoshi = str(hour)+u"时"+str(miniute)+u"分"+str(miao)+u"秒"
    return haoshi

先定义了一个秒换算时分秒的方法,方便对校正和重采样所花的时间进行掌握。
然后定义变量:

import arcpy,os,string
import time

input_img = string.split(arcpy.GetParameterAsText(0),";")
GCPs = string.split(arcpy.GetParameterAsText(1),";")
save_folder = arcpy.GetParameterAsText(2)
warp_type = arcpy.GetParameterAsText(3)
resamping = arcpy.GetParameterAsText(4)
resolution= arcpy.GetParameterAsText(5)
savename = string.split(arcpy.GetParameterAsText(6),";")
os.mkdir(os.path.join(save_folder,"Resamping"))
Resamping_folder = os.path.join(save_folder,"Resamping")

这里在保存的文件夹下新建了一个Resamping文件夹,是为了将重采样后的最终成功放入其下。

for img in input_img:
    img_index = input_img.index(img)
    img_GCP = GCPs[img_index]
    img_savename = savename[img_index]+".img"    

    img_name = arcpy.Describe(img).baseName

    arcpy.AddMessage(u"原始影像:"+img)
    arcpy.AddMessage(u"原始GCP :"+img_GCP)
    arcpy.AddMessage(u"保存后名:"+img_savename)
    arcpy.AddMessage(u"正在进行校正。。")

前三行感觉是最重要的三行,让输入影像、GCP文件、保存名对应上了,后面就几行代码解决问题了:

    Output_img = os.path.join(save_folder,img_savename)
    Resamping_img= os.path.join(Resamping_folder,img_savename)

    start1 = time.clock()
    arcpy.WarpFromFile_management(img, Output_img, img_GCP, warp_type, resamping)
    end1 = time.clock()    
    warp_time = end1-start1
    haoshi1 = second_to_hms(warp_time)
    arcpy.AddMessage(u"已校正完毕!耗时"+haoshi1)

前两行时校正后的文件路径名和重采样后的文件路径名,当作参数要放到WarpFromFile_management和Resample_management两个方法里面。这时候校正的结果文件已经出来了,最对得到的校正后影像进行重采样:

    start2 = time.clock()
    arcpy.Resample_management(Output_img, Resamping_img, resolution, resamping)
    end2 = time.clock()
    re_time = end2-start2
    haoshi2 = second_to_hms(re_time)
    arcpy.AddMessage(u"重采样完毕!耗时"+haoshi2)

然后就可以在保存文件夹下的Resamping文件夹下得到最后的成果了。
这个代码还是非常简单的,感觉还是思路更加重要。

转载自:https://blog.csdn.net/mmll0927/article/details/77600908

You may also like...