高斯滤波器原理及其实现

高斯滤波器原理及其实现高斯滤波器是空间滤波器的一种 学习高斯滤波器 需要空间滤波的知识作为先验知识 各种数字图像处理的书中都有介绍 冈萨雷斯的经典教材说的还是比较清楚的 建议看英文版 个人感觉比翻译过来的更容易理解 nbsp nbsp nbsp nbsp 高斯滤波器是一种平滑线性滤波器 使用高斯滤波器对图像进行滤波 其效果是降低图像灰度的 尖锐 变化 也就是使图像 模糊 了 高斯滤波对于抑制服从正态分布的噪声效果非常好 其代价是

        高斯滤波器是空间滤波器的一种,学习高斯滤波器,需要空间滤波的知识作为先验知识(各种数字图像处理的书中都有介绍,冈萨雷斯的经典教材说的还是比较清楚的,建议看英文版,个人感觉比翻译过来的更容易理解)。

        高斯滤波器是一种平滑线性滤波器,使用高斯滤波器对图像进行滤波,其效果是降低图像灰度的“尖锐”变化,也就是使图像“模糊”了。高斯滤波对于抑制服从正态分布的噪声效果非常好,其代价是使图像变得“模糊”。当然,有时对图像进行平滑滤波的目的就是让图像变得模糊。

        高斯滤波的模板是用高斯公式计算出来的。下面是一维和二维高斯分布函数及其函数图像:

        一维高斯分布函数:                                     二维高斯分布函数:

                  高斯滤波器原理及其实现                       高斯滤波器原理及其实现

        它们的图像分别为:                                                                      

 高斯滤波器原理及其实现   高斯滤波器原理及其实现

        那么高斯滤波模板是怎么生成的呢?是通过二维高斯函数计算出来的。例如,我们假设一个高斯模板的长、宽均为5,方差为0.5,那么首先,我们要在模板上建立一个坐标系,其原点就是高斯模板的中心点,如下图:

