双边滤波原理浅析

article/2025/10/26 0:26:39

前言

双边滤波(Bilateral filtering)是一种结合了图像像素空间位置关系和像素值大小的非线性组合的保边滤波算法,无需迭代计算,操作简单。从原理上讲,图像领域的滤波通常意义是希望去除噪声,使图像更加平滑。而传统的均值滤波、高斯滤波等只考虑空域,认为临近像素应该拥有相近的特性,这种假设在图像中的Edge处则不满足,如果仍用这种方式滤波则必定会导致边缘被模糊掉。为了达到保边效果,双边滤波通过结合空域和值域,在保证滤波效果的同时保持了边缘。对于双边滤波实际的应用场景,可用于noise reduction、 HDR compression等。部分情况下可以用于人脸磨皮美颜。

原论文《Bilateral Filtering for Gray and Color Images》摘要:
Bilateral filtering smooths images while preserving edges, by means of a nonlinear combination of nearby image values. The method is noniterative, local, and simple. It combines gray levels or colors based on both their geometric closeness and their photometric similarity, and prefers near values to distant values in both domain and range. In contrast with filters that operate on the three bands of a color image separately, a bilateral filter can enforce the perceptual metric underlying the CIE-Lab color space, and smooth colors and preserve edges in a way that is tuned to human perception. Also, in contrast with standard filtering, bilateral filtering produces no phantom colors along edges in color images, and reduces phantom colors where they appear in the original image.

在这里插入图片描述

原理

原论文在Gray和Color Image情况下均进行了讨论,这里只对Gray Image进行说明。Color Image一般会转为 CIE-Lab 颜色空间处理。

双边滤波实际上是由一个low-pass Domain filter和一个Range filter组合而成,其中Domain filter表示的是像素点空域相关性,即某像素点的临近点对该像素点的影响。定义如下:
在这里插入图片描述
其中 c ( ξ , c(ξ, c(ξ, x ) ) )是度量输入图像中某像素点 x的临近点ξx之间的空间关系。f (ξ)是输入图像的像素值,h (x)是输出的像素值。

k d k_d kd ( x ) ) )是归一化参数,如果这个Domain filter是一个Shift-invariant system(平移不变系统,可以简单的认为是一个固定数值的kernel),那么 c ( ξ , c(ξ, c(ξ, x ) ) )只与 ξ - x 有关, k d k_d kd ( x ) ) )是一个常数。
在这里插入图片描述
Range filter(值域滤波器)拥有与Domain filter相似的定义:
在这里插入图片描述
需要注意的是 c ( ξ , c(ξ, c(ξ, x ) ) )变成了 s ( s( s( f(ξ), f(x) ) ) ),也就是与像素值差值有关。

归一化参数:
在这里插入图片描述
将 Domain filter和Range filter组合起来形成Combined filtering,实现局部像素的空域和值域相关性。这就是bilateral filtering的含义。
在这里插入图片描述
原论文中带边缘情况的权重及最终滤波效果示意图如下:
在这里插入图片描述
论文《A Gentle Introduction to Bilateral Filtering and its Applications》中对该部分的描述彩图更加便于理解:
在这里插入图片描述

可以看到作用在X及相邻像素的权重在边界有很明显的分界,从而几乎只对X所属的边缘一侧的像素点进行加权。

实现

OpenCV中对双边滤波有较为高效的CUDA实现,代码如下:

__global__ void bilateral_kernel(const PtrStepSz<T> src, PtrStep<T> dst, const B b, const int ksz, const float sigma_spatial2_inv_half, const float sigma_color2_inv_half){typedef typename TypeVec<float, VecTraits<T>::cn>::vec_type value_type;int x = threadIdx.x + blockIdx.x * blockDim.x;int y = threadIdx.y + blockIdx.y * blockDim.y;if (x >= src.cols || y >= src.rows)return;value_type center = saturate_cast<value_type>(src(y, x));value_type sum1 = VecTraits<value_type>::all(0);float sum2 = 0;int r = ksz / 2;float r2 = (float)(r * r);int tx = x - r + ksz;int ty = y - r + ksz;if (x - ksz/2 >=0 && y - ksz/2 >=0 && tx < src.cols && ty < src.rows){for (int cy = y - r; cy < ty; ++cy)for (int cx = x - r; cx < tx; ++cx){float space2 = (x - cx) * (x - cx) + (y - cy) * (y - cy);if (space2 > r2)continue;value_type value = saturate_cast<value_type>(src(cy, cx));float weight = ::exp(space2 * sigma_spatial2_inv_half + sqr(norm_l1(value - center)) * sigma_color2_inv_half);sum1 = sum1 + weight * value;sum2 = sum2 + weight;}}else{for (int cy = y - r; cy < ty; ++cy)for (int cx = x - r; cx < tx; ++cx){float space2 = (x - cx) * (x - cx) + (y - cy) * (y - cy);if (space2 > r2)continue;value_type value = saturate_cast<value_type>(b.at(cy, cx, src.data, src.step));float weight = ::exp(space2 * sigma_spatial2_inv_half + sqr(norm_l1(value - center)) * sigma_color2_inv_half);sum1 = sum1 + weight * value;sum2 = sum2 + weight;}}dst(y, x) = saturate_cast<T>(sum1 / sum2);}

