低通濾波器
可以拿來消除影像上的雜訊
低通濾波器
可以拿來消除影像上的雜訊
低通濾波器故名思義,
就是讓低頻的部份通過,
衰減高頻的部份,
通常是用在頻率域上,
那用在影像(空間域)上是怎麼一回事呢?
讓我們先看看下面的剖面圖
頻率濾波器剖面圖
低通 | 高通 |
相對應的空間域濾波器
低通 | 高通 |
從上面的剖面圖我們可以看出來,
低通濾波器在空間域中相當於做平滑濾波,
可以想像成將鄰近的像素點的梯度降低,
所以影像上低通濾波具有影像模糊的效果,
原圖 | 低通 | 低通(10次) |
實作上我們常用遮罩來實作
最常使用的為3*3遮罩
m0 | m1 | m2 |
m3 | m4 | m5 |
m6 | m7 | m8 |
遮罩係數如下
1/9 | x |
|
實作程式碼如下
IplImage* image1;
IplImage* image2;
for (int x = 1; x < image1->width - 1; x++)
{
for (int y = 1; y < image1->height - 1; y++)
{
int value = 0;
/* 取得遮罩資訊 */
int m[9];
m[0] = (unsigned char) image1->imageData[(y - 1) * image1->widthStep + (x - 1)];
m[1] = (unsigned char) image1->imageData[(y - 1) * image1->widthStep + (x + 0)];
m[2] = (unsigned char) image1->imageData[(y - 1) * image1->widthStep + (x + 1)];
m[3] = (unsigned char) image1->imageData[(y + 0) * image1->widthStep + (x - 1)];
m[4] = (unsigned char) image1->imageData[(y + 0) * image1->widthStep + (x + 0)];
m[5] = (unsigned char) image1->imageData[(y + 0) * image1->widthStep + (x + 1)];
m[6] = (unsigned char) image1->imageData[(y + 1) * image1->widthStep + (x - 1)];
m[7] = (unsigned char) image1->imageData[(y + 1) * image1->widthStep + (x + 0)];
m[8] = (unsigned char) image1->imageData[(y + 1) * image1->widthStep + (x + 1)];
for (int i = 0; i < 9; i++)
{
value += m[i];
}
value /= 9;
image2->imageData[y * image1->widthStep + x] = value;
}
}
當然也可以換成5*5或是其它大小的遮罩,
只是相對的係數需要調整成* 1/25 或其它係數。
新手發文如有錯誤,煩請指正!