精华内容
下载资源
问答
  • 双边滤波原理
    千次阅读
    2022-03-25 10:43:11

     上级目录:

    传统图像处理/降噪与滤波

    原理: 

    双边滤波=空间域+值域

    一张图DDDD

    σ的意义及选取

    空间域sigma(space)选取:  

    sigma(space)越大,图像越平滑,趋于无穷大时,每个权重都一样,类似均值滤波。      

    sigma(space)越小,中心点权重越大,周围点权重越小,对图像的滤波作用越小,趋于零时,输出等同于原图。

    值域sigma(color)选取:

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

    Sigma(color)越小,边缘越清晰,极限情况为simga无限接近0,值域系数除了中心位置,其他近似为0(接近exp(-∞) =0),与高斯模板(空间域模板)相乘进行滤波的结果等效于源图像。

    更多相关内容
  • 双边滤波原理浅析

    2021-01-16 18:07:50
    双边滤波(Bilateral filtering)是一种结合了图像像素空间位置关系和像素值大小的非线性组合的保边滤波算法,无需迭代计算,操作简单。从原理上讲,图像领域的滤波通常意义是希望去除噪声,使图像更加平滑。而传统...

    前言

    双边滤波(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=3
    
    cv2.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》

    展开全文
  • 本文详细介绍高斯滤波和双边滤波的原理并给出MATLAB实现,最后对照高斯滤波与双边滤波的效果。 目录 一、滤波原理 1.1 一维高斯分布 1.2 二维高斯分布 1.3 高斯滤波总结 二、双边滤波 1. 双边滤波的原理 2. ...

    本文详细介绍高斯滤波和双边滤波的原理并给出MATLAB实现,最后对照高斯滤波与双边滤波的效果。


    目录

    一、滤波原理

    1.1 一维高斯分布

    1.2 二维高斯分布

    1.3 高斯滤波总结

     二、双边滤波

    1. 双边滤波的原理 

    2. 双边滤波是如何实现“保边去噪”的?

    3. MATLAB实现双边滤波

     4. 关于sigma值的选取

    4.1 空间域sigma  选取

    4.2 值域sigma  选取

    三、双边滤波与高斯滤波结果对照

    3.1 仿真图像对照

    3.2 真实图像对照

    3.3 总结


    一、滤波原理

    参考:https://blog.csdn.net/nima1994/article/details/79776802(高斯滤波的原理)

    划重点:

    空域滤波的本质即在窗口内“取平均”,模板半径越大,模糊效果越强。

    高斯滤波中,高斯函数是用来计算模板权重的,其依据为:连续图像中,越靠近的点关系越密切,越远离的点关系越疏远,因此,加权平均更合理,即距离中心点越近的点权重越大,距离越远的点权重越小。

    1.1 一维高斯分布

    而一维高斯分布(正态分布)刚好满足这一条件,如图1.

                                                        

                                                                                                  图1  正态分布“钟形曲线”

    一维高斯分布公式见式(1),其中均值\mu决定了曲线的中心点,\sigma决定了曲线的宽度,\sigma越大曲线越宽。

                                                                                            f= \frac{ 1}{ \sigma\sqrt{2\pi} }e^{ -(x-\mu)^{ 2}/2\sigma^{2}}                 …………(1)

    MATLAB实现一维高斯函数:

    function g = Gaussian(X,avg,sigma)
    %% 功能说明:一维高斯分布
    %% 参数说明:avg -- 均值,决定中心点位置
    %          sigma -- 标准差,决定曲线宽度
       temp_1 = 1 / (sigma * sqrt(2*pi));
       temp_2 = -(X - avg).^2./(2*sigma^2);
       g = temp_1 * exp(temp_2);
       g = g ./ sum(g(:));
    end
    

    使用上述功能绘制不同\sigma值对应的曲线,代码如下:

    X = -15:0.1:15;
    avg = 0;  % 图像中心点为0
    sigmas = [1;2;3;4];
    for i = 1:length(sigmas)
        g = Gaussian(X,avg,sigmas(i));
        plot(X,g)
        hold on
    end
    legend('\sigma = 1','\sigma = 2','\sigma = 3','\sigma = 4');

    图像如图2,显然,\sigma决定了曲线的宽度,\sigma越大曲线越宽,且图像关于x = avg(这里为0)对称。

                                               

                                                                                       图2  不同\sigma值对应的一维高斯分布

    补充说明:之前做了min-max标准化,将不同sigma值对应的曲线的取值范围均映射在了[0,1]范围内,但现在发现这种做法忽略了sigma取值对曲线高度的影响。

    (高斯分布的性质:曲线下方与x轴上方的面积之和为1)sigma的取值不仅决定了曲线的宽度,也决定了曲线的高度,sigma越大,曲线越宽越矮;sigma越小,曲线越窄越高。

     

    1.2 二维高斯分布

    将x = x,y分别代入公式(1)后,二者相乘即可得到二维高斯分布公式(2):

                                                                                     f = \frac{ 1}{ 2\pi\sigma^{ 2}} e^{ -((x-\mu_{1})^{2}+(y-\mu_{2})^{2})/2\sigma^{2}}      …………(2)

    这里令\mu_{1} = 0, \mu_{2} = 0可得简化版二维高斯分布函数公式(3):

                                                                                     f = \frac{ 1}{ 2\pi\sigma^{ 2}} e^{ -(x^{2}+y^{2})/2\sigma^{2}}                       …………(3)

    根据公式(3)即可计算高斯滤波模板中每个点的权重。

    二维高斯函数,代码如下:

    function [G] = Gaussian(R,sigma)
    %% 功能说明:二维高斯函数,可用于计算高斯滤波权重矩阵
    %          高斯滤波:仅考虑了空域信息,未考虑灰度相似性
    %% 输入参数:R -- 模板半径
    %          sigma -- 标准差
        [X,Y] = meshgrid(-R:0.1:R);
        temp1 = 1/(2*pi*sigma^2);
        temp2 = -(X.^2 + Y.^2)/(2*sigma^2);
        G = temp1 * exp(temp2);
        
        G = G./sum(G(:));  % 模板的权重之和必须等于1。
    
        % 绘制模板图
        figure
        surf(X,Y,G);
        shading interp;
    end

    大小为15*15,标准差为2的二维高斯分布模板如图3所示

                                                                

                                                                                                       图3  大小为11*11的二维高斯分布

    使用大小为5*5,标准差为0.3的模板对含有弱小目标和云层的图像进行高斯模糊,如图4所示。

                                                                           

                                                                                   图4 大小为5*5,标准差为0.3的模板高斯模糊滤波结果

    1.3 高斯滤波总结

     高斯滤波只考虑了图像像素之间的空间相似性,即连续图像中,越靠近的点关系越密切,越远离的点关系越疏远。

     二、双边滤波

    1. 双边滤波的原理 

    参考:https://blog.csdn.net/Chaolei3/article/details/88579377

           双边滤波是一种非线性的方法,与高斯滤波相比,双边滤波不仅考虑了图像的空间相似性,也考虑了其灰度相似性,可以达到“保边去噪”的目的。

           双边滤波包含两部分:空域矩阵与值域矩阵,空域矩阵可类比高斯滤波,用于模糊去噪;值域矩阵根据灰度相似性得到,用来保护边缘。

           空域矩阵计算公式(4),值域矩阵计算公式(5)

                                                                               d(i,j,k,l)=e^\frac{ -(i-k)^{2}+(j-l)^{2}}{ 2\sigma_{d}^{2}}              …………(4)

                                                                               r(i,j,k,l)=e^\frac{ -||f(k,l)-f(i,j)||^{2}}{ 2\sigma_r^{2}}              …………(5)

           公式说明:定义(i, j)为中心点坐标,(k, l)为以点(i, j)为中心的邻域内任意一点。

           公式(4)(5)相乘即为双边滤波权重矩阵计算公式(6)

                                                                                w(i,j,k,l)=e^{\frac{ -(i-k)^{2}+(j-l)^2}{ 2\sigma_{d}^{2}}+\frac{ -||f(k,l)-f(i,j)||^{2}}{2\sigma_r^{2}}}      …………(6)

            最后,计算加权平均值作为中心点坐标滤波后的值

                                                                                g(i,j)=\frac{ \sum_{(k,l)\in{S}}f(i,j)w(i,j,k,l)}{ \sum_{(k,l)\in{S}}w(i,j,k,l)}     ………… (7)

    2. 双边滤波是如何实现“保边去噪”的?

          参考:https://blog.csdn.net/Jfuck/article/details/8932978?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

          由公式(4),空间域权重矩阵的权重分布仍然是“钟形”,即距中心点越近,所占权重越大;

          由公式(5)(6),已知y = e^{-x}是过(0,1)点的减函数,即灰度差值越大,权重越小,平滑效果越差,反之,灰度差值越小,权重越大,平滑效果越好。所以,当中心点位于边缘处时,灰度差值大,空间域平滑效果削弱,边缘被保留;当邻域灰度值接近中心点时,灰度差值接近0,值域权重接近1,此时滤波效果取决于空间域权重矩阵,与高斯滤波效果一致。

         公式(7)的含义:滤波后中心点的值 = 权重矩阵 .* 原始图像 (且保证权重之和为1,归一化处理)(参照滤波原理)

                                       

                                                                                                      图5  双边滤波“保边去噪”原理图

    3. MATLAB实现双边滤波

    function b = BF_Filter(img,r,sigma_d,sigma_r)
    %% 功能说明:双边滤波,用于计算双边滤波后的图像
    %          双边滤波是一种非线性方法,同时考虑图像的空域信息和灰度相似性。
    %          通过空域矩阵和值域矩阵形成新的权重矩阵,其中,空域矩阵用来模糊去噪,值域矩阵用来保护边缘。
    %% 输入参数:img -- 待滤波图像
    %          r -- 模板半径,e.g. 3*3模版的半径为1
    %          sigma_d -- 空域矩阵标准差
    %          sigma_r -- 值域矩阵标准差
        
        % 判断是否为灰度图像
        if(size(img,3)>1)
            img = rgb2gray(img);
        end
        [x,y] = meshgrid(-r:r);
        
        % 空域权重矩阵 size = (2r+1)*(2r+1)
        w_spacial = exp(-(x.^2 + y.^2)/(2*sigma_d.^2));
    
        [m,n] = size(img);
        img = double(img);
        
        % 扩展图像,size = (m+2r)*(n+2r)
        f_temp = padarray(img,[r r],'symmetric');
        
        % 滑动窗口并滤波
        b = zeros(m,n); % 滤波后图像
        for i = r+1:m+r
            for j = r+1:n+r
                temp = f_temp(i-r:i+r,j-r:j+r);
                w_value = exp(-(temp - img(i-r,j-r)).^2/(2*sigma_r^2));  % size = (2r+1)*(2r+1)
                w = w_spacial .* w_value;
                s = temp.*w;
                b(i-r,j-r) = sum(s(:))/sum(w(:));  
            end
        end
    end

     4. 关于sigma值的选取

    参考:https://blog.csdn.net/Jfuck/article/details/8932978?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

    4.1 空间域sigma \sigma_d 选取

    核大小通常为(6\multi\sigma_d+1),即r=6\sigma_d

    因为距离中心点(3\multi\sigma_d+1)大小之外的系数与中点的系数值比较小,可以认为此之外的点与中心点几乎没有联系,权重系数可看作0.

    4.2 值域sigma \sigma_r 选取

                                                     

                                                                                          图6   y=e^{-x}图像

    \sigma_r=255,灰度差值范围为[0,255]时,x 的取值范围 x\leqslant 1,值域范围为:[0.3679,1];

    \sigma_r=122.5,灰度差值范围为[0,255]时,x 的取值范围 x\leqslant 4,值域范围为:[0.01832,1];

    所以,sigma越大,权重值域范围越小,此时即使邻域灰度值与中心点灰度值之差较大,其对应权重也会很大,这与双边滤波“保边”的初衷相违背;sigma越小,权重值域范围越大,此时当邻域灰度值域中心点灰度值之差较大时,其对应权重越小,可以削弱“平滑”,达到“保边”效果。

    综上,sigma越大,边缘越模糊,sigma-->∞时,x-->0,权重-->1,与高斯模板相乘后可认为等效于高斯滤波;

                sigma越小,边缘越清晰,sigma-->0时,x-->∞,权重-->0,与高斯模板相乘后可认为系数皆相等,等效于源图像。

    三、双边滤波与高斯滤波结果对照

    3.1 仿真图像对照

    生成含明显边缘的图像,如图7所示。

                                                                                         

                                                                                                                 图7  仿真图像

    img_B = zeros(250,250);
    img_B(:,40:50) = 1;
    img_B(:,180:200) = 1;
    img_B(100:105,:) = 1;
    imshow(img_B)

    高斯滤波与双边滤波结果如图8所示,显然,双边滤波可以更好地保留图像的边缘信息。

                                                                        

                                                                                                   图8  双边滤波与高斯滤波仿真图像对比结果

    %% 高斯滤波
    r = 7;
    sigma_d = 1;
    G = Gaussian(r, sigma_d);
    g = imfilter(img_B, G, 'symmetric');
    %% 双边滤波
    sigma_r = 3;
    b = BF_Filter(img_B,r,sigma_d,sigma_r);
    figure
    subplot(1,2,1)
    imshow(b);title([num2str(2*r+1),'*',num2str(2*r+1),'双边滤波结果','\sigma_d=1 ,',' \sigma_r=3']);
    subplot(1,2,2)
    imshow(g);title([num2str(2*r+1),'*',num2str(2*r+1),'高斯滤波结果','\sigma_d=1']);

    3.2 真实图像对照

    从结果来看,对于含有云层等结构背景及弱小目标的图像,与高斯滤波相比,双边滤波可以很好地保留图像的边缘(结构)信息。

                                                                                              

                                                                                                              图9  原真实图像

                                                                    

                                                                                            图10  双边滤波与高斯滤波真实图像对比结果

    img = imread('cloud.bmp');
    if(size(img,3)>1)
        img = rgb2gray(img);
    end
    r = 7;
    sigma_d = 0.5;
    G = Gaussian(r, sigma_d);
    img_g = imfilter(img, G, 'symmetric');
    
    sigma_r = 3;
    img_b = BF_Filter(img,r,sigma_d,sigma_r);
    subplot(1,3,1);
    imshow(img);title('原图');
    subplot(1,3,2)
    imshow(img_g,[]);title('高斯滤波结果');
    subplot(1,3,3);
    imshow(img_b,[]);title('双边滤波结果');

    3.3 总结

    结合弱小目标检测的课题目标,双边滤波适合预测含有丰富边缘(结构)信息的背景预测,通过实验选择合适的sigma值,对背景进行预测,原图-预测背景图=目标图(STI),然后从STI图中检测目标,下一步需要进行深入探究。

    展开全文
  • 点云双边滤波算法

    2019-06-12 11:08:38
    双边滤波算法应用于点云噪点滤除,可有效提高点云质量。高质量的输入数据对提高点云学习的人工智能训练效率与质量有显著的帮助。
  • 双边滤波原理以及双边滤波算法的实现 双边滤波(Bilateral Filter)原理 双边滤波与高斯滤波器相比,对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。...

    双边滤波原理以及双边滤波算法的实现

    双边滤波(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),与高斯模板(空间域模板)相乘后,可近似为系数皆相等,等效于源图像。

     

    双边滤波算法实现:

    在原理部分,从双边滤波的公式就可以得到该算法的实现途径。由于直接的编码实现上述过程,其时间复杂度为O(σs2) ,比较耗时,所以后来出现了一些改进算法,比较经典的有:论文《Fast O(1) bilateral filtering using trigonometric range kernels》,提出了用Raised cosines函数来逼近高斯值域函数,并利用一些特性把值域函数分解为一些列函数的叠加,从而实现函数的加速[5,8]。
    这里只对原始方法进行实现,从而有助于更加清楚的了解算法的原理。

    matlab实现方法,这里也附一下核心代码:

     

    第一种方法:

    clc,clear all,close all;
    ori=imread('D:\proMatlab\vessel_edge_extration\image\3.jpg'); 
    ori=double(rgb2gray(ori))/255.0;
    [width, height]=size(ori);
    sigmaSpatial  = min( width, height ) / 30;
    samplingSpatial=sigmaSpatial;
    sigmaRange = ( max( ori( : ) ) - min( ori( : ) ) ) / 30;
    samplingRange= sigmaRange;
    output = bilateralFilter( ori, ori, sigmaSpatial, sigmaRange, ...
        samplingSpatial, samplingRange );
    figure,
    subplot(1,2,1),imshow(ori,[]);title('input image');
    subplot(1,2,2),imshow(output,[]);title('output image');

    双边滤波函数:

    function output = bilateralFilter( data, edge, sigmaSpatial, sigmaRange, ...
        samplingSpatial, samplingRange )
     
    if ~exist( 'edge', 'var' ),
        edge = data;
    end
     
    inputHeight = size( data, 1 );
    inputWidth = size( data, 2 );
     
    if ~exist( 'sigmaSpatial', 'var' ),
        sigmaSpatial = min( inputWidth, inputHeight ) / 16;
    end
     
    edgeMin = min( edge( : ) );
    edgeMax = max( edge( : ) );
    edgeDelta = edgeMax - edgeMin;
     
    if ~exist( 'sigmaRange', 'var' ),
        sigmaRange = 0.1 * edgeDelta;
    end
     
    if ~exist( 'samplingSpatial', 'var' ),
        samplingSpatial = sigmaSpatial;
    end
     
    if ~exist( 'samplingRange', 'var' ),
        samplingRange = sigmaRange;
    end
     
    if size( data ) ~= size( edge ),
        error( 'data and edge must be of the same size' );
    end
     
    % parameters
    derivedSigmaSpatial = sigmaSpatial / samplingSpatial;
    derivedSigmaRange = sigmaRange / samplingRange;
     
    paddingXY = floor( 2 * derivedSigmaSpatial ) + 1;
    paddingZ = floor( 2 * derivedSigmaRange ) + 1;
     
    % allocate 3D grid
    downsampledWidth = floor( ( inputWidth - 1 ) / samplingSpatial ) + 1 + 2 * paddingXY;
    downsampledHeight = floor( ( inputHeight - 1 ) / samplingSpatial ) + 1 + 2 * paddingXY;
    downsampledDepth = floor( edgeDelta / samplingRange ) + 1 + 2 * paddingZ;
     
    gridData = zeros( downsampledHeight, downsampledWidth, downsampledDepth );
    gridWeights = zeros( downsampledHeight, downsampledWidth, downsampledDepth );
     
    % compute downsampled indices
    [ jj, ii ] = meshgrid( 0 : inputWidth - 1, 0 : inputHeight - 1 );
     
    di = round( ii / samplingSpatial ) + paddingXY + 1;
    dj = round( jj / samplingSpatial ) + paddingXY + 1;
    dz = round( ( edge - edgeMin ) / samplingRange ) + paddingZ + 1;
     
    % perform scatter (there's probably a faster way than this)
    % normally would do downsampledWeights( di, dj, dk ) = 1, but we have to
    % perform a summation to do box downsampling
    for k = 1 : numel( dz ),
           
        dataZ = data( k ); % traverses the image column wise, same as di( k )
        if ~isnan( dataZ  ),
            
            dik = di( k );
            djk = dj( k );
            dzk = dz( k );
     
            gridData( dik, djk, dzk ) = gridData( dik, djk, dzk ) + dataZ;
            gridWeights( dik, djk, dzk ) = gridWeights( dik, djk, dzk ) + 1;
            
        end
    end
     
    % make gaussian kernel
    kernelWidth = 2 * derivedSigmaSpatial + 1;
    kernelHeight = kernelWidth;
    kernelDepth = 2 * derivedSigmaRange + 1;
     
    halfKernelWidth = floor( kernelWidth / 2 );
    halfKernelHeight = floor( kernelHeight / 2 );
    halfKernelDepth = floor( kernelDepth / 2 );
     
    [gridX, gridY, gridZ] = meshgrid( 0 : kernelWidth - 1, 0 : kernelHeight - 1, 0 : kernelDepth - 1 );
    gridX = gridX - halfKernelWidth;
    gridY = gridY - halfKernelHeight;
    gridZ = gridZ - halfKernelDepth;
    gridRSquared = ( gridX .* gridX + gridY .* gridY ) / ( derivedSigmaSpatial * derivedSigmaSpatial ) + ( gridZ .* gridZ ) / ( derivedSigmaRange * derivedSigmaRange );
    kernel = exp( -0.5 * gridRSquared );
     
    % convolve
    blurredGridData = convn( gridData, kernel, 'same' );
    blurredGridWeights = convn( gridWeights, kernel, 'same' );
     
    % divide
    blurredGridWeights( blurredGridWeights == 0 ) = -2; % avoid divide by 0, won't read there anyway
    normalizedBlurredGrid = blurredGridData ./ blurredGridWeights;
    normalizedBlurredGrid( blurredGridWeights < -1 ) = 0; % put 0s where it's undefined
    blurredGridWeights( blurredGridWeights < -1 ) = 0; % put zeros back
     
    % upsample
    [ jj, ii ] = meshgrid( 0 : inputWidth - 1, 0 : inputHeight - 1 ); % meshgrid does x, then y, so output arguments need to be reversed
    % no rounding
    di = ( ii / samplingSpatial ) + paddingXY + 1;
    dj = ( jj / samplingSpatial ) + paddingXY + 1;
    dz = ( edge - edgeMin ) / samplingRange + paddingZ + 1;
     
    % interpn takes rows, then cols, etc
    % i.e. size(v,1), then size(v,2), ...
    output = interpn( normalizedBlurredGrid, di, dj, dz );
    

     

    第二种方法:

    %简单地说:
    %A为给定图像,归一化到[0,1]的矩阵
    %W为双边滤波器(核)的边长/2
    %定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)
    
    
    
    clc,clear all,close all;
    
    I=imread('einstein.jpg');
    I=double(I)/255;
     
    w     = 5;       % bilateral filter half-width
    sigma = [3 0.1]; % bilateral filter standard deviations
     
    I1=bfilter2(I,w,sigma);
     
    subplot(1,2,1);
    imshow(I);
    subplot(1,2,2);
    imshow(I1)

    滤波函数:

    % Pre-process input and select appropriate filter.
    function B = bfilter2(A,w,sigma)
     
    % Verify that the input image exists and is valid.
    if ~exist('A','var') || isempty(A)
       error('Input image A is undefined or invalid.');
    end
    if ~isfloat(A) || ~sum([1,3] == size(A,3)) || ...
          min(A(:)) < 0 || max(A(:)) > 1
       error(['Input image A must be a double precision ',...
              'matrix of size NxMx1 or NxMx3 on the closed ',...
              'interval [0,1].']);      
    end
     
    % Verify bilateral filter window size.
    if ~exist('w','var') || isempty(w) || ...
          numel(w) ~= 1 || w < 1
       w = 5;
    end
    w = ceil(w);
     
    % Verify bilateral filter standard deviations.
    if ~exist('sigma','var') || isempty(sigma) || ...
          numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0
       sigma = [3 0.1];
    end
     
    % Apply either grayscale or color bilateral filtering.
    if size(A,3) == 1
       B = bfltGray(A,w,sigma(1),sigma(2));
    else
       B = bfltColor(A,w,sigma(1),sigma(2));
    end

    灰色图像:

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Implements bilateral filtering for grayscale images.
    function B = bfltGray(A,w,sigma_d,sigma_r)
     
    % Pre-compute Gaussian distance weights.
    [X,Y] = meshgrid(-w:w,-w:w);
    %创建核距离矩阵,e.g.
    %  [x,y]=meshgrid(-1:1,-1:1)
    % 
    % x =
    % 
    %     -1     0     1
    %     -1     0     1
    %     -1     0     1
    % 
    % 
    % y =
    % 
    %     -1    -1    -1
    %      0     0     0
    %      1     1     1
    %计算定义域核
    G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
     
    % Create waitbar.
    h = waitbar(0,'Applying bilateral filter...');
    set(h,'Name','Bilateral Filter Progress');
     
    % Apply bilateral filter.
    %计算值域核H 并与定义域核G 乘积得到双边权重函数F
    dim = size(A);
    B = zeros(dim);
    for i = 1:dim(1)
       for j = 1:dim(2)
          
             % Extract local region.
             iMin = max(i-w,1);
             iMax = min(i+w,dim(1));
             jMin = max(j-w,1);
             jMax = min(j+w,dim(2));
             %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)
             I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I
          
             % Compute Gaussian intensity weights.
             H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));
          
             % Calculate bilateral filter response.
             F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
             B(i,j) = sum(F(:).*I(:))/sum(F(:));
                   
       end
       waitbar(i/dim(1));
    end
     
    % Close waitbar.
    close(h);
     

    彩色图像:

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Implements bilateral filter for color images.
    function B = bfltColor(A,w,sigma_d,sigma_r)
     
    % Convert input sRGB image to CIELab color space.
    if exist('applycform','file')
       A = applycform(A,makecform('srgb2lab'));
    else
       A = colorspace('Lab<-RGB',A);
    end
     
    % Pre-compute Gaussian domain weights.
    [X,Y] = meshgrid(-w:w,-w:w);
    G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
     
    % Rescale range variance (using maximum luminance).
    sigma_r = 100*sigma_r;
     
    % Create waitbar.
    h = waitbar(0,'Applying bilateral filter...');
    set(h,'Name','Bilateral Filter Progress');
     
    % Apply bilateral filter.
    dim = size(A);
    B = zeros(dim);
    for i = 1:dim(1)
       for j = 1:dim(2)
          
             % Extract local region.
             iMin = max(i-w,1);
             iMax = min(i+w,dim(1));
             jMin = max(j-w,1);
             jMax = min(j+w,dim(2));
             I = A(iMin:iMax,jMin:jMax,:);
          
             % Compute Gaussian range weights.
             dL = I(:,:,1)-A(i,j,1);
             da = I(:,:,2)-A(i,j,2);
             db = I(:,:,3)-A(i,j,3);
             H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));
          
             % Calculate bilateral filter response.
             F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
             norm_F = sum(F(:));
             B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F;
             B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F;
             B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F;
                    
       end
       waitbar(i/dim(1));
    end
     
    % Convert filtered image back to sRGB color space.
    if exist('applycform','file')
       B = applycform(B,makecform('lab2srgb'));
    else  
       B = colorspace('RGB<-Lab',B);
    end
     
    % Close waitbar.
    close(h);

     

    转载地址:http://www.360doc.com/content/18/0807/12/58467320_776327983.shtml

    转载地址:https://blog.csdn.net/piaoxuezhong/article/details/78302920

    转载地址:https://blog.csdn.net/abcjennifer/article/details/7616663

    展开全文
  • https://blog.csdn.net/u011961856/article/details/77606180 http://blog.csdn.net/jfuck/article/details/8932978 ...
  • matlab函数实现图片的双边滤波算法
  • 双边滤波原理及Opencv调用

    千次阅读 2018-12-11 16:40:17
    双边滤波是一种非线性滤波方法,是结合了图像的邻近度和像素值相似度的一种折中,在滤除噪声的同时可以保留原图的边缘信息。整个双边滤波是由两个函数构成:一个函数是由空间距离决定的滤波器系数,另外一个诗由像素...
  • 利用双边滤波算法对深度图像进行处理可以得到修复图像。
  • 图像处理-双边滤波原理

    千次阅读 2017-11-07 17:05:51
    双边滤波(Bilateral filter)是一种可以去噪保边的滤波器。之所以可以达到此效果,是因为滤波器是由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个由像素差值决定滤波器系数。  原理示意图如下...
  • 双边滤波是基于高斯滤波的思想,在高斯滤波的基础上,加上图像像素值对中心像素的影响,两者共同影响中心像素的值。 高斯滤波: 权重大小取决于中心像素的灰度值和邻域像素的灰度值得差,当边缘有较大的灰度...
  • 图像处理-双边滤波和联合双边滤波

    千次阅读 2021-11-27 16:35:56
    双边滤波原理 ​ 双边滤波(Bilateral Filter)是一种非线性滤波器,可以达到保持边缘,降噪平滑的效果。其算法最早由C. Tomasi和R. Manduchi在论文《Bilateral Filtering for Gray and Color Images》中提出,按照...
  • 利用双边滤波算法对深度图像进行处理可以得到修复图像。
  • 双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的(不理解这几个概念没关系,后面会慢慢解释)...
  • 图像滤波原理双边滤波

    千次阅读 2019-08-17 22:40:39
    图像滤波原理双边滤波图像滤波问题描述1. 空间(即图像定义域)相邻关系的滤波器2. 双边滤波器(bilateral filter)3. 如何快速实现双边滤波 图像滤波问题描述 为了内容的完整性,首先对图像滤波进行简单的回顾。...
  • 双边滤波原理(Bilateral Filtering)

    万次阅读 多人点赞 2017-12-18 22:49:15
    双边滤波原理(Bilateral Filtering)
  • 双边滤波原理之Matlab实现

    千次阅读 2019-06-23 16:06:07
    在《高斯滤波之FPGA实现》一文中,讲述了高斯滤波的原理。高斯滤波,是对整幅图像进行加权平均,...这就涉及到另外一种滤波算法,双边滤波双边滤波:Bilateral Filter,属于非线性滤波。它同时考虑了空间邻近度...
  • 双边滤波算法原理

    2020-07-17 10:39:25
    和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布[1]。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通...
  • 点云双边滤波

    2022-04-21 10:52:09
    在二维图像领域中,双边滤波算法是通过考虑中心像素点到邻域像素点的距离(一边)以及像素亮度差值所确定的权重(另一边)来修正当前采样中心点的位置,从而达到平滑滤波效果。同时也会有选择性的剔除部分与当前采样点...
  • 1.原理 公式如上,对高斯滤波进行了优化,前面部分是原来的高斯滤波,空间权重,离中心点越近,权重越大,越接近1,边缘权重越小,越接近0。...此时wr无限接近于1,因此此时的双边就是普通的高斯滤波,达到对图像平
  • 双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波...
  • 和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,...
  • 图像平滑 图像平滑是一种区域增强...图像平滑有均值滤波、中值滤波、高斯滤波和高斯双边滤波等。 1.均值滤波: 用其像素点周围像素的平均值代替元像素值,在滤除噪声的同时也会滤掉图像的边缘信息。 均值滤波A...
  • 在图像的获取、传输和存储过程中常常会受到各种噪声的干扰和影响,使图像质量下降,为了获取高质量的数字图像,很有必要对图像进行消除噪声处理,并且...高斯滤波的基本原理是以某一像素为中心,在它的周围选择一个局部邻域
  • 双边滤波Python实现

    千次阅读 2021-10-26 09:59:53
    # 双边滤波 # radius:滤波器窗口半径 # sigma_color:颜色域方差 # sigma_space:空间域方差 def bilateral_filter(image, radius, sigma_color, sigma_space): H, W = image.shape[0], image.shape[1] C = 1 if
  • 基于法线的点云双边滤波

    千次阅读 2021-11-16 14:46:28
    双边滤波具有一定的保留边缘特征的功能,本质上是一种平滑算法,算法原理: 具体参考文献《The Bilateral Filter for Point Clouds》 作者:Julie Digne, Carlo de Franchis 代码: #include <iostream> #...
  • 双边滤波解释 联合双边滤波解释

    千次阅读 2018-08-08 20:26:28
    https://blog.csdn.net/nature_XD/article/details/69258553 Bilateral Filter、Cross/Joint Bilateral Filter   https://blog.csdn.net/panda1234lee/article/details/52839205 联合双边滤波
  • 图像双边滤波算法,含算法原理和运行demo,实验效果不错
  • Bilateral Filters(双边滤波算法)原理及实现

    万次阅读 多人点赞 2017-10-21 13:09:51
    双边滤波算法原理双边滤波算法实现: 双边滤波算法实例: 参考: http://people.csail.mit.edu/sparis/bf/ http://blog.csdn.net/fightingforcv/article/details/52723376 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,554
精华内容 1,421
关键字:

双边滤波原理

友情链接: dif.rar