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