首先来看一张特殊的同心圆图像及其极坐标变换:
这是我自己在opencv下用cvLogPolar函数做的实验:
极坐标原点选择在同心圆圆心时,同一个圆上的点到圆心的距离相等,所以映射在极坐标中应该是一组垂直于极轴的平行线。在自己的实验中因为确定圆心的过程中有误差,所以得到的结果有点扭曲。一组同心圆之间就是尺度缩放的关系,对应在极坐标系中是水平方向的压缩和拉伸。
一开始因为平行线的关系,我认为尺度变换在极坐标系中对应的是水平方向的平移,后来在使用相位相关法计算极坐标系中的位移量时发现并不是这样。下面是以lena图像作为输入图像的例子:
第一行是原图和对应的极坐标系下的转换图。为了使图像在旋转之后也能完全显示,这里将图像用全0填充为了原来的四倍。
第二行是顺时针旋转50度(参数-50.0)和缩放0.6的结果和对应的极坐标转换图。
可以看到旋转和缩放在极坐标系中都转化为了垂直和水平方向上的平移。
这里利用OpenCV函数phaseCorrelate实现相位相关,计算极坐标中的平移量。得到的是:
我们知道在计算机坐标系中x轴正向是水平向右的,Y轴垂直向下。在极坐标系中水平方向是极轴取对数的结果,竖直是角度。所以可以看到在图像旋转和缩小后,在极坐标系中的图在水平和竖直方向进行了左移和下移。但是这里得到的两个平移量和旋转缩放的参数有什么数学关系呢。极坐标下的图大小为1024x1024,360度分布在y轴的0~512区域,所以y轴平移量y对应的角度变化应该是(y/1024)*360.
这里有两个误区:
一是getRotationMatrix2D中的角度参数的单位是度,不必再转化为弧度。在cvLogPolar函数得到的图中垂直方向的坐标轴的单位也是度。
第二点还只是根据实验结果的猜想。对数极坐标按道理要对极轴长度取了对数,但是观察极坐标系下的转换图的宽度,在cvLogPolar函数中好像没有取对数。利用相位相关法目的是得到极坐标系下的平移量从而得到旋转角度和缩放系数。但其实缩放之后在极坐标系下表现出的不是平移,而是水平方向的成比例缩放。既然不再是平移,就不能再使用相位相关法进行平移量的计算。除非只有旋转变换。
在编程的过程中,我特意把极坐标原点、图像中心、旋转中心重合,这样可以使得得到的极坐标系下的图尽量分布均匀,但是图像中心容易得到,而在实际情况中我们一般都无法确定图像的旋转中心。下面实验一下原点的选择的关系。
旋转中心点和极坐标原点不在图像中心,但依然重合
旋转中心点和极坐标原点不再重合。
可以从图中看到,当旋转中心坐标和极坐标原点不重合时,旋转、缩放在极坐标系下对应的变化不再是平移。其实,旋转中心和极坐标原点不重合可以理解为图像还经过了平移变换,而平移变换在极坐标系下不再有特殊的性质。这时候可以用傅里叶变换的性质,信号的平移在频谱中表现为相移,利用相位相关法得到平移量。
其实以上这一套利用极坐标变换和傅里叶变换解决RST问题的方法就是Fourier-mellin算法。
Reference:
1. 赵春江https://blog.csdn.net/zhaocj/article/details/50157801#commentsedit
2. 晓响雷电https://blog.csdn.net/agrapier/article/details/50297289
3. 同心圆https://blog.csdn.net/u012566751/article/details/61200404