我已经看过这个问题
fftshift/ifftshift C/C++ source code
我正在尝试从matlab 实现 fftshift
这是来自matlab函数的一维数组的代码numDims = ndims(x);
idx = cell(1, numDims);
for k = 1:numDims
m = size(x, k);
p = ceil(m/2);
idx{k} = [p+1:m 1:p];
end
y = x(idx{:});
我的c++ / openCV代码是,fftshift基本上所做的是从某个关键位置交换值。
因为我似乎无法理解opencv中如何为复数构建矩阵。
它说这里http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#dft
CCS(复共轭对称
我认为将复数分为实数和虚数并交换它们会更容易。然后合并回一个矩阵。cv::vector<float> distanceF (f.size());
//ff = fftshift(ff);
cv::Mat ff;
cv::dft(distanceF, ff, cv::DFT_COMPLEX_OUTPUT);
//Make place for both the complex and the real values
cv::Mat planes[] = {cv::Mat::zeros(distanceF.size(),1, CV_32F), cv::Mat::zeros(distanceF.size(),1, CV_32F)};
cv::split(ff, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
int numDims = ff.dims;
for (int i = 0; i < numDims; i++)
{
int m = ff.rows;
int p = ceil(m/2);
}
我的问题是,因为我向DFT输入的是vector<float>
,所以我似乎无法创建平面垫以拆分复数吗?
您能想到一种更好的方法来交换cv::mat数据结构中的值吗?
最佳答案
好的,与此同时,该线程可能已过时,但是对于其他用户而言。请看一下示例:
int cx = mag.cols/2;
int cy = mag.rows/2;
// rearrange the quadrants of Fourier image
// so that the origin is at the image center
Mat tmp;
Mat q0(mag, Rect(0, 0, cx, cy));
Mat q1(mag, Rect(cx, 0, cx, cy));
Mat q2(mag, Rect(0, cy, cx, cy));
Mat q3(mag, Rect(cx, cy, cx, cy));
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
我认为对于不同的尺寸,这是一种简洁的方法。