在一幅图像中,高频部分是指图像中像素值落差很大的部分,低频部分是指像素值与旁边的像素值相差不大甚至相同,图像的一些细节部分往往由高频信息来展现,图像中掺杂的噪声往往也处于高频段,这就造成了一些细节信息被噪声淹没,图像滤波可以去除这些噪声。
图像滤波,是指在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制,所以,图像滤波的目的有两个,一个是抑制噪声,另一个是保留需要的细节特征。图像滤波是图像预处理中不可缺少的操作,滤波的好坏,直接影响后续图像处理算法的性能。
数字图像滤波器,就是一个对像素及其邻域(该像素周围一定范围的点)进行加权处理(卷积操作),加权处理后的值就是这一点新的像素值。如下图所示,3*3的核和左边浅蓝色的部分卷积,最后96的像素值变成新的92。
opencv中,有方框滤波,均值滤波,高斯滤波三种线性滤波,以及中值滤波和双边滤波这两种非线性滤波。
函数调用形式:
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
函数参数详解:
第一个参数:InputArray src
表示输入图像
第二个参数:OutputArray dst
表示输出图像
第三个参数:int ddepth
输出图像的深度
第四个参数:Point anchor=Point(-1,-1)
处理的像素点是卷积核的中心
第五个参数:boolnormalize=true
表示是不是进行归一化
第六个参数:int borderType=BORDER_DEFAULT
图像边界的处理方式
当阿尔法为1时,就是均值滤波。
int main()
{
Mat scrImage,dstImage;
scrImage = imread("F:\\数字图像处理\\直方图\\5.jpg",1);
imshow("原图", scrImage);
boxFilter(scrImage, dstImage, -1, Size(5, 5), Point(-1, -1), 1);
imshow("方框滤波后的图像",dstImage);
waitKey(0);
return 0;
}
此时归一化为1,相当于均值滤波,图像变的模糊。
当归一化参数为0是,核的每一个元素都为1,此时图片的每个像素的值经过卷积之后应该都变的很大,所以图片变的很亮。
均值滤波是典型的线性滤波算法,主要方法为邻域平均法,即用一片图像区域的各个像素的均值来代替原图像中的各个像素值。
一般需要在图像上对目标像素给出一个模板(内核),该模板包括了其周围的临近像素(比如以目标像素为中心的周围8(3x3-1)个像素,构成一个滤波模板,即去掉目标像素本身)。再用模板中的全体像素的平均值来代替原来像素值。
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
第一个参数,InputArray类型的src,输入图像,任意通道的Mat。
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数,Size类型的ksize,内核的大小。Size(3,3)表示3x3的核大小,Size(5,5)表示5x5的核大小
第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第五个参数,int类型的borderType,用于推断图像外部像素的边界模式。默认值BORDER_DEFAULT。
int main()
{
Mat scrImage, dstImage;
scrImage = imread("F:\\数字图像处理\\直方图\\5.jpg", 1);
imshow("原图", scrImage);
blur(scrImage, dstImage, Size(5, 5), Point(-1, -1));
imshow("方框滤波后的图像", dstImage);
waitKey(0);
return 0;
}
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,。
高斯滤波也是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
二维的高斯函数如下:
其中(x,y)(x,y)为点坐标,σ是标准差。
一个高斯滤波器的模板,需要对高斯函数进行离散化,得到的高斯函数值作为模板的系数。例如:要产生一个3×3的高斯滤波器模板,以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标,如下所示(x轴水平向右,y轴竖直向下)
这样,将各个位置的坐标带入到高斯函数中,得到的值就是模板的系数。
对于窗口模板的大小为 (2k+1)×(2k+1),模板中各个元素值的计算公式如下:
这样计算出来的模板有两种形式:小数和整数。
小数形式的模板,就是直接计算得到的值,没有经过任何的处理;
整数形式的,则需要进行归一化处理。
InputArray src
: 输入图像,任意通道的Mat。
OutputArray dst
: 输出图像,与输入图像有相同的类型和尺寸。
Size ksize
: 高斯内核大小,这个尺寸与前面两个滤波kernel尺寸不同,ksize.width和ksize.height可以不相同但是这两个值必须为正奇数,如果这两个值为0,他们的值将由sigma计算。
double sigmaX
: 高斯核函数在X方向上的标准偏差
double sigmaY
: 高斯核函数在Y方向上的标准偏差,如果sigmaY是0,则函数会自动将sigmaY的值设置为与sigmaX相同的值,如果sigmaX和sigmaY都是0,这两个值将由ksize.width和ksize.height计算而来。具体可以参考getGaussianKernel()
函数查看具体细节。
int borderType=BORDER_DEFAULT
: 推断图像外部像素的边界模式,有默认值BORDER_DEFAULT,如果没有特殊需要不用更改,具体可以参考borderInterpolate()
函数。
int main()
{
// 读取图像
Mat Image = imread("./image/2.png", 0);
imshow("Original Image", Image);
// 定义模糊核的大小
Size kernel_size(5, 5);
// 使用cv::GaussianBlur()函数进行高斯模糊
GaussianBlur(Image.clone(), Image, kernel_size, 0);
// 显示原始图像和模糊后的图像
imshow("GaussianBlur Image", Image);
waitKey(0);
return 0;
}