双边滤波(Bilateral Filter)详解

原理分析:

 双边滤波与高斯滤波器相比,对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。

         空间距离:指的是当前点与中心点的欧式距离。空间域高斯函数其数学形式为:

其中(xi,yi)为当前点位置,(xc,yc)为中心点的位置,sigma为空间域标准差。

         灰度距离:指的是当前点灰度与中心点灰度的差的绝对值。值域高斯函数其数学形式为:

其中gray(xi,yi)为当前点灰度值,gray(xc,yc)为中心点灰度值,sigma为值域标准差。

         对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。

         双边滤波中加入了对灰度信息的权重,即在邻域内,灰度值越接近中心点灰度值的点的权重更大,灰度值相差大的点权重越小。此权重大小,则由值域高斯函数确定。

         两者权重系数相乘,得到最终的卷积模板。由于双边滤波需要每个中心点邻域的灰度信息来确定其系数,所以其速度与比一般的滤波慢很多,而且计算量增长速度为核大小的平方。


参数选择:

         空间域sigma选取:其中核大小通常为sigma的6*sigma + 1。因为离中心点3*sigma大小之外的系数与中点的系数只比非常小,可以认为此之外的点与中心点没有任何联系,及权重系数为0.OpenCV中默认的计算公式也是如此,OpenCV参考文档内容如下:“对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2对应垂直核.”

         值域sigma选取:另灰度差△g  =  abs(gray(xi,yi)- gray(xc,yc)),忽略常数的影响,因此其函数可以简化为:

的图像可知:

已知 0≤△g≤255;

1)假设sigma = 255,当△g = 255时,系数为exp(-1) = 0.3679,当△g = 0时,系数为exp(-0)= 1.灰度最大点的系数与相差最小的灰度值系数之比为 0.3679.

2)假设sigma = 122.5,当△g = 255时,系数为exp(-4) = 0.0183,当△g = 0时,系数为exp(-0)= 1.灰度差最大点的系数与相差最小的灰度值系数之比为 0.0183.

结论:因为导数为,其增长速度为指数增长。

当simga较大时,灰度差最大值与最小值的系数在很小的一个范围之内,其比值较大。及灰度差较大的点,对于中心点也会有相应的较大的权值,此与双边滤波的保留边缘的初衷相违背。

当sigma较小时,灰度差最大值与最小值的系数在较大的一个范围之内,其比值很小,及灰度差较大的点,对应中心点仅有很小的权重。

综上分析可知:

Sigma越大,边缘越模糊,极限情况为simga无穷大,值域系数近似相等(忽略常数时,将近为exp(0)= 1),与高斯模板(空间域模板)相乘后可认为等效于高斯滤波。

Sigma越小,边缘越清晰,极限情况为simga无限接近0,值域系数近似相等(接近exp(-∞) =  0),与高斯模板(空间域模板)相乘后,可近似为系数皆相等,等效于源图像。


关于Bilateral Filter的相关解释可参见:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

  • 31
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
双边滤波是一种可以同时考虑空间距离和像素值差异的滤波方法,可以在去除图像噪声的同时保留图像细节。下面是双边滤波的Matlab代码实现: ```matlab function [output_image] = bilateral_filter(input_image, sigma_d, sigma_r) % 双边滤波函数 % input_image: 输入图像 % sigma_d: 空域滤波器的标准差 % sigma_r: 像素值差异滤波器的标准差 % 将输入图像转换为double类型 input_image = im2double(input_image); % 获取输入图像的大小 [M, N, ~] = size(input_image); % 初始化输出图像 output_image = zeros(M, N, 3); % 定义空域滤波器 [X, Y] = meshgrid(-ceil(3*sigma_d):ceil(3*sigma_d)); space_filter = exp(-(X.^2+Y.^2)/(2*sigma_d^2)); % 对于每个像素进行滤波 for i = 1:M for j = 1:N % 计算像素值差异滤波器 pixel_filter = exp(-((input_image(i,j,1)-input_image(:,:,1)).^2+... (input_image(i,j,2)-input_image(:,:,2)).^2+... (input_image(i,j,3)-input_image(:,:,3)).^2)/(2*sigma_r^2)); % 计算双边滤波bilateral_filter = space_filter .* pixel_filter; % 归一化 bilateral_filter = bilateral_filter / sum(bilateral_filter(:)); % 计算输出像素值 output_image(i,j,1) = sum(sum(input_image(:,:,1).*bilateral_filter)); output_image(i,j,2) = sum(sum(input_image(:,:,2).*bilateral_filter)); output_image(i,j,3) = sum(sum(input_image(:,:,3).*bilateral_filter)); end end % 将输出图像转换为uint8类型 output_image = uint8(output_image*255); ``` 使用方法: ```matlab input_image = imread('input_image.png'); sigma_d = 2; sigma_r = 0.1; output_image = bilateral_filter(input_image, sigma_d, sigma_r); imshow(output_image); ``` 其中,`input_image.png`为输入图像的文件名,`sigma_d`为空域滤波器的标准差,`sigma_r`为像素值差异滤波器的标准差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值