欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

opencv c++ fftshift

最编程 2024-08-14 14:02:57
...

OpenCV是一个广泛使用的计算机视觉库,其中包含了许多常见的图像处理和计算机视觉算法。而FFTShift是一种图像处理技术,用于对傅里叶变换结果进行中心化处理,以便于显示和分析。

在OpenCV中,FFTShift函数用于将傅里叶变换后的图像移到图像中心。具体实现可以参考下面的代码示例:

// 转换为复数
cv::Mat planes[] = { cv::Mat_<float>(image), cv::Mat::zeros(image.size(), CV_32F) };
cv::Mat complexI;
cv::merge(planes, 2, complexI);

// 傅里叶变换
cv::dft(complexI, complexI);

// 移动零频分量到中心位置
int cx = complexI.cols / 2;
int cy = complexI.rows / 2;
cv::Mat q0(complexI, cv::Rect(0, 0, cx, cy));
cv::Mat q1(complexI, cv::Rect(cx, 0, cx, cy));
cv::Mat q2(complexI, cv::Rect(0, cy, cx, cy));
cv::Mat q3(complexI, cv::Rect(cx, cy, cx, cy));
cv::Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);

// 反傅里叶变换
cv::idft(complexI, complexI);

// 分离实部和虚部
cv::split(complexI, planes);

// 计算幅值
cv::Mat magnitude;
cv::magnitude(planes[0], planes[1], magnitude);

// 取对数并归一化到0-1
magnitude += cv::Scalar::all(1);
cv::log(magnitude, magnitude);
cv::normalize(magnitude, magnitude, 0, 1, cv::NORM_MINMAX);

// 显示结果
cv::imshow("FFT Shift", magnitude);

在这个示例中,首先将图像转换为复数形式,并进行傅里叶变换。然后将零频分量移到图像中心,再进行反傅里叶变换,最后计算幅值并显示结果。

希望这个示例对您有所帮助。