一、平滑处理
平滑处理也被称为“模糊处理”,常用来减少图像上的噪声或者失真,最重要的是降低图像分辨率。
平滑操作的各种类型包括线性领域滤波和非线性领域滤波,其中,线性的包括“方框滤波”,“均值滤波”,“高斯滤波”。非线性的包括“中值滤波”,“双边滤波”。
线性滤波主要有:
1.允许低频率通过的低通滤波;
2.允许搞频率通过的高通滤波;
3.允许一定范围频率通过的带通滤波;
4.阻止一定频率通过的带阻滤波;
5.仅仅改变相位关系的全通滤波;
6.阻止一个狭窄频率范围通过的特殊带阻滤波;
opencv五种常用平滑处理函数:
方框滤波------boxFilter
均值滤波------blur
高斯滤波------GaussianBlur
中值滤波------medianBlur
双边滤波------bilateralFilter
左边图和中间图进行卷积得到右边的图。线性滤波输出像素g(i,j)是输入像素f(i+k,j+l)的加权和:
1.方框滤波(boxFilter)
方框滤波所用到的核:
void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor=Point(-1,-1),
boolnormalize=true,
int borderType=BORDER_DEFAULT )
参数1:输入图像。
参数2:输出图像。
参数3:输出图像的深度,-1代表原图深度,即src.depth()。
参数4:核的大小,一般表示为Size(5,5)。
参数5:锚点,即被平滑的点,负值代表核中心,默认Point(-1,-1)。
参数6:一个标识符,表示是否被其区域归一化,默认为ture。
参数7:边界类型,有默认值BORDER_DEFAULT。
//载入原图
Mat image=imread("1.jpg");
//进行滤波操作
Mat out;
boxFilter(image, out, -1,Size(5, 5));
2.均值滤波(blur)
均值滤波即为归一化的方框滤波。缺点是容易破坏图像部分细节。
void blur(
InputArray src,
OutputArraydst,
Size ksize,
Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT )
参数1:输入图像。
参数2:输出图像。
参数3:核大小。
参数4:锚点。
参数5:边界类型。
//载入原图
Mat image=imread("1.jpg");
//进行滤波操作
Mat out;
blur(image, out, Size(7, 7));
3.高斯滤波(GaussianBlur)
高斯滤波适用于消除高斯噪声,就是对整幅图像进行加权平均的过程。其具体操作就是:用一个模板对图像进行卷积操作,用模板确定的邻域内像素的加权平均值去代替模板中心的像素点的值。高斯模糊对于图像来说就是一个低通滤波操作。
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。一维零均值高斯函数为:
参数sigma决定了高斯函数的高度。对于图像处理来说,常用二维的高斯函数作为平滑滤波器。二维高斯函数为:
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY=0,
intborderType=BORDER_DEFAULT )
参数1:输入图像。
参数2:输出图像。
参数3:核大小。
参数4:高斯核函数在X方向的标准偏差。
参数5:高斯核函数在Y方向的标准偏差。若sigmaY=0,sigmaY=sigmaX;若sigmaX=0,那么由ksize.width和ksize.height计算出来。
参数6:边界类型。
//载入原图
Mat image=imread("1.jpg");
//进行滤波操作
Mat out;
GaussianBlur( image, out, Size( 5, 5 ), 0, 0 );
4.中值滤波(medianBlur)
中值滤波的基本思想:用像素点领域灰度值的中值来代替该像素点的灰度值,用于去除脉冲噪声和椒盐噪声,同时能保留图像边缘细节。因为像素点的值被其领域的中值代替,从而消除了孤立的噪声点。中值滤波克服了如最小均方滤波、方框滤波、均值滤波等带来的图像细节模糊,常用于保护边缘信息。
中值滤波对比均值滤波优势:由于在均值滤波中,噪声成分也会被计算,所以输出也受到了噪声的影响,而在中值滤波中噪声很难被选上。劣势:中值滤波的时间花费是均值滤波的5倍以上。
void medianBlur(
InputArray src,
OutputArray dst,
int ksize)
参数1:输入图像。
参数2:输出图像。
参数3:领域大小,为大于1的奇数。
//载入原图 Mat image=imread("1.jpg"); //进行滤波操作 Mat out; medianBlur( image, out, 5);
5.双边滤波(bilateralFilter)
双边滤波是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空滤信息和灰度相似性,达到保边去噪的目的,好处就是可以边缘保存。双边滤波比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以离得比较远的像素不会太多影响到边缘。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声不能够很好的过滤掉,只能对低频进行较好的滤波。
其中,
而加权系数W(i,j,k,l)取决于定义域核和值域核的乘积。
定义域的核和滤波对应图为:
值域的核和滤波对应图为:
两者相乘为双边滤波的权重函数:
void bilateralFilter(
InputArray src,
OutputArraydst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType=BORDER_DEFAULT)
参数1:输入图像。
参数2:输出图像。
参数3:在过滤过程中每个像素邻域的直径。若为非正数,则用参数5sigmaSpace计算出来。
参数4:颜色空间滤波器的sigma值,这个值越大,像素邻域内更宽广的颜色会被混合在一起,产生较大的半相等颜色区域。
参数5:坐标空间滤波器的sigma值,这个值越大,越远的像素会互相影响,从而使更大的区域足够相似的颜色获取相同的颜色。若d<0,d正比于sigmaSpace值。
参数6:边界类型。
//载入原图
Mat image=imread("1.jpg");
//进行滤波操作
Mat out;
bilateralFilter( image, out, 25, 25*2, 25/2 );
特别说明:本文为本人学习opencv所做笔记。具体参照:http://blog.youkuaiyun.com/column/details/opencv-tutorial.html