# 🧹 去除週期性雜訊(Removal of Periodic Noise) --- ## 📘 1. 題目說明 本實驗旨在利用數位影像處理技術去除圖像中的 **週期性雜訊**,以提升影像品質。 週期性雜訊在 **頻率域中表現為明顯的高頻成分**,透過傅立葉變換(Fourier Transform)將圖像由空間域轉換至頻域,並進行頻域濾波操作,有效抑制或消除這些雜訊頻率。 --- ## 🔁 2. 流程圖 ![圖片2](https://hackmd.io/_uploads/Byt93jj01g.png) --- ## 💻 程式邏輯說明 ### 🔧 預處理與傅立葉變換 1. **建立複數矩陣 `X`**: - 實部:原圖像像素值 - 虛部:設為 0 2. **執行傅立葉變換**: - 使用 FFT 將 `X` 轉換為頻域表示 3. **頻域位移**: - 將低頻移至頻譜中心,便於分析與過濾 4. **產生頻譜圖(Log Scale)**: ```c r[i][j] = (int)(log(1000 + sqrt(pow(fft[i][j][0], 2) + pow(fft[i][j][1], 2)))); ```cpp= #include <stdio.h> #include <stdlib.h> #include <math.h> #include "FFT1.C" #include "FFT2.C" #include "bmp.h" int R[MaxBMPSizeX][MaxBMPSizeY]; int r[MaxBMPSizeX][MaxBMPSizeY]; float X[2 * MaxBMPSizeX * MaxBMPSizeY]; // 用於FFT的數據 double fft[MaxBMPSizeX][MaxBMPSizeY][2] = {}; // 用於存放頻譜數據 int main() { int width, height; int i, j, y, z; open_bmp("periodic_noise2.bmp", R, R, R, width, height); // 建立一個矩陣,實部虛部交錯放 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { X[(i * width + j) * 2] = R[i][j]; // 實部存放像素值 X[(i * width + j) * 2 + 1] = 0; // 虛部存放0 } } // 執行傅立葉變換 fft2(X, width, 1); // 頻域位移 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { int new_i = (i + width / 2) % width; int new_j = (j + height / 2) % height; fft[new_i][new_j][0] = X[(i * width + j) * 2]; fft[new_i][new_j][1] = X[(i * width + j) * 2 + 1]; } } // 計算對數的頻譜圖像 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { r[i][j] = (int)(log(1000 + sqrt(pow(fft[i][j][0], 2) + pow(fft[i][j][1], 2)))); if (r[i][j] > 255) r[i][j] = 255; } } ``` --- ## 🔧 頻譜過濾與影像還原完整流程(A~D) A.頻譜過濾:掃描頻譜中數值為 14 的點,針對其周圍 3x3 區域進行抑制。中心點設為 0,斜對角乘以 0.8,其他方向乘以 0.5,達到特定頻率的削弱目的。 B.反向頻域位移:將頻譜從中心移回四角,為反傅立葉變換作準備。 C.執行反變換:使用 ifft2 將頻域資料轉回空間域。 D.儲存影像:提取反變換結果的實部,寫入影像矩陣 r,並存為 BMP 檔案。 ```cpp= // 計算對數的頻譜圖像 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { r[i][j] = (int)(log(1000 + sqrt(pow(fft[i][j][0], 2) + pow(fft[i][j][1], 2)))); if (r[i][j] > 255) r[i][j] = 255; } } // 頻譜過濾 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { if (r[i][j] == 14) { for (y = -1; y <= 1; y++) { for (z = -1; z <= 1; z++) { int ii = (i + y + width) % width; int jj = (j + z + height) % height; if (abs(y) == abs(z) && y != 0) { fft[ii][jj][0] *= 0.8; fft[ii][jj][1] *= 0.8; } else if (abs(y) != abs(z)) { fft[ii][jj][0] *= 0.5; fft[ii][jj][1] *= 0.5; } else if (abs(y) == abs(z) && y == 0) { fft[ii][jj][0] = 0; fft[ii][jj][1] = 0; } } } } } } // 反向頻域位移 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { int new_i = (i + width / 2) % width; int new_j = (j + height / 2) % height; X[(new_i * width + new_j) * 2] = fft[i][j][0]; X[(new_i * width + new_j) * 2 + 1] = fft[i][j][1]; } } // 執行傅立葉反變換 fft2(X, width, -1); // 將反變換後的值存入影像矩陣保存 for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { r[i][j] = (int)X[(i * width + j) * 2]; } } // 保存處理結果至新的圖檔中 save_bmp("new.bmp", r, r, r, width, height); printf("Job Finished!\n"); // 關閉 bmp 影像檔 close_bmp(); return 0; } ``` ## ✅ 3. 實驗結果與分析 ### 🖼️ 原圖 vs 2D-FFT | 原始圖像 | 2D-FFT | |----------|----------------------| |![圖片3](https://hackmd.io/_uploads/H1XNQ2sR1x.jpg) | ![圖片4](https://hackmd.io/_uploads/rkAOQhoRke.jpg) --- ### 🖼️ 原圖 vs 結果圖 | 原始圖像 | 去除週期性雜訊後影像 | |----------|----------------------| |![圖片3](https://hackmd.io/_uploads/H1XNQ2sR1x.jpg) | ![圖片5](https://hackmd.io/_uploads/SyE77hoA1e.jpg) > 📌(請依需要替換圖片網址為實驗圖片) --- ### 📊 分析說明 在這個實驗中,我們運用了傅立葉變換技術對影像進行週期性雜訊的去除處理,整體流程包含: 1. **轉換至頻率域**: - 觀察原始影像中的週期性雜訊 - 將影像透過 2D 傅立葉轉換(FFT)轉換為頻譜圖 2. **頻域過濾處理**: - 針對頻譜中週期性雜訊的高頻能量點進行調整或抑制 - 採用 3×3 區域式差異性抑制策略,有效降低干擾成分 3. **反轉換回空間域**: - 將處理後的頻譜進行反傅立葉轉換 - 得到一張去除週期性雜訊後的新影像 --- ### 💡 結論 - 在頻域中,週期性雜訊通常呈現為對稱或集中的高頻點 - 經過針對性的濾波設計,可有效消除此類雜訊,而不影響圖像主體 - 處理後的圖像保留了原有結構與細節,整體品質與觀感均有明顯提升 --- ### 🧪 實驗成果與應用 透過本實驗,我們掌握了從頻域角度出發進行圖像處理的方法,並學會設計合適的頻域濾波器。此技術可廣泛應用於: - 工業檢測影像清理 - 拍攝干擾條紋消除 - 醫學影像紋理清除 - 傳真/掃描文件紋理修復 ---