本文共 1544 字,大约阅读时间需要 5 分钟。
双边滤波是一种非线性图像滤波技术,通过结合图像的空间邻近度和灰度相似性,能够有效去噪同时保边,具有广泛的应用场景。以下将从原理、实现和效果对比等方面详细阐述这一技术。
双边滤波的核心在于其滤波核的设计。滤波核由两个函数共同决定:空间距离函数和灰度距离函数。
空间距离函数:衡量邻域内点与中心点的欧氏距离,数学表达式为:[G_{space}(x, y) = \exp\left(-\frac{(x - x_c)^2 + (y - y_c)^2}{2\sigma_{space}^2}\right)]其中,((x_c, y_c))为中心点坐标,(\sigma_{space})为空间标准差。
灰度距离函数:衡量邻域内点灰度值与中心点灰度值的绝对差,数学表达式为:[G_{color}(g) = \exp\left(-\frac{g^2}{2\sigma_{color}^2}\right)]其中,(g)为灰度差值,(\sigma_{color})为灰度标准差。
最终滤波核为空间距离函数与灰度距离函数的乘积:[K(x, y, g) = G_{space}(x, y) \times G_{color}(g)]
通过卷积操作,利用上述核对图像进行处理。空间距离函数确保邻域内点权重递减,灰度距离函数进一步根据灰度相似性调整权重,最终实现去噪保边的效果。
空间域σ(space):
值域σ(color):
在OpenCV中,双边滤波函数为:[\text{cv::bilateralFilter}(InputArray src,OutputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType=BORDER_DEFAULT)]其工作原理包括以下步骤:
为了提高效率,可采用查表方式生成值域高斯核模板。具体实现如下:
void getColorMask(std::vector&colorMask, double colorSigma) { for (int i = 0; i < 256; ++i) { double colordiff = exp(-(i * i) / (2 * colorSigma * colorSigma)); colorMask.push_back(colordiff); }}
通过实际实验对比高斯滤波和双边滤波的效果,参数设置为:
对比结果表明:
双边滤波广泛应用于:
转载地址:http://iwgfk.baihongyu.com/