空間濾波-低通濾波器(Low-Pass Filter)

低通濾波器
可以拿來消除影像上的雜訊

低通濾波器

可以拿來消除影像上的雜訊

 

 

低通濾波器故名思義,

就是讓低頻的部份通過,

衰減高頻的部份,

通常是用在頻率域上,

那用在影像(空間域)上是怎麼一回事呢?

讓我們先看看下面的剖面圖

 

頻率濾波器剖面圖

 

低通 高通

 

相對應的空間域濾波器

 

低通 高通

 

從上面的剖面圖我們可以看出來,

低通濾波器在空間域中相當於做平滑濾波,

可以想像成將鄰近的像素點的梯度降低,

所以影像上低通濾波具有影像模糊的效果,

原圖 低通 低通(10次)

 

實作上我們常用遮罩來實作

最常使用的為3*3遮罩

m0 m1 m2
m3 m4 m5
m6 m7 m8

遮罩係數如下

1/9 x
1 1 1
1 1 1
1 1 1

 

實作程式碼如下

 


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 或其它係數。

 

新手發文如有錯誤,煩請指正!