需求简述
对于一张栅格影像图,需要一个进行快速且正确的投影转换算法,以便能够快速的实时多源数据叠加显示。
因为只是用于显示,所以无需进行整体的重投影,只需要对显示区域范围进行重投影即可。
逐点采样投影换算
正常的影像进行投影变换,原理是对影像的每一个像素点都进行投影转换(两个三维坐标系之间的转换),然后输出到新的图像对应位置(实际算法应该是先计算出输出栅格的大小,然后通过坐标转换公式计算输出栅格中的像素点与之对应的源影像中的像素点,进行采样输出)。
这是比较严格的转换方式,其效果也不错,但是速度太慢。对于图像少的情况,还能够实时浏览,但是当影像图层非常多的时候,就不行了。
快速投影
这里主要说的是投影坐标系的影像转经纬度的情况。显示范围看做一个方格,则只需取出这个方格范围的像素点即可。
状况一
直接计算输出范围四个角点在图像投影坐标系上的坐标,然后计算UV进行透视(投影)变换。
快速一点的方法就是只对四个角点进行转换,以四个角点为基准,计算四点UV值,进行透视变换后得到新图像。
即以四个角点计算输出的行列范围(外包框,即临时取图范围),四个角点的行列坐标值与整个取出临时图像的角点的行列坐标值计算UV进行坐标转换。
1、计算方格四个角点(经纬度)在影像地理坐标系(投影)上对应的角点坐标pts1
2、计算pts1的外包矩形框rectbox1
3、计算pts1在rectbox1中相对位置关系,就是计算UV值
4、计算rectbox1在影像中的行列坐标范围,读取对应像素数据
5、对取出来的数据进行透视变换,得到数据就是要用来显示的数据
状况二
如果输出图像是经纬度的,且输入图像在输出图像中占的位置范围非常小
,或者反过来,这时候就要使用不同的策略了。
考虑到投影变形(跨带问题),则需要计算图像的经纬度范围的四个角点在图像所在投影坐标系的坐标范围内的四点坐标(或者以图像四个角点坐标和其角点经纬度坐标形成点对),然后通过多项式公共点校正算法得到输出范围四个角点在投影坐标系的坐标,这时候的坐标不是正常的坐标转换得到的,但采用这种方式得到的四个角点坐标后,计算UV进行透视变换后得到的新图像是正确的。
1、计算影像的地理坐标(投影)角点坐标 pts2 在显示范围坐标系(经纬度)中对应的坐标 pts1
2、以pts1和pts2组成点对,获取GCP校正参数(pts1-->pts2)
3、使用GCP校正参数,计算显示范围角点在在影像地理范围内的坐标 pts3 (投影坐标,可能也可以超出投影坐标系有效范围)
4、计算 pts3 在影像地理范围内(是个矩形)相对位置,也就是UV值,这个UV值应该超出0~1的范围
5、对图像数据进行透视变换,使用的参数就是第四步计算出来的UV值
方法二
因为透视(投影)变换就是本身也是比较复杂的,而同一矩形区域在不同坐标系下的变形一般都是很小的,所以可以使用简单仿射变换来进行转换。
基本步骤与上面一致,只是将计算透视变换的参数改为计算仿射变换参数,然后进行像素点的转换即可。