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);
在这个示例中,首先将图像转换为复数形式,并进行傅里叶变换。然后将零频分量移到图像中心,再进行反傅里叶变换,最后计算幅值并显示结果。
希望这个示例对您有所帮助。
推荐阅读
-
转化图像为YUV420 I420格式:利用OpenCV处理
-
【OpenCV】探索YUV颜色空间:YUV420sp转为RGB
-
分析Opencv中BGR、YUV、YUV_I420和NV12颜色空间
-
Opencv实现yuv420P格式的读取
-
C++实现:视频教程演示YUV420与RGB相互转换(第二部分)
-
OpenCV-based Object Tracking in C++/Python (使用C++/Python进行基于OpenCV的目标追踪)
-
使用OpenCV扩展模块中的TrackerKCF实现视频中的单一目标跟踪
-
使用OpenCV进行单目标跟踪
-
win10 下的opencv3.2.0实现tracker常见问题----必要条件整理
-
[OpenCV实战]14 使用OpenCV实现单目标跟踪