倾斜地图以匹配航拍图像

信息处理 图像处理
2022-02-22 14:27:57

我有以下航拍图像(显然是从飞机上拍摄的):

在此处输入图像描述

我还有一张图片中显示的区域的地图:

在图像和地图上,我可以标记相应的街道、街道交叉口和地标(我这里只显示了三个,但我可以提供更多的点以提高精度)。

我想倾斜地图以匹配图像(相机位置、角度等)。我怎样才能做到这一点?

(我可以在 Windows 上编写 OpenCV 和 AForge.Net,并且可以使用 Gimp 和 Blender。)

在此处输入图像描述

2个回答

好吧,您可以尝试估计在两个图像中的坐标之间映射的变换矩阵。这个想法是

[xaya]=[AxxAyxAxyAyy][xmym]

在哪里xa,ya是航拍图像的坐标(例如以像素为单位)和xm,ym是照片的坐标。写出来会导致方程组:

xa=Axxxm+Ayxym
ya=Axyxm+Ayyym

这样您就可以表示图像之间的缩放、旋转和剪切操作。每个图像至少需要四个点来求解该系统,但我建议更多,然后使用线性回归计算最小二乘解。这也将让您了解一切的运作情况。如果拟合后存在较大的残差,则线性变换可能不够。

如果您想叠加图像,只需将变换矩阵应用于您的地图,结果应该是一个图像,其参考坐标彼此重叠,并且其间的区域相应地进行线性变换。

这里有很多可能出错的地方。这一次,它只适用于大致平坦的地形(尽管如果飞机距离较远,这种效果会变弱)。此外,如果照片中存在镜头失真,则会影响拟合的准确性(通常靠近图像边界)。最后,地图不准确可能会让您失望。

最后,这只是一个尝试的问题。如果 2D 转换模型无法提供准确的结果,则需要对更多效果进行建模。但估计这些可能还需要更多的参考点。

另一种想法是将图像放在平面上(如纹理)并将平面放置在 3D 空间中,并将其与照片的平面匹配。最终你会得到这个平面的 3 维变换矩阵。可能也有效。

两个图像平面之间的透视变换可以表示为:

[XwYww]=[abcdefgh1][xy1]

自从w=gx+hy+1,

您可以将矩阵方程更改为:

[XY...]=[xy1000XxXy000xy1YxYy...][abcdefgh]

请注意,您有 8 个未知数,这表明您需要至少 4 个独立的坐标对应关系,以避免矩阵的欠定。