主要有两个参数sigma_spatial和sigma_color需要设置,对应在CUDA函数输入中则是sigma_spatial2_inv_half 和sigma_color2_inv_half。

sigma_spatial表示坐标空间中滤波器的sigma值,如果该参数的值较大,则说明颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。

sigma_color表示值域空间中滤波器的sigma值,决定了多少差值之内的像素会被计算进来,如果该参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。

核心权重计算代码:

float weight = ::exp(space2 * sigma_spatial2_inv_half + sqr(norm_l1(value - center)) * sigma_color2_inv_half);

使用

OpenCV的双边滤波CUDA实现的Python调用方式如下:

# 参数设置
kernel_size=0
sigma_color=10
sigma_spatial=3cv2.cuda.bilateralFilter(src=src_gmat,dst=dst_gmat,kernel_size=kernel_size,sigma_color=sigma_color,sigma_spatial=sigma_spatial)

扩展讨论

Bilateral Filter可能存在梯度翻转现象( 图片引自参考资料[9] ):
关于该问题在论文《Guided Image Filtering》中的解释:
在这里插入图片描述

在这里插入图片描述

参考资料

[1] Bilateral Filtering for Gray and Color Images
[2] 双边滤波原理(Bilateral Filtering)
[3] GitHub - opencv_contrib/modules/cudaimgproc/src/bilateral_filter.cpp
[4] GitHub - opencv_contrib/modules/cudaimgproc/src/cuda/bilateral_filter.cu
[5] GitHub - aashikgowda / Bilateral-Filter-CUDA
[6] opencv 中的双边滤波用法总结(10)
[7] opencv学习(二十二)之双边滤波bilateralFilter
[8] Bilateral Filtering: Theory and Applications
[9] 导向滤波原理(Guided Filter)
[10] A Gentle Introduction to Bilateral Filtering and its Applications
[11] 论文《Guided Image Filtering》


http://chatgpt.dhexx.cn/article/c4YIcJDM.shtml

相关文章

双边滤波(Bilateral Filter)详解

原理分析: 双边滤波与高斯滤波器相比,对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。 空间距离:指的是当前点与中心点的欧式距离。空间域高斯函数其数学形式为: 其中(xi,yi)为当前点位置,(xc,yc)为中心点…

双边滤波和双边网格

双边滤波 双边滤波器也是一种保边滤波器&#xff0e;和导向图滤波器一样&#xff0c;可以达到在平坦区域进行均值&#xff08;高斯&#xff09;滤波的效果&#xff0c;在边缘不进行滤波的效果&#xff0e;其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相…

bilateral filter双边滤波器的通俗理解

bilateral filter双边滤波器的通俗理解 图像去噪的方法很多&#xff0c;如中值滤波&#xff0c;高斯滤波&#xff0c;维纳滤波等等。但这些降噪方法容易模糊图片的边缘细节&#xff0c;对于高频细节的保护效果并不明显。相比较而言&#xff0c;bilateral filter双边滤波器可以很…

Bilateral Filtering(双边滤波) for SSAO

1. 简介 图像平滑是一个重要的操作&#xff0c;而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法&#xff08;双边滤波&#xff09;&#xff0c;这主要是由于前段时间做了SSAO&#xff0c;需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说…

双边滤波与高斯滤波

高斯滤波原理 在数字图像中的高斯噪声主要来源出现在采集期间。由于不良照明或高温引起的传感器噪声。如果一个噪声&#xff0c;它的幅度分布服从高斯分布&#xff0c;而它的功率谱密度又是均匀分布的&#xff0c;则称它为高斯白噪声。高斯滤波器是一种线性滤波器&#xff0c;…

双边滤波(bilateral filter)以及联合双边滤波(joint bilateral filter)

文章目录 双边滤波理论公式代码&#xff08;C&#xff09;数学辅助理解 联合双边滤波&#xff08;joint bilateral filter&#xff09;参考链接 写在最后 双边滤波 自用备忘&#xff0c;若侵则删。 理论公式 利用二维高斯函数生成空间域核&#xff0c;一维高斯函数生成颜色域…

双边滤波(Bilateral filter)

