Qt+opencv图像线性滤波之方框滤波、均值滤波、高斯滤波

图像方框滤波、均值滤波、高斯滤波

图像滤波概念

由于成像系统、传输介质和记录设备等的不完善,数字图像在其形成、传输记录过程中往往会受到多种噪声的污染。
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
线性滤波有方框滤波、均值滤波、高斯滤波这几种,常用的线性滤波器有:

1.低通滤波器:允许低频率通过
2.高通滤波器:允许高频率通过
3.带通滤波器:允许一定范围频率通过
4.带阻滤波器:阻止一定范围频率通过并允许其他频率通过
5.全通滤波器:允许所有频率通过,仅改变相位
6.陷波滤波器:阻止一个狭窄频率范围通过

图像模糊概念:一般来说低通就是模糊,高通就是锐化。
领域算子(局部算子)是利用给定像素周围的像素值,决定此像素的最终输出值的一种算子。线性领域滤波是一种常用的领域算子。像素的输出值取决于输入像素的加权和。
在这里插入图片描述
h(k, l)称为内核,是滤波器的加权系数。

均值滤波

void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
参数说明:
src 输入图像
dst 输出图像
ksize 内核大小
anchor 锚点(被平滑的点); 默认 Point(-1,-1) 表示取内核中心点为锚点。
borderType :用于推断图像外部的某种边界模式

均值滤波输出的每一个像素是核窗口输入像素的平均值(所有像素加权系数相等),相当于归一化的方框滤波。均值滤波本身也有缺点,没那就是不能好好保护图像细节,在图像去噪的同时也破坏 了图像的细节部分,从而使图像变模糊,不能很好的去除噪声点。

内核如下:
在这里插入图片描述
测试效果:
在这里插入图片描述

方框滤波

void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT );

参数说明:
src 输入图像
dst 输出图像
ddepth 输出图像深度
ksize 内核大小
anchor 锚点(被平滑的点); 默认 Point(-1,-1) 表示取内核中心点为锚点。
normalize :默认为true。
borderType :用于推断图像外部的某种边界模式

方框滤波用的核如下:
在这里插入图片描述
当normalize 为true时,方框滤波归一化处理,其效果跟均值滤波一样。
当normalize 为false时,用于计算每个像素领域的积分特性。
上代码:

void PhotoBlur::cvHomogeneousBlur(int k_size)
{
    
    
    Mat srcImage = imread("F:/work/opencv/photoblur/add.jpg");
    /* void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );
    */
    Mat dstImage = srcImage.clone();
    boxFilter(srcImage,dstImage,-1,Size(k_size,k_size),Point(-1,-1),true);
    bgrMat2Image(dstImage);
}

当normalize 为true时,方框滤波归一化时效果:
在这里插入图片描述
当normalize 为false时,即:boxFilter(srcImage,dstImage,-1,Size(k_size,k_size),Point(-1,-1),false);
效果如下:

在这里插入图片描述

高斯滤波

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
参数说明:
src 输入图像
dst 输出图像
ksize 内核大小,需要是基数
sigmaX 高斯核函数在X方向的偏差
sigmaY 高斯核函数在Y方向的偏差,若为0,则设为sigmaX。如果sigmaX和sigmaY都为0,那么就由ksize.width 和 ksize.height计算出来
borderType :用于推断图像外部的某种边界模式

高斯滤波可能是最有用的过滤器(虽然不是最快的)。高斯滤波是通过将输入数组中的每个点与高斯核进行卷积来完成的,然后将它们相加以产生输出数组。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素的点值,都由其本身和领域内的其他像素值经过加权平均后得到。

一维零均值高斯函数:

G(x)=exp(-x2/2sigma2),sigma决定了高斯函数的高度。

二维高斯函数:
在这里插入图片描述
测试效果:
在这里插入图片描述

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正

猜你喜欢

转载自blog.csdn.net/haohaohaihuai/article/details/106279456