高斯滤波与双边滤波原理、MATLAB实现及结果对照

本文详细介绍高斯滤波和双边滤波的原理并给出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图中检测目标,下一步需要进行深入探究。

  • 17
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 一维高斯滤波是一种常用的图像处理方法,可以平滑图像并去除噪声。Matlab中提供了非常简单易用的一维高斯滤波函数。 一维高斯滤波涉及到一个高斯核函数,其定义如下: $G(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}}$ 其中,$x$表示距离中心点的偏移量,$\sigma$表示标准差,决定了高斯分布曲线的形状。一维高斯滤波的核函数只在一个维度上进行,可以看作是一个垂直于图像的线。将该核函数应用于图像上的每一个像素,计算每个像素的新值,从而实现图像的平滑处理。 在Matlab中,使用“imfilter”函数可以实现一维高斯滤波。具体语法如下: B = imfilter(A, h) 其中,A是需要处理的图像,h是高斯核函数。将B赋值为imfilter函数的输出结果,即可得到一维高斯滤波后的图像。 需要注意的是,在使用一维高斯滤波时,应该选择合适的标准差,以达到最佳的平滑效果。过大或者过小的标准差都会导致图像信息的损失,影响图像处理效果。同时,一维高斯滤波也只适用于线性平滑,如果图像中包含了非线性的信息,可能需要使用其他的滤波方法。 ### 回答2: Matlab一维高斯滤波用于对一维信号的平滑处理,主要基于高斯分布的特性,可以去除一些随机噪声、提取有效信号等。其数学模型为: G(x)=1/(√2πσ)exp(-(x-μ)²/(2σ²)) 其中G(x)表示高斯分布函数,x表示信号的每个数据点,μ代表分布的均值,σ代表方差。在Matlab中,可以采用内置函数gausswin(n,α)生成卷积核,其中n表示生成核的长度,α表示高斯窗口的形状。然后,可以使用Matlab内置的卷积函数conv(x,h)对信号进行滤波处理,其中x为原始信号,h为采用gausswin函数生成的卷积核。具体步骤如下: 1. 生成高斯窗口 由于高斯窗口的形状不同,所得到的滤波效果也不同。常采用默认的形状,例如gausswin(n)生成一个长度为n的高斯窗口,默认的窗口形状为α=0.5,也可以手动设定。 2. 原信号与高斯窗口卷积 由于Matlab内置的卷积函数是线性卷积函数,而高斯函数是非线性函数,因此需要对高斯函数进行中心对称化处理。处理方法为将高斯窗口翻转一下再与原始信号的卷积,这样可以避免信号边缘的信息丢失。 3. 执行滤波操作 对卷积结果进行滤波操作,可以使用内置函数filter()实现。也可以使用移动平均法或其它滤波方法处理。 4. 画出滤波结果的波形图 为了更直观地了解信号的变化、滤波效果的好坏、优化滤波参数等,需要将滤波后的结果绘制成波形图。 总之,Matlab中的一维高斯滤波是利用高斯函数对信号进行平滑处理、去除噪声的算法,在信号处理、图像处理、数据挖掘等领域具有广泛应用。 ### 回答3: 一维高斯滤波是一种常用的信号处理方法,通常用于去除信号中的噪声等干扰。在 MATLAB 中,可以使用 Gausswin 函数生成高斯窗口,并使用 conv 函数对信号进行滤波。 具体步骤如下: 1. 生成高斯窗口。可以使用 Gausswin 函数,其语法为 w = gausswin(N,alpha),其中 N 表示窗口长度,alpha 表示高斯窗口的标准差。例如,可以生成长度为 11,标准差为 2 的高斯窗口: w = gausswin(11,2); 2. 对信号进行滤波。可以使用 conv 函数,其语法为 y = conv(x,w),其中 x 表示输入信号,w 表示高斯窗口。例如,可以对信号 x 进行高斯滤波: y = conv(x,w); 需要注意的是,在进行卷积操作时需要选择合适的边界条件,以避免滤波后信号长度发生变化。可以使用 padarray 函数在信号两端填充适当的值。 此外,还可以使用 gaussfilt 函数对信号进行高斯滤波,其语法为 y = gaussfilt(x,sigma),其中 x 表示输入信号,sigma 表示高斯滤波器的标准差。例如,可以对信号 x 进行标准差为 2 的高斯滤波: y = gaussfilt(x,2); 总之,一维高斯滤波是一种简单而常用的信号处理方法,可以有效地去除信号中的噪声和干扰。在 MATLAB 中,可以选择使用 Gausswin 函数和 conv 函数或 gaussfilt 函数来实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值