双边滤波器&#xff08;Bilateral filter&#xff09;是一种可以保边去噪的滤波器。可以滤除图像数据中的噪声&#xff0c;且还会保留住图像的边缘、纹理等&#xff08;因噪声是高频信号&#xff0c;边缘、纹理也是高频信息&#xff0c;高斯滤波会在滤除噪声的同时使得边缘模糊…

双边滤波器cv2.bilateralFilter

双边滤波器cv2.bilateralFilter 双边滤波是综合考虑空间信息和色彩信息的滤波方式&#xff0c;在滤波过程中能够有效地保护图像内的边缘信息&#xff0c;双边滤波在计算某一个像素点的新值时&#xff0c;不仅考虑距离信息&#xff08;距离越远&#xff0c;权重越小&#xff09…

opencv-双边滤波

一、双边滤波原理 双边滤波&#xff08;Bilateral Filter&#xff09;是非线性滤波中的一种。这是一种结合图像的空间邻近度与像素值相似度的处理办法。在滤波时&#xff0c;该滤波方法同时考虑空间临近信息与颜色相似信息&#xff0c;在滤除噪声、平滑图像的同时&#xff0c;…

Opencv之图像滤波:6.双边滤波(cv2.bilateralFilter)

前面我们介绍的滤波方法都会对图像造成模糊&#xff0c;使得边缘信息变弱或者消失&#xff0c;因此需要一种能够对图像边缘信息进行保留的滤波算法&#xff0c;双边滤波是综合考虑空间信息和色彩信息的滤波方式&#xff0c;在滤波过程中能够有效地保护 图像内的边缘信息。 6.1…

Bilateral Filters(双边滤波算法)原理及实现

双边滤波算法原理&#xff1a; 双边滤波是一种非线性滤波器&#xff0c;它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样&#xff0c;双边滤波也是采用加权平均的方法&#xff0c;用周边像素亮度值的加权平均代表某个像素的强度&#xff0c;所用的加权平均基于高斯分…

双边滤波的基本原理

双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;本质是基于高斯滤波&#xff0c;目的是解决高斯滤波造成的边缘模糊。结合图像的空间邻近度和像素值相似度的一种折处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c;达到保边去噪…

双边滤波算法原理

1. 简介 图像平滑是一个重要的操作&#xff0c;而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法&#xff08;双边滤波&#xff09;&#xff0c;这主要是由于前段时间做了SSAO&#xff0c;需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说…

Bilateral Filters(双边滤波算法)原理及实现(一)

双边滤波算法原理 双边滤波是一种非线性滤波器&#xff0c;它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样&#xff0c;双边滤波也是采用加权平均的方法&#xff0c;用周边像素亮度值的加权平均代表某个像素的强度&#xff0c;所用的加权平均基于高斯分布[1]。最重要…

双边滤波与引导滤波

双边滤波与引导滤波 分类&#xff1a; AI and Computer Vision 2014-03-07 17:04 344人阅读 评论(0) 收藏 举报 图像处理 滤波 双边滤波 双边滤波很有名&#xff0c;使用广泛&#xff0c;简单的说就是一种同时考虑了像素空间差异与强度差异的滤波器&#xff0c;因此具有保持图…

【图像处理】——双边滤波

【fishing-pan&#xff1a;https://blog.csdn.net/u013921430 转载请注明出处】 双边滤波 高斯滤波是最常用的图像去噪方法之一&#xff0c;它能很好地滤除掉图像中随机出现的高斯噪声&#xff0c;但是在之前的博客中提到过&#xff0c;高斯滤波是一种低通滤波&#xff08;有兴…

【八】双边滤波

1.高斯滤波 高斯滤波的定义如下&#xff1a; 其中高斯函数为&#xff1a; 高斯滤波是领域内相邻像素的加权平均&#xff0c;权重值为G(||p-q||)&#xff0c;和均值滤波&#xff0c;中值滤波一样&#xff0c;都是将噪声&#xff08;高频信息&#xff09;滤除&#xff0c;但是边…

双边滤波原理和实现

双边滤波原理 双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;是结合图像的空间邻近度和像素值相似度的一种折衷处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c;达到保边去噪的目的。 双边滤波器之所以能够做到在平滑去噪的同…

双边滤波

1 双边滤波简介 双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;是结合图像的空间邻近度和像素值相似度的一种折衷处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c;达到保边去噪的目的。具有简单、非迭代、局部的特点。 双边滤…

数字图像处理(九)双边滤波

文章目录 一、何为双边滤波&#xff1f;二、为什么要使用双边滤波&#xff1f;三、双边滤波原理1.空间域核2.值域核3.模板相乘 四、 w d w_d wd​和 w r w_r wr​和 σ \sigma σ的理解五、C代码实现1.opencv中Mat的一点小知识2.关于边界的处理3.双边滤波代码 一、何为双边滤波…