在頻域圖像處理中,交換四個象限實現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后) |
---|---|
![]() | ![]() |
低頻 |