图像模糊


注:原创不易,转载请务必注明原作者和出处,感谢支持!

一 什么是图像模糊

图像模糊是图像处理中最简单和常用的操作之一,其主要目的之一是给图像预处理的时候降低图像噪声。比如,在大目标提取之前去除图像中的一些琐碎细节。图像的模糊通常依靠图像的卷积操作来实现。图像模糊又被称为平滑滤波。

常见的图像模糊方法可以总结如下:
(1) 归一化均值滤波器(API为blur()
(2) 高斯滤波器(API为GaussianBlur()
(3) 中值滤波器(API为medianBlur()
(4) 双边滤波器(API为bilateralFilter()


二 图像模糊原理与实现

归一化均值滤波
归一化均值滤波是最简单的滤波器,输出像素值是对应核窗口内像素的均值(所有像素加权系数相等,当然也可以是不相等的)。该滤波器的核如下所示:

\[K=\frac{1}{K_{width} \cdot K_{height}} \begin{bmatrix} 1&1&1&...&1\\ 1&1&1&...&1\\ .&.&.&...&1\\ .&.&.&...&1\\ 1&1&1&...&1\\ \end{bmatrix} \]

OpenCV提供了归一化均值滤波器API为blur()

void cv::blur(
	InputArray src,					// 原图像
    OutputArray dst,				// 滤波后图像
    Size ksize,						// 滤波器大小
    Point anchor = Point(-1, -1),	// 锚点位置,默认为卷积核的中心
    int borderType = BORDER_DEFAULT
);

下面是原图和滤波器大小分别为3x3、7x7和11x11时的滤波效果

高斯滤波
二维高斯函数的公式为:

\[G(x,y) = Ae^{\frac{-(x-u_x)^2}{2\sigma_x^2} + \frac{-(y-u_y)^2}{2\sigma_y^2}} \]

和一维高斯函数一样,中间像素\((x,y)\)的值是最大的,周边像素的加权系数随着它们远离中间像素的距离增大而减小。

OpenCV中的高斯滤波器API的详细信息如下:

void cv::GaussianBlur(
	InputArray src,						// 输入图像
    OutputArray dst,					// 输出图像
    Size ksize,							// 滤波器大小
    double sigmaX,						// 对应公式中的sigma X
    double sigmaY = 0,					// 对应公式中的sigma Y
    int borderType = BORDER_DEFAULT
);

下面是原图和滤波器大小分别为3x3、7x7和11x11时的滤波效果(其中sigmaX和sigmaY均为5)

中值滤波
中值滤波原理比较简单,其是将图像中的每个像素用领域像素中的中值来代替。中值滤波对椒盐噪声有很好的抑制作用。OpenCV中提供了APImedianBlur()来完成中值滤波。

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

下面是使用中值滤波去除椒盐噪声的实验效果的原图和滤波器大小分别为3、5、7时的实际滤波效果

双边滤波
双边滤波的原理。和加权均值滤波器的原理一样,双边滤波的输出像素值同样是依赖领域像素的加权组合。

\[g(i,j) = \frac{\sum_{k,l}f(k,l)w(i,j,k,l)}{\sum_{k,l}w(i,j,k,l)} \]

区别在于,权重系数\(w(i,j,k,l)\)的选取。在双边滤波中,\(w(i,j,k,l)\)被设置为定义域核

\[d(i,j,k,l)=exp(- \frac{(i-k)^2+(j-l)^2}{2 \sigma_d^2}) \]

注意,该式子相当于是二维正态分布公式的简化版。

和依赖于数据的值域核

\[r(i,j,k,l) = exp(- \frac{||f(i,j)-f(k,l)||^2}{2\sigma_r^2}) \]

的乘积,也即

\[w(i,j,k,l)=exp(- \frac{(i-k)^2+(j-l)^2}{2 \sigma_d^2} - \frac{||f(i,j)-f(k,l)||^2}{2\sigma_r^2}) \]

定量分析:
当像素差异大时(边缘处),\(r(i,j,k,l) \rightarrow 0\),此时,高斯滤波效果将大大减弱。
当像素差异小时(非边缘处),\(r(i,j,k,l) \rightarrow 1\),此时,高斯滤波效果几乎不变。
因此,双边滤波具有较好的保边效果。

OpenCV中提供了APIbilateralFilter()来完成双边滤波操作。

bilateralFilter(
	InputArray src,					// 输入图像
    OutputArray dst,				// 输出图像
    int d,							// 滤波过程中每个像素领域的直径
    double sigmaColor,				// 颜色空间的sigma值
    double sigmaSpace,				// 坐标空间的sigma值
    int borderType = BORDER_DEFAULT
);

下面的实验中,像素直径d设为9,sigmaColor和sigmaSpace分别设为(50, 50)、(150, 150)、(200, 200)

请注意在实现效果图中图像边缘的保持情况


三 参考文献

(1) 《计算机视觉——算法与应用》
(2) 《数字图像处理(第三版)》
(3) OpenCV Documentation

posted @ 2019-07-31 20:28  wallace-rice  阅读(3126)  评论(0编辑  收藏  举报