影像纠正配准功能的开发

      将近两年前,我开发了一个影像纠正配准功能,可以说是本人开发的软件中为数不多的具有一定挑战性的功能,不记下来实在有点可惜,所以现在凭借有限的记忆作一个记录吧。

      当时公司正在为某城市做一个土地利用调查的项目,采用的比例尺是1/5000,数据的建库、生产与管理软件均由我单位提供。生产工艺流程:航摄->生产分幅影像->影像打印成分幅图件->现场调查、在图件上线划标记->扫描图件->图件纠正与镶嵌->在GIS中线划接边(下面步骤略)。当时感觉这几个步骤挺傻的,外业人员直接带上笔记本电脑、装好GIS系统、套上幅影像,边调查边线划不就得了吗?打印费都可以省几百万啊。当然,这个我们也管不了,但其中“图件纠正与镶嵌”功能是我们软件中所没有的,必须进行开发。这个功能我当时开发了两个版本,第一个是用VB+MO开发的,第二个是是Delphi开发的,不需要GIS平台。其实两件版本的操作都挺方便的,主要是因为VB的图像操作功能比较弱,什么都要用API,当时只能整体纠正,有些地方精度达不到要求;第二版本采用了逐格网纠正,精度很高,下面只介绍第二个版本。

      首先当然是要弄清楚究竟是要做什么。由于接手时,经验很少,这个问题真难住了我几天,后来慢慢学习体会,总结下来大概有以下几个功能点:一、对影像进行纠正,消除图像在打印和扫描过程中产生的变形。二、以纠正后的结果进行裁切,只留下内图幅范围所需要内容;三、为影像生成坐标文件,以方便加载到地图中。
      对于影像的纠正,实际上是根据选定的公式,对图片每一个像素点进行转换,放到目标图片相应的位置上,或者反过来,遍历目标图片的像素点,根据公式,计算它对应在原始图片的哪个位置上,然后取得灰度值 。显然第二种方法比较理想,不会产生空白区域。我最后选择的是第二种方法。由于是按公式进行转换,对应到原始图像上时,不一定是整数,在计算灰度值的时候,可以先择一定的方法,例如取最邻近的像素点,或按一些方法进行计算。我最后提供了最邻近法与双线性内插法两种计算灰度的方法。
      影像纠正最重要的一点还是转换公式的选择。 有很多公式可以选择,如仿射变换、双线性变换、二次多项式法、三次多项式法等。但公式所需参数是公式的参数需要计算的,越复杂的公式,精度会越高,但计算的难度越大。由于项目很紧,对于高次幂的公式,我也实在算不过来,最后选择一个精度不错,复杂度不高的算法:双线性变换法,公式为:X = axy + bx +cy + d    Y = exy + fx + gy + h需要八参数,正好四组控制点可以搞定。 
      至于裁切和生成坐标文件,不再详述。看看以前写的帮助文件吧,太懒了,哈哈~

推荐按照以下步骤来进行影像的纠正配准操作。

第一步:打开要纠正的影像图
第二步:在图像上定位内图廓的四个角点 
       影像图打开后,首先需要定位内图廓的四个角点在影像上的位置。第二步到第四步是配准的过程。这个过程要做的事情实际上就是将所有可以用于参与纠正的控制点找出来,并确定这些控制点在图像上的位置以及它们真实的地图坐标。

       控制点配准的操作方法:

1、           鼠标靠近要配准的控制点,鼠标形状会由箭头形状 变成十字丝中间有小矩形的形状,这表示系统捕捉到了该控制点。

2、           点击控制点,鼠标形状会变成十字丝中间有圆形的形状。这表示确定对该点进行配准。这里,在图像点任一处点击,该点都会移动到点击的位置。为了使用控制点能精确定位到每个像素,可以点击鼠标右键打开辅助窗口,如下图所示:

 

如果正确配准的话,辅助窗口中会用十字丝标识出正在配准的点的位置。辅助窗口打开时是以鼠标右键点击位置为中心的,所以,鼠标右击的位置最好离正在配准的点的位置比较近。这时,可以通过AWDS四个键或方向键对辅助窗口中的图像进行移动。在辅助窗口中点击控制点的位置,该点就配置成功了,这里,标识该点的十字丝会变成白色。     

第三步:设置图幅信息

       点击“纠正”菜单下的“设置图幅信息”。

 
       经过第二步,已经知道了内图廓的影像坐标,但还不知道它们的地理坐标。设置图幅信息,首要目的就是为了确定图幅的地图坐标范围。这样,影像坐标就和地图坐标建立起了一个整体的对应关系。然后系统计算出该图幅内包含的控制点的地理坐标,并通过建立的对应关系,确定它们在影像上的位置。这样,就建立起了一个网状分布控制点格网。

       如下图所示。


               设置图幅后,系统自动建立的控制点格网
第四步:配准所有控制点 

       配准的方法与第二步相同。通过这步操作,所有控制点的就建立了一个精确的地图坐标和影像坐标的对应关系。坐标点在配准之前,以红色显示,配准完成的以白色显示。

第五步:纠正 

“裁切范围”的显示数据为系统根据所输入的图幅号计算得出,默认是图幅四个角点构成的多边形的最小外接矩形。勾选“启用载切”对图幅外的周边进行载切,纠正后的图像文件只包启该范围中的内容;如不勾行选,则不进行裁切,纠正的结果会包含整幅图的内容。

单击“纠正”按扭,进度条显示纠正进度(见图22

 

(图22

纠正时,系统会自动保存内图廓在影像上的位置,下次打开影像时,会自动以该位置作为默认的内图廓位置。 

纠正完毕后,会包含两个文件,一个是纠正后的影像文件,一个是定位文件,tfw格式。

整体纠正:如果进行整体纠正,第四步可以省略。

----------------------------------------------------------------------------------
      记得偶刚准备开发的时候,我也是一头雾水,很多概念都搞不清。我先把这个功能交给部门里另一个同事,这个同事刚进公司不久,硬是把他给吓跑了(辞职),呵呵。没办法,只好自己动手。当时我们的一个合作伙伴也想开发这玩艺儿,组织了一个团队进行开发,开发了一段时间,影子也没见着,就停工了。这些是插曲。其实开发完毕后,觉得并不是很难,算法上也还可以进一步改进。只是没以接触过的人,做起来真的很痛苦,就像蚕蛹破茧成蝶,是不断挣扎的过程,使上全身的力气,才能慢慢的展开翅膀,达到成功。

写得乱七八糟,主要因为不能静下心来写,要做的事情还很多啊。

原文地址:https://www.cnblogs.com/watsonyin/p/700717.html