在频域图像处理中,交换四个象限实现FFT移位(也称为FFT Shift)是一种将频域图像的低频成分移动到中心的标准化操作。
1. 为什么需要FFT移位?
-
原始FFT输出特性:
二维FFT的直接计算结果中:-
低频分量(图像的整体亮度和平滑部分)位于频谱图的四个角落
-
高频分量(边缘、细节和噪声)集中在频谱图的中心区域
-
-
可视化需求:
人类更习惯观察低频在中心、高频在外围的频谱图(类似"靶心"的分布)。
2. 四象限交换的原理
假设频谱图像被划分为四个象限(以图像中心为原点):
左上半区(q0) | 右上半区(q1)------------|------------左下半区(q2) | 右下半区(q3)
通过交换对角象限:
-
q0(左上) ↔ q3(右下)
-
q1(右上) ↔ q2(左下)
最终效果是将四个角落的低频成分移动到中心,高频成分移动到外围。
3. 代码实现步骤(OpenCV示例)
int cx = spectrum.cols / 2; // 中心x坐标
int cy = spectrum.rows / 2; // 中心y坐标// 定义四个象限的ROI(感兴趣区域)
cv::Mat q0(spectrum, cv::Rect(0, 0, cx, cy)); // 左上
cv::Mat q1(spectrum, cv::Rect(cx, 0, cx, cy)); // 右上
cv::Mat q2(spectrum, cv::Rect(0, cy, cx, cy)); // 左下
cv::Mat q3(spectrum, 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); // 原右上 → 左下
4. 可视化对比
操作前(原始FFT输出) | 操作后(FFT Shift后) |
---|---|
![]() | ![]() |
低频 |