高斯滤波器原理及其实现


        然后每个模板的坐标就可以确定了:

                    高斯滤波器原理及其实现




        每个格子对应的坐标,就是二维高斯分布中的(x,y)坐标的值。现在,我们可以计算出高斯模板上每个坐标位置的系数了。例如:

        (-2,2)上的权值:W = 高斯滤波器原理及其实现,把pi = 3.14,  σ=0.5,x=-2,y=2带入上式,获得(-2,2)处的权值。

       同理,可以计算 其他位置的权值。

        最后获得一个5*5,标准差σ为0.5的高斯滤波器(经过归一化以后):

        高斯滤波器原理及其实现

        matlab中可以使用fspecial函数实现高斯滤波模板,使用方法为:YourFilter = fspecial(‘gaussian’, [ 5 5], 0.5);

        在matlab中可以查看fspecial的源代码,通过open fspecial打开。我之前自己写了一个matlab版的实现高斯模板的代码,通过与fspecial的源代码对比,有些不一样的地方,而且我的代码确实不如自带的快,所以在这里只贴源代码。

        fspecial函数可以实现多种类型的滤波器,当第一个参数为”gaussian’时,实现的是高斯滤波器,源代码通过switch判断用户想得到哪种类型的滤波器,这里只把与高斯滤波器有关的代码贴出来,并放在一个函数中,我们把这个函数命名为gaussianFilter。函数的代码如下:

        

  1. function h = gaussianTemplate2( p2, p3 )  
  2. %p2是模板的大小,以[m n]的形式定义  
  3. %p3是标准差,即σ  
  4. %h是输出的高斯模板  
  5. %以下代码是从fspecial中贴出来的代码  
  6.   
  7.     siz   = (p2-1)/2;           %siz为模板行与列各自最大的坐标值  
  8.     std   = p3;                 %标准差幅值给std  
  9.   
  10.     %通过meshgrid产生模板上所有位置的x和y的值,这样的好处是可以避免使用循环去  
  11.     %变换坐标值,提高程序运行的速度  
  12.     [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));  
  13.       
  14.     %二维高斯分布公式中e的指数  
  15.     arg   = -(x.*x + y.*y)/(2*std*std);  
  16.   
  17.     %这里没有乘以1/2*pi*σ^2,也就是没有乘以e前面的系数,因为后面在作归一化的  
  18.     %时候,会把这个系数约去,所以在这里直接省去乘法运算,提高程序运行速度  
  19.     h     = exp(arg);  
  20.       
  21.     %这句话没有太理解,貌似只有在max(h(:))大于1的时候h才有可能小于eps*max(h(:))  
  22.     %个人理解应该是限制一下h中的权值,如果权值相对于h中的最大值特别小的话,可以  
  23.     %忽略不计,使之为零  
  24.     h(h

  25.   
  26.     %归一化  
  27.     sumh = sum(h(:));  
  28.     if sumh ~= 0,  
  29.         h  = h/sumh;  
  30.     end;  
  31. end  
function h = gaussianTemplate2( p2, p3 ) %p2是模板的大小,以[m n]的形式定义 %p3是标准差,即σ %h是输出的高斯模板 %以下代码是从fspecial中贴出来的代码 siz = (p2-1)/2; %siz为模板行与列各自最大的坐标值 std = p3; %标准差幅值给std %通过meshgrid产生模板上所有位置的x和y的值,这样的好处是可以避免使用循环去 %变换坐标值,提高程序运行的速度 [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1)); %二维高斯分布公式中e的指数 arg = -(x.*x + y.*y)/(2*std*std); %这里没有乘以1/2*pi*σ^2,也就是没有乘以e前面的系数,因为后面在作归一化的 %时候,会把这个系数约去,所以在这里直接省去乘法运算,提高程序运行速度 h = exp(arg); %这句话没有太理解,貌似只有在max(h(:))大于1的时候h才有可能小于eps*max(h(:)) %个人理解应该是限制一下h中的权值,如果权值相对于h中的最大值特别小的话,可以 %忽略不计,使之为零 h(h 
   

        获得高斯模板后,使用imfilter函数对图像进行滤波,即可获得高斯滤波效果。下面我们使用不同的高斯滤波器,对同一幅图像进行滤波,滤波的结果如下所示:

高斯滤波器原理及其实现    高斯滤波器原理及其实现

                            原始图像                                                           加入高斯噪声图像

高斯滤波器原理及其实现    高斯滤波器原理及其实现


         使用5*5,方差为0.5的高斯滤波器滤波                             使用5*5,方差为1.5的高斯滤波器滤波

高斯滤波器原理及其实现


     使用11*11,方差为0.5的高斯滤波器滤波

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220886.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:26
下一篇 2026年3月17日 下午7:26


相关推荐

  • simhash java_雪花算法原理

    simhash java_雪花算法原理一篇不错的介绍simhash的文章,如下http://blog.csdn.net/chenguolinblog/article/details/50830948

    2026年4月16日
    5
  • android短信验证码方案,Android之短信验证码

    android短信验证码方案,Android之短信验证码今天所使用的方案只是android手机设备集成短信验证码功能的方案之一。我们所采用的方案是使用聚合数据的短信验证sdk。接口文档:https://www.juhe.cn/docs/api/…程序的界面如下所示:实现步骤:1.到聚合数据官网上申请短信验证SDK数据,生成AppKey,如下图所示:2.配置工程,把相关的sdk库导入到Project中去,:3.配置AndroidManifest.xm…

    2022年7月25日
    9
  • cuda 并行计算(cuda并行程序设计pdf)

    CUDA编程(四)并行化我们的程序上一篇博客主要讲解了怎么去评估CUDA程序的表现,博客的最后我们计算了在GPU上单线程计算立方和的程序的内存带宽,发现其内存带宽的表现是十分糟糕的。这篇博客主要讲解了怎么去使用Thread去简单的并行我们的程序,虽然我们的程序运行速度有了50甚至上百倍的提升,但是根据内存带宽来评估的话我们的程序还远远不够,甚至离1G/S的水平都还差不少,所以我们的优化路还有很长。

    2022年4月16日
    47
  • 月之暗面 Kimi吐槽百度,百度困在了广告中

    月之暗面 Kimi吐槽百度,百度困在了广告中

    2026年3月12日
    3
  • tomcat查看日志[通俗易懂]

    tomcat查看日志[通俗易懂]随笔-168文章-1评论-8linux下实时查看tomcat运行日志 1、先切换到:cdhome/tomcat/logs 2、tail-fcatalina.out 3、这样运行时就可以实时查看运行日志了 4.Ctrl+c是退出tail命令 eg: [root@TEST-Alogs]#ls catalina.20…

    2022年6月20日
    36
  • Linux设置FQDN

    Linux设置FQDNFQDN 是 FullyQualifi 的缩写 含义是完整的域名 例如 一台机器主机名 hostname 是 www 域后缀 domain 是 example com 那么该主机的 FQDN 应该是 www example com 另外 其实 FQDN 最后是以 来结尾的 但是大部分的应用和服务器都允许忽略最后这个点 Linux 允许用户通过 hostnam

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号