利用Python和GDAL实现图像批处理
GDAL是一个开放源代码的栅格空间数据处理包,功能很强大。要使用它所提供的功能可以安装FWTools 软件包(http://fwtools.maptools.org/),这样我们就可以使用其提供的命令行功能和python编程接口。
在本文中,我们没有用到python接口,而仅仅用到GDAL一个简单的命令行功能gdal_translate,就可以实现很灵活的功能。
先介绍一下 gdal_translate,顾名思义,这是一个图像格式转换的命令,但在转换过程中,我们可以做很多事情的,比如从原始图像中裁出一个窗口,改变图像 的地理范围,改变投影等,详细信息在FWTools的命令行中,敲下gdal_translate,然后回车,就会出现提示信息。举个简单的例子,我要把 pic.tif 做成JPG的缩略图,可以用如下命令: gdal_translate -of "JPEG" -outsize 5% 5% pic.tif overview.jpg 回车,就OK了;
再比如:我要从图像中裁剪出一块(要先知道图像信息,gdalinfo pic.tif),命令如下: gdal_translate -of "JPEG" -srcwin 100 100 200 200 pic.tif clip.jpg
还是比较简单的,其他功能可以参考一下http://www.gdal.org/gdal_translate.html ,也不太难。
当处理一张图片的时候,我们可以直接敲命令,但如果有10000张图片摆在你面前,相信你不愿意做一万次吧,呵呵~~~ 这时就需要批处理了,把所有要处理的图像放到一个文件夹中,利用Python简单地做个遍历,一一处理即可。
先说一下python脚本的运行方式,打开安装FwTools命令行,敲:python myscript.py(脚本名) parameters(参数) ,即可运行。
代码如下,很简单的说~~
#名称:图像裁剪批处理 #时间:2006年1月4日 #作者:liujunzhi #内容:利用GDAL命令实现同一文件夹中,相同坐标系和大小的图像的裁减或其他批处理
import glob import sys import os
strDir = sys.argv[1] str = strDir + "\*.img" #you can change the extension name according to your needs fileList = glob.glob(str)
for name in fileList: print name, '\n' name_without_suffix = name[:-4] strCmd = "gdal_translate -srcwin 6101 4801 1024 1024 " + name + ' ' + name_without_suffix + '_xuzhou.img' os.system(strCmd) print strCmd
根据需要把strCmd改成需要的别的命令,就可以做别的工作了,比如我想通过重采样将一些图像根据地理坐标挖出一个窗口,转换到一定的分辨率,并对其地理范围进行赋值,就可以将上面脚本中的strCmd一句改为:
strCmd = "gdal_translate -outsize 1024 1024 -projwin 505333.5 3805006.5 534517.5 3775822.5 -a_ullr 505333.5 3805006.5 534517.5 3775822.5 " + name + ' ' + name_without_suffix + '_xuzhou.tif'
在本文中,我们没有用到python接口,而仅仅用到GDAL一个简单的命令行功能gdal_translate,就可以实现很灵活的功能。
先介绍一下 gdal_translate,顾名思义,这是一个图像格式转换的命令,但在转换过程中,我们可以做很多事情的,比如从原始图像中裁出一个窗口,改变图像 的地理范围,改变投影等,详细信息在FWTools的命令行中,敲下gdal_translate,然后回车,就会出现提示信息。举个简单的例子,我要把 pic.tif 做成JPG的缩略图,可以用如下命令: gdal_translate -of "JPEG" -outsize 5% 5% pic.tif overview.jpg 回车,就OK了;
再比如:我要从图像中裁剪出一块(要先知道图像信息,gdalinfo pic.tif),命令如下: gdal_translate -of "JPEG" -srcwin 100 100 200 200 pic.tif clip.jpg
还是比较简单的,其他功能可以参考一下http://www.gdal.org/gdal_translate.html ,也不太难。
当处理一张图片的时候,我们可以直接敲命令,但如果有10000张图片摆在你面前,相信你不愿意做一万次吧,呵呵~~~ 这时就需要批处理了,把所有要处理的图像放到一个文件夹中,利用Python简单地做个遍历,一一处理即可。
先说一下python脚本的运行方式,打开安装FwTools命令行,敲:python myscript.py(脚本名) parameters(参数) ,即可运行。
代码如下,很简单的说~~
#名称:图像裁剪批处理 #时间:2006年1月4日 #作者:liujunzhi #内容:利用GDAL命令实现同一文件夹中,相同坐标系和大小的图像的裁减或其他批处理
import glob import sys import os
strDir = sys.argv[1] str = strDir + "\*.img" #you can change the extension name according to your needs fileList = glob.glob(str)
for name in fileList: print name, '\n' name_without_suffix = name[:-4] strCmd = "gdal_translate -srcwin 6101 4801 1024 1024 " + name + ' ' + name_without_suffix + '_xuzhou.img' os.system(strCmd) print strCmd
根据需要把strCmd改成需要的别的命令,就可以做别的工作了,比如我想通过重采样将一些图像根据地理坐标挖出一个窗口,转换到一定的分辨率,并对其地理范围进行赋值,就可以将上面脚本中的strCmd一句改为:
strCmd = "gdal_translate -outsize 1024 1024 -projwin 505333.5 3805006.5 534517.5 3775822.5 -a_ullr 505333.5 3805006.5 534517.5 3775822.5 " + name + ' ' + name_without_suffix + '_xuzhou.tif'