使用GDAL庫中的RPC校正問題

最近將GDAL庫更新至1.11版本之後,發現之前寫的RPC像方改正模型校正的結果偏差特別大(更新版本之前結果和PCI處理的結果一致)。所以初步判斷是GDAL庫的bug,經過各個參數修改發現原來是指定的DEM採樣方式導致的。

當指定DEM的採樣方式爲最鄰近時,校正結果偏差很大,當DEM採樣方式爲雙線性採樣和三次立方卷積採樣時,處理的結果與之前的結果一樣。截圖如圖1所示,紅色區域爲對比區域,如圖2所示。


圖1 PCI校正結果全圖


圖2  圖1中的紅色區域按實際像素放大顯示結果

下面是使用gdalwarp工具外加仿射修正模型進行校正的結果。首先使用DEM爲最鄰近採樣,gdalwarp命令行如下:

gdalwarp -of GTiff -tr 2.5 2.5 -t_srs ESRI::"D:\WGS_1984_UTM_Zone_50N.prj" -rpc -r cubic -wm 1024 -to "RPC_AFFINE=-32.67376693 0.99919599 0.00013941 28.71988840 0.00062236 1.00004356" -to "RPC_DEM=D:\Data\正射糾正基礎數據\DEM數據\beijing_all2.img" -to "RPC_DEMINTERPOLATION=near" D:\Data\711_214_26sep2006_p5\SrcData\bandf.tif D:\bandf_rpc1.tif --config GDAL_FILENAME_IS_UTF8 NO
處理的結果與PCI結果對比如圖3所示。

圖3  GDAL指定DEM插值爲最鄰近處理結果

接下來指定DEM重採樣方式爲雙線性,代碼和處理結果如下:

gdalwarp -of GTiff -tr 2.5 2.5 -t_srs ESRI::"D:\WGS_1984_UTM_Zone_50N.prj" -rpc -r cubic -wm 1024 -to "RPC_AFFINE=-32.67376693 0.99919599 0.00013941 28.71988840 0.00062236 1.00004356" -to "RPC_DEM=D:\Data\正射糾正基礎數據\DEM數據\beijing_all2.img" -to "RPC_DEMINTERPOLATION=bilinear" D:\Data\711_214_26sep2006_p5\SrcData\bandf.tif D:\bandf_rpc2.tif --config GDAL_FILENAME_IS_UTF8 NO
處理的結果與PCI結果對比如圖4所示。

圖4 GDAL指定DEM插值爲雙線性處理結果

接下來指定DEM重採樣方式爲三次立方卷積,代碼和處理結果如下:

gdalwarp -of GTiff -tr 2.5 2.5 -t_srs ESRI::"D:\WGS_1984_UTM_Zone_50N.prj" -rpc -r cubic -wm 1024 -to "RPC_AFFINE=-32.67376693 0.99919599 0.00013941 28.71988840 0.00062236 1.00004356" -to "RPC_DEM=D:\Data\正射糾正基礎數據\DEM數據\beijing_all2.img" -to "RPC_DEMINTERPOLATION=cubic" D:\Data\711_214_26sep2006_p5\SrcData\bandf.tif D:\bandf_rpc3.tif --config GDAL_FILENAME_IS_UTF8 NO
處理的結果與PCI結果對比如圖5所示。

圖5 GDAL指定DEM插值爲三次立方卷積處理結果

修改GDAL源碼中的文件gdal_rpc.cpp兩處地方,就是將GDT_Int32修改爲GDT_Float64。原因很簡單就是變量dfDMEH是一個double類型,讀取數據的時候也需要按照double類型進行讀取,而原來的代碼是按照Int32類型讀取,導致讀取出來的DEM高程值有問題。修改後代碼見圖6,共有兩處,座標正變換和逆變換都需要修改。


圖6 修改後的GDAL代碼

修改後重新編譯GDAL即可。使用修改後的程序,指定DEM插值爲最鄰近後處理的結果如圖7。


圖7 修改後正射的結果對比
已經將該問題反饋至GDAL開發組,具體地址爲:http://trac.osgeo.org/gdal/ticket/5553。估計下個版本就會修正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章