c++ - openCV 的 fftshift C++ 实现

标签 c++ matlab opencv image-processing

这个问题我已经看过了 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 数据结构中的值吗?

最佳答案

好吧,这个线程可能已经过时了,但也许对其他用户来说。看看示例:

opencv/samples/cpp/dft.cpp (line 66 - 80)

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);

我认为这是针对不同维度的一种简短而干净的方法。

关于c++ - openCV 的 fftshift C++ 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29226465/

相关文章:

c++ - OpenCV - 基本操作 - 性能问题 [模式 : Release]

c++ - C结构中的":"(冒号)-这是什么意思?

MatLab-->csv : Export data to csv file using dlmwrite in Matlab

ios - iOS 应用程序缺少 dylib

c++ - drawScanlineWithDepth - 优化

c++ - 使用 lldb : how? 调用带有字符串参数的函数

matlab - matlab 支持 float16 吗?

matlab - MATLAB 中的直方图拟合和核密度图

C++ OpenCV : What is the easiest way to apply 2-D convolution

opencv - GpuMat 上传小图片太慢