利用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