C++ 傅里叶变换深度图的相位转换

C++ 傅里叶变换深度图的相位转换,c++,math,fft,C++,Math,Fft,如(跳转到熊的图像)和中所述,当对象沿垂直轴旋转时,“相位转换”深度贴图(像素亮度与其到观察者的距离相关的图片)的傅里叶变换应向左或向右平移 考虑以下两个例子(来自链接1):左侧是对象的原始深度贴图,右侧是其“相位转换”的傅里叶变换。。。如您所见,当对象旋转时,FT的一部分向左平移,这是一个非常实用的功能(请参阅第一个链接了解原因) 我一直在尝试复制这种行为,结果好坏参半。 首先,我需要实现一个“相位转换”深度图的公式,它作为定义为的函数给出(参见链接) Ph[x,y]=exp(i*深度[x,

如(跳转到熊的图像)和中所述,当对象沿垂直轴旋转时,“相位转换”深度贴图(像素亮度与其到观察者的距离相关的图片)的傅里叶变换应向左或向右平移

考虑以下两个例子(来自链接1):左侧是对象的原始深度贴图,右侧是其“相位转换”的傅里叶变换。。。如您所见,当对象旋转时,FT的一部分向左平移,这是一个非常实用的功能(请参阅第一个链接了解原因)

我一直在尝试复制这种行为,结果好坏参半。 首先,我需要实现一个“相位转换”深度图的公式,它作为定义为的函数给出(参见链接)

Ph[x,y]=exp(i*深度[x,y])

很明显,我必须把它从指数形式转换成矩形形式,其中

半径*exp(i*角度)--->[半径*cos(角度),半径*sin(角度)]

因此,我修改了标准的2D FT应用程序初始化

傅里叶[i,j].实=(双)灰度图像[i,j];//灰度图像:字节[0..255]

傅里叶[i,j].imag=0

双角度=(双)灰度图像[i,j]

Fourier[i,j].real=Math.Cos(角度)

Fourier[i,j].imag=Math.Sin(角度)

起初,结果令人鼓舞。。。让我们看一个例子(来自第二个链接)

左边是物体的深度图,中间是它的FT(大小),右边是它的相位转换的FT,其中3个点位于3个平面的中心……/P> 现在让我们看看当使用上述代码时我的结果是什么样的

如你所见,如果FT有点相似,右边的三角形是水平倒转的。这可以通过反转cos和sin

Fourier[i,j].real=Math.Sin(角度)

Fourier[i,j].imag=Math.Cos(角度)

或者通过反转深度贴图

双角度=255.0-(双)灰度图像[i,j]

但无论如何,有一些不匹配的周围。。。现在让我们尝试一个(注意:图片NSFW,但我没有找到任何其他同一旋转对象的多个深度贴图的示例)

在这种情况下(其结果应该与bear示例类似),我的相位转换实现是完全错误的,因为FT保持居中,并且不会因对象的旋转而向左或向右平移

所以我的问题是:我的相位转换编码有什么错

(我几乎尝试了想象和绝望所能支配的一切,比如将深度贴图缩放到弧度,或者以任何可能的方式使用Math.exp…但没有成功)