【VC++、OpenCV3.4】图像模糊

OpenCV中Smooth和Blur是图像处理中最简单和常用的操作之一。使用该操作的原因之一就是给图像预处理时候降低噪声。

噪声的相关介绍:常见噪声和滤波

使用Smooth和Blur操作背后是数学的卷积计算【VC++、OpenCV3.4】图像模糊,k和l是窗口的长和宽。通常这些卷积算子都是线性操作,所以又叫线性滤波。

1、均值滤波

【VC++、OpenCV3.4】图像模糊

相关API:

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

2、高斯滤波

【VC++、OpenCV3.4】图像模糊

高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,人们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。与此相关的有Gauss-Laplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分。

相关API:

CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

 

【VC++、OpenCV3.4】图像模糊3、中值滤波medianBlur()

CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );

中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。

ksize大小必须是大于1,而且是基数。

4、双边滤波

概念原理相关见此处:双边滤波

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

双边滤波原理示意:

                                      【VC++、OpenCV3.4】图像模糊

公式就省略了。

双边滤波可以去掉微小的差异。如对人脸做做边缘保留。

相关API:

/*
@param src Source 8-bit or floating-point, 1-channel or 3-channel image.
@param dst Destination image of the same size and type as src .
@param d Diameter of each pixel neighborhood that is used during filtering. If it is non-positive,
it is computed from sigmaSpace.
@param sigmaColor Filter sigma in the color space. A larger value of the parameter means that
farther colors within the pixel neighborhood (see sigmaSpace) will be mixed together, resulting
in larger areas of semi-equal color.
@param sigmaSpace Filter sigma in the coordinate space. A larger value of the parameter means that
farther pixels will influence each other as long as their colors are close enough (see sigmaColor
). When d\>0, it specifies the neighborhood size regardless of sigmaSpace. Otherwise, d is
proportional to sigmaSpace.
@param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes
*/
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

 

  • 第一个参数,InputArray类型的src,输入图像,即源图像,需要为8位或者浮点型单通道、三通道的图像。
  • 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的d,表示在过滤过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来。
  • 第四个参数,double类型的sigmaColor,颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • 第五个参数,double类型的sigmaSpace坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。
  • 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。



作者:一个三要不起
链接:https://www.jianshu.com/p/8d11e26c9665
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

各自的作用:均值滤波无法克服边缘像素信息的丢失缺陷,因为均值滤波基于平均权重;高斯模糊部分克服了该权限,但始终无法避免,因为没有考虑像素值的不同;而高斯双边模糊是保留边缘信息的滤波方法,避免了边缘信息的丢失,保留了轮廓不变。

【VC++、OpenCV3.4】图像模糊

【VC++、OpenCV3.4】图像模糊

对比高斯模糊,双边的轮廓信息还保留着。

高斯双边处理之后还可以做一个对比度增强。

【VC++、OpenCV3.4】图像模糊

看上去效果还是不错的。正面照的话可以美颜了。

【VC++、OpenCV3.4】图像模糊

请不要在意照片,这时以前爬虫留下的。