空域滤波按照对像素的操作方法,可以分为两类:线性滤波(低通、高通、带通)和非线性滤波(最大值、最小值、中值)
按照图像处理的效果,可以分为平滑滤波和锐化滤波。
“线性滤波”这个概念其实是从信号与系统里面借用过来的。输入信号通过一个线性系统时,输出的结果是输入信号与系统时域冲击响应的卷积。而在图像处理中,则使用模板对像素(及其周围像素)进行线型加权运算,权值取决于模板的像素值。运算方法与卷积类似,所以就称为滤波了。非线性滤波自然进行不是线性运算了。
由于没有贴公式,所以可能大家对文字的解释不是很理解,不行还是看书吧。这里主要想说明这些滤波的特点以及程序是如何实现的:
今天先从最简单的均值滤波器开始:
//源图像
Mat scr = imread("D:/picture/img.tif");
//结果图像
Mat rst;
rst.create(scr.rows,scr.cols,scr.type());
imshow("原图像",scr);
//均值滤波函数:就使用模板里面所有像素的平均值来代替锚点的像素值
blur(scr,rst,Size(5,5));
imshow("平滑滤波结果",rst);
结果如图:
当把模板换成10*10时
明显,模板越大,图像越模糊。所以如果你使用滤波器的目的是去除噪音,那么同时也会平滑图像的细节。
当然你也可用使用filter2D函数来实现同样的操作:
//调用滤波函数来完成图像的锐化
//滤波器的核
Mat kernel = Mat::ones( 5, 5, CV_32F )/ (float)(5*5);
//调用滤波函数
filter2D(scr,rst,scr.depth(),kernel);