本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiluoduyu/
从网上查看很多关于几何校正的代码,不过好像基本上都差不多,下载下来调试基本上都是说说而已,根本没法真正做到几何校正的目的。好多人也在怀疑GDAL到底能不能做几何精校正,经过自己的努力,我发现,其实只要稍微改一下,GDAL完全可以做到多项式几何精校正的,在此跟大家分享下思路,也希望大牛们有更好的方法的话共享下。
首先说一下最简单的几何校正模型---仿射校正模型(叫法可能不对,大家明白即可)。所谓仿射校正,即是通过地理坐标来确定转换关系的。首先根据控制点数组用GDALGCPToGeoTransform得到转换系数,然后代入待校正影像的四个角点坐标(0,0),(w,0),(0,h),(w,h)得到八个地理坐标值,对八个地理坐标值进行简单排序得到水平方向和竖直方向的四个最值。我觉得在做几何校正时最好能保持像元分辨率不变,因而通过将之前得到的地理坐标最值除以分辨率即可得到目标影像或结果影像的行列数,此时得到的行列数未必是整数,所以需要做下取整处理,处理之后别忘了对结果影像的像元分辨率做下调整,即根据地理范围与实际行列数重新计算一下,再结合待校正影像的其他四个地理系数即得到结果影像的地理坐标转换系数,这是个关键。之后便可逐像元进行坐标转换和重采样啦,我的重采样是自己写的,不一定有GDAL的好,不过感觉测试效果不差。也可以到GDAL的源文件里找它的重采样函数直接copy过来用的,不过自己之前写了,就懒得去看GDAL的重采样了。
上面说废话多了点,其实上面的方法只能做一次的校正,不能(或许是我不知道)做多项式校正。那为什么我还要介绍它呢?很简单,因为上面的方法给了我们一个新的解决思路。查看GDAL的API你会发现,GDAL它能够根据由控制点系数得到的地理转换系数来进行待校正影像影像地理坐标到校正影像(结果影像)的行列号影像坐标的转换,也就是说仿射校正中的待校正影像与结果影像坐标之间的转换计算可以通过GDAL来完成(看GDAL API 的GDALGCPTransform函数解析说明),而GDAL在获取地理转换系数时是可以多次的,那么只要我们对用GDAL计算出来的待校正影像坐标进行重采样再赋给对应的结果影像像元,这不就达到多项式几何校正的目的了吗?在重采样时我用的是自己的重采样函数,二次多项式校正的结果与原影像对比如下左边的是标准影像,中间的是仿射校正结果,右边的是gdal二次多项式校正结果,测试数据是envi4.5自带的示例数据,畸变影像其实是对原影像进行了简单的重投影后得到的:
不过也不知道为什么得到的多项式校正结果虽然基本校正过去了,但居然比仿射校正的还差。唉,也许是自己的细节处理还不够好吧。不够先这样吧,以后有时间再优化。
对上图所示程序有兴趣的朋友可到我的资源http://download.csdn.net/detail/xiluoduyu/5312172下载源码(在html文件夹里面搜index主页,主页里面有整个程序的帮助说明和源码),不用积分的。代码质量有点水,大家参考下就行了,当然有改良的想法的最好能告诉我一下啦。最近正打算将分类的模块添加进去,到时候会共享出来与大家分享的,期待中。。。