我已经看过这个问题
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);

我认为对于不同的尺寸,这是一种简洁的方法。

07-24 09:15