# 🧹 去除週期性雜訊(Removal of Periodic Noise)
---
## 📘 1. 題目說明
本實驗旨在利用數位影像處理技術去除圖像中的 **週期性雜訊**,以提升影像品質。
週期性雜訊在 **頻率域中表現為明顯的高頻成分**,透過傅立葉變換(Fourier Transform)將圖像由空間域轉換至頻域,並進行頻域濾波操作,有效抑制或消除這些雜訊頻率。
---
## 🔁 2. 流程圖

---
## 💻 程式邏輯說明
### 🔧 預處理與傅立葉變換
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 |
|----------|----------------------|
| | 
---
### 🖼️ 原圖 vs 結果圖
| 原始圖像 | 去除週期性雜訊後影像 |
|----------|----------------------|
| | 
> 📌(請依需要替換圖片網址為實驗圖片)
---
### 📊 分析說明
在這個實驗中,我們運用了傅立葉變換技術對影像進行週期性雜訊的去除處理,整體流程包含:
1. **轉換至頻率域**:
- 觀察原始影像中的週期性雜訊
- 將影像透過 2D 傅立葉轉換(FFT)轉換為頻譜圖
2. **頻域過濾處理**:
- 針對頻譜中週期性雜訊的高頻能量點進行調整或抑制
- 採用 3×3 區域式差異性抑制策略,有效降低干擾成分
3. **反轉換回空間域**:
- 將處理後的頻譜進行反傅立葉轉換
- 得到一張去除週期性雜訊後的新影像
---
### 💡 結論
- 在頻域中,週期性雜訊通常呈現為對稱或集中的高頻點
- 經過針對性的濾波設計,可有效消除此類雜訊,而不影響圖像主體
- 處理後的圖像保留了原有結構與細節,整體品質與觀感均有明顯提升
---
### 🧪 實驗成果與應用
透過本實驗,我們掌握了從頻域角度出發進行圖像處理的方法,並學會設計合適的頻域濾波器。此技術可廣泛應用於:
- 工業檢測影像清理
- 拍攝干擾條紋消除
- 醫學影像紋理清除
- 傳真/掃描文件紋理修復
---