Gaussian Filter ใช้กันอย่างกว้างขวางใน image processing เพื่อลด noise (blurring) โดยใช้ 2D Gaussian Kernel ที่คำนวณจาก Gaussian Distribution:
$$G(x,y)= \frac{1}{2\pi\sigma^{2}}e^{-\frac{x^{2}+y^{2}}{2\sigma^{2}}}$$
ตัวอย่างการสร้าง 5x5 Kernel (σ = 1.0)
#include <cmath>
#include <iomanip>
#include <iostream>
#define PI 3.1415
using namespace std;
void calc_filter(double kernel[][5]) {
double sigma = 1.0;
double q = 2.0 * sigma * sigma;
double sum = 0.0;
for (int x = -2; x <= 2; x++) {
for (int y = -2; y <= 2; y++) {
double p = sqrt(x * x + y * y);
kernel[x + 2][y + 2] = (exp(-(p * p) / q)) / (PI * q);
sum += kernel[x + 2][y + 2];
}
}
// Normalize ให้ผลรวม = 1
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
kernel[i][j] /= sum;
}
int main() {
double kernel[5][5];
calc_filter(kernel);
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j)
cout << kernel[i][j] << " ";
cout << endl;
}
}
เอาต์พุท (Normalized 5x5 Kernel)
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902 0.0133062 0.0596343 0.0983203 0.0596343 0.0133062 0.0219382 0.0983203 0.162103 0.0983203 0.0219382 0.0133062 0.0596343 0.0983203 0.0596343 0.0133062 0.00296902 0.0133062 0.0219382 0.0133062 0.00296902
จุดสำคัญ
- Kernel เป็น symmetric ตรงกลางค่าสูงสุด
- ต้อง normalize ให้ผลรวม = 1 เพื่อไม่เปลี่ยน brightness ของภาพ
- σ (sigma) ควบคุมความกว้างของ bell curve: σ มาก = blur มาก
- ขนาด kernel ปกติใช้ 3x3, 5x5, 7x7 (ประมาณ 6σ)