opencv gaosimohu opencv高斯模糊_opencv gaosimohu

1. 模糊原理

我们都知道,彩色图像是一个三通道的RGB图像,R,G,B分别有0-255这么一个取值区间,现在我们仅仅就一个通道进行说明,可以进行类推。

  • 我们来看看图像模糊是什么一个概念,首先,图像中的像素每一个都有自己的像素值,这些像素值决定了图像最终的显示。来想象一幅模糊的图,是不是感觉越模糊,这些像素点之间的差别就越小呢?确实是这样,这也是图像模糊的原理,也就是一种像素的平滑化,通过对图像中的像素值进行平均处理,让这些像素值越来越来接近,来达到一种人尽量无法辨识出这些像素点的差别,从来产生模糊的效果。
  • 原理就是如此,从原理上,我们还可以得到一个启示,那就是对于取均值的半径大小越大,那么整个模糊效果也就越好,很好理解,因为取的范围越大,意味着相似的像素点越多,达到的模糊效果也就越好了。

那么具体有什么方法去取均值呢?

  • 最简单的方法就是直接取所需处理像素值的周边半径内平均来作为它自身的像素信息,对图像内所有像素点都可以这么处理,另外边界点需要另外找处理方法。
  • 还可以采取正态分布取权值的做法来取平均值,因为实际上围绕一个特定的像素点,离它越远,和它的相似度就越低,对它们处理的权重也应该越低,而正态分布恰好是一个山型函数可以围绕着这一个特定的像素点取半径进行处理。

然而实际情况下,正态分布虽说有理有据,但是效率不是很高,所以可以取多次周边平均的方法来增加模糊效果。


  • 模糊作用
    模糊操作时图像处理中最简单和常用的操作之一,该使用的操作之一为了给图像预处理时减低噪声



opencv gaosimohu opencv高斯模糊_opencv gaosimohu

2. 图像高斯模糊

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛用于图像处理的减噪过程。

通俗的说,高斯滤波就是对整幅图像加权平均的过程,每一个像素点的值,都由其本身和领域内的其他像素值经过加权平均后得到。

高斯滤波的具体操作是:用一个模板(卷积或掩模)扫描图像中每一个像素,用模板确定的邻域内像素的加权平均灰度值去代替模板中心像素点的值。

opencv gaosimohu opencv高斯模糊_opencv gaosimohu

3. 正态分布

在正态分布中,越接近中心点,取值越大,越远离中心,取值越小。

计算平均值的时候,我们只需要将“中心点”作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。正态分布显然是一种可取的权重分配模式。

opencv gaosimohu opencv高斯模糊_权重_04


opencv gaosimohu opencv高斯模糊_opencv gaosimohu

4. 高斯函数

通过高斯函数反映出正态分布。正态分布的密度函数叫做“高斯函数”。

由于图像是二维的,所以需要二维的正态分布。

一维高斯函数:

opencv gaosimohu opencv高斯模糊_正态分布_06


其中μ是x的均值,σ是x的方差。因为计算平均值的时候,中心点就是原点,所以μ等于0。


opencv gaosimohu opencv高斯模糊_高斯模糊_07


一维图像


opencv gaosimohu opencv高斯模糊_正态分布_08

二维高斯函数:

opencv gaosimohu opencv高斯模糊_正态分布_09


opencv gaosimohu opencv高斯模糊_权重_10

opencv gaosimohu opencv高斯模糊_opencv gaosimohu

5. 利用高斯函数求权重矩阵

  • 5.1 获取权重矩阵
    假设中心点的坐标是(0,0),那么距离它最近的8个点的坐标如下:
  • opencv gaosimohu opencv高斯模糊_权重_12

  • 为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:
  • opencv gaosimohu opencv高斯模糊_正态分布_13

  • 归一化: 这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。
    >目的是让滤镜的权重总值等于1。否则的话,使用总值大于1的滤镜会让图像偏亮,小于1的滤镜会让图像偏暗。
    最终取得的权重矩阵:
  • opencv gaosimohu opencv高斯模糊_权重_14

  • 5.2. 计算矩阵模糊值
    假色原矩阵中其中9个像素点灰度值取值如下:
  • opencv gaosimohu opencv高斯模糊_权重_15

  • 则每个点乘以对应的权重值:
  • opencv gaosimohu opencv高斯模糊_像素点_16

  • 将这9个值加起来,就是中心点的高斯模糊的值。
    对所有点重复这个过程,就得到了高斯模糊后的图像。对于彩色图片来说,则需要对RGB三个通道分别做高斯模糊。

opencv gaosimohu opencv高斯模糊_opencv gaosimohu

6. OpenCV中的高斯模糊

  • 函数说明
    该函数将源图像与指定的高斯内核进行卷积。
  • 函数声明
void GaussianBlur( 
                   InputArray src,
                   OutputArray dst, 
                   Size ksize,
                   double sigmaX, 
                   double sigmaY = 0,
                   int borderType = BORDER_DEFAULT 
                );
  • 函数参数

src

输入图像,图像可以具有任意数量的通道,这些通道可以单独处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

dst

输出与src大小和类型相同的图像。

ksize

高斯核大小。ksize.width和ksize.height可以不同,但是它们都必须为正数和奇数。或者,它们可以为零,然后根据sigma计算得出。

sigmaX

X方向上的高斯核标准差。

sigmaY

Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果sigmas为零,如果sigmaX和sigmaY都为零,则分别从ksize.width和ksize.height计算得出(有关详细信息,参见getGaussianKernel);为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

borderType

像素推导方法。

  • 举例应用
Mat src = imread("D:/test/rr1.jpg");
imshow("src", src);

//设置高斯卷积核半径
Mat dst,dst2;
GaussianBlur(src, dst, Size(3, 3), 3, 3);
GaussianBlur(src, dst2, Size(7, 7), 7, 7);

imshow("dst", dst);
imshow("dst_7", dst2);
waitKey(0);

opencv gaosimohu opencv高斯模糊_权重_18

opencv gaosimohu opencv高斯模糊_高斯模糊_19

opencv gaosimohu opencv高斯模糊_权重_20


由上面事例可以看出,由于卷积核的半径不同,图像模糊的结果也不同。半径越大,图像越模糊。

opencv gaosimohu opencv高斯模糊_正态分布_21


学习:

OpenCv–图像模糊处理(均值,高斯,中值,双边)图像高斯模糊和均值模糊高斯模糊与图像卷积滤波一些知识点