高斯平滑 高斯模糊 高斯滤波器 ( Gaussian Smoothing, Gaussian Blur, Gaussian Filter ) C++ 实现 -程序员宅基地

技术标签: filter  image  input  c++  distance  templates  

发展到现在这个平滑算法的时候, 我已经完全不知道如何去命名这篇文章了, 只好罗列出一些关键字来方便搜索了.

在之前我们提到过了均值滤波器, 就是说某像素的颜色, 由以其为中心的九宫格的像素平均值来决定. 在这个基础上又发展成了带权的平均滤波器, 这里的高斯平滑或者说滤波器就是这样一种带权的平均滤波器. 那么这些权重如何分布呢? 我们先来看几个经典的模板例子:

尝试了使用这些滤波器对我们原来的图进行操作, 得到了这样的一组结果:

原图:

raw

3x3 高斯:

3x3

5x5 高斯:

5x5

单纯从效果来看, 两个模板都起到了平滑的作用, 只是程度有深浅的区分. 那么从理论上来说为什么能起到平滑的作用呢? 很显然, 像素的颜色不仅由自身决定了, 同时有其周围的像素加权决定, 客观上减小了和周围像素的差异. 同时这些权重的设定满足了越近权重越大的规律. 从理论来讲, 这些权重的分布满足了著名的所谓高斯分布:

  这就是1维的计算公式

这就是2维的计算公式

x, y表示的就是当前点到对应点的距离, 而那些具体的模板就是由这里公式中的一些特例计算而来. 需要说明的是不只有这么一些特例, 从wikipedia可以方便地找到那些复杂的模板比如像:

Sample Gaussian matrix

This is a sample matrix, produced by sampling the Gaussian filter kernel (with σ = 0.84089642) at the midpoints of each pixel and then normalising. Note that the center element (at [4, 4]) has the largest value, decreasing symmetrically as distance from the center increases.

0.00000067 0.00002292 0.00019117 0.00038771 0.00019117 0.00002292 0.00000067
0.00002292 0.00078633 0.00655965 0.01330373 0.00655965 0.00078633 0.00002292
0.00019117 0.00655965 0.05472157 0.11098164 0.05472157 0.00655965 0.00019117
0.00038771 0.01330373 0.11098164 0.22508352 0.11098164 0.01330373 0.00038771
0.00019117 0.00655965 0.05472157 0.11098164 0.05472157 0.00655965 0.00019117
0.00002292 0.00078633 0.00655965 0.01330373 0.00655965 0.00078633 0.00002292
0.00000067 0.00002292 0.00019117 0.00038771 0.00019117 0.00002292 0.00000067

是不是看到就头大了:) 不过没关系, 对于一般的应用来说, 前面的例子已经可以完成任务了.  代码的话我们还是给一份5x5的example:

  1. /**  
  2. ** method to remove noise from the corrupted image by gaussian filter value  
  3. * @param corrupted input grayscale binary array with corrupted info  
  4. * @param smooth output data for smooth result, the memory need to be allocated outside of the function  
  5. * @param width width of the input grayscale image  
  6. * @param height height of the input grayscale image  
  7. */   
  8. void  gaussianFilter2 (unsigned  char * corrupted, unsigned  char * smooth,  int  width,  int  height)  
  9. {  
  10.     int  templates[25] = { 1, 4, 7, 4, 1,   
  11.                           4, 16, 26, 16, 4,   
  12.                           7, 26, 41, 26, 7,  
  13.                           4, 16, 26, 16, 4,   
  14.                           1, 4, 7, 4, 1 };        
  15.       
  16.     memcpy ( smooth, corrupted, width*height*sizeof (unsigned  char ) );  
  17.     for  ( int  j=2;j<height-2;j++)  
  18.     {  
  19.         for  ( int  i=2;i<width-2;i++)  
  20.         {  
  21.             int  sum = 0;  
  22.             int  index = 0;  
  23.             for  (  int  m=j-2; m<j+3; m++)  
  24.             {  
  25.                 for  ( int  n=i-2; n<i+3; n++)  
  26.                 {  
  27.                     sum += corrupted [ m*width + n] * templates[index++] ;  
  28.                 }  
  29.             }  
  30.             sum /= 273;  
  31.             if  (sum > 255)  
  32.                 sum = 255;  
  33.             smooth [ j*width+i ] = sum;  
  34.         }  
  35.     }  
  36. }  

附带说一些,很明显,和均值滤波器类似, 这个滤波器没有消除校验噪声的作用.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sun_xu/article/details/5669504

智能推荐

一个列子演示java中弱引用的回收时机_java弱引用在什么阶段被回收-程序员宅基地

文章浏览阅读2.1k次。示例代码如下import java.lang.ref.WeakReference;/** * * 弱引用比软引用还要弱,在系统GC时候,只要发现弱引用,不管系统堆空间使用情况如何,都会将对象回收 * 该类演示了弱引用的这种性质 * @author lhever 2017年4月4日 下午10:04:26 * @version v1.0 */public class WeakRef{_java弱引用在什么阶段被回收

色温 色调 饱和度 白平衡--摄影基础理论(4)_色温 饱和度的区别-程序员宅基地

文章浏览阅读9.5k次。色温在一个完全无光的密封、真空空间内,给一块纯黑色碳进行加热,当温度达到一定级别的时候,黑炭会开始发光,随着加热温度的提升,黑炭的发光颜色会发生变化。当温度从零开始逐渐升高,黑炭从不发光开始变成发光的状态,而发出光的颜色会随着加热温度的提升而发生变化,加热温度较低时,木炭发光的颜色偏红黄,加热温度慢慢提升时,木炭发光的颜色慢慢由黄逐渐变得越来越蓝。色温表如下对于摄影来说_色温 饱和度的区别

Git版本控制-程序员宅基地

文章浏览阅读675次,点赞5次,收藏17次。Git版本控制

MYSQL--JSON_OBJECT 和 JSON_ARRAYAGG_json_arrayagg(json_object-程序员宅基地

文章浏览阅读532次,点赞9次,收藏10次。和是 MySQL 中用于处理 JSON 数据类型的函数。这两个函数可以帮助你更轻松地构建和操作 JSON 数据。_json_arrayagg(json_object

centos7 安装php扩展mongodb 心得_centos7 安装php72w-mongodb 扩展-程序员宅基地

文章浏览阅读2.5k次。有时候安装一些东西总是会遇到一些问题,问题不大,记录下来,也算是实践心得吧。git clone https://github.com/mongodb/mongo-php-driver.git cd 目录phpize发现出现报错应该是是这样才对。经过查询,发现缺少东西,安装。git submodule sync && git submodule u_centos7 安装php72w-mongodb 扩展

面试反客为主 TCP_为什么tcp的初始化序列号不同-程序员宅基地

文章浏览阅读155次。3 传输层 TCP/UDP承接上文HTTP,数据经过应用层就到传输层,但数据到传输层之前需要先获得服务端的 IP 地址,这就涉及到DNS域名解析。3.1 DNS3.1.1 DNS 讲解主机的真正地址是IP,问题是IP地址不方便人们记忆,就像你拿手机给张三打电话,难道你能瞬间说出张三电话号码么,手机里做一个名字跟电话的映射即可,想通话时直接从通讯录找到张三就可以找到对应的手机号,在网络请求时候也是需要映射的,而域名服务器Domain Name System就是干这个事的,深入..._为什么tcp的初始化序列号不同

随便推点

Brew 卸载MySql以及安装Mysql_brew navicat-for-mysql-程序员宅基地

文章浏览阅读2w次,点赞3次,收藏10次。卸载: 1.brew remove mysql 2.brew cleanup 3.launchctl unload -w ~/Library/LaunchAgents/com.mysql.mysqld.plist 4.rm ~/Library/LaunchAgents/com.mysql.mysqld.plist 5.sudo rm -rf /usr/..._brew navicat-for-mysql

太阳能光伏模型的参数确定及模型应用介绍_光伏电池理想模型与五参数模型-程序员宅基地

文章浏览阅读951次,点赞28次,收藏28次。​太阳能通过光伏(PV)发电系统转化为电能。通过使用新材料技术,一直致力于提高光伏系统中太阳能电池的功率转换效率。基于钙钛矿太阳能电池的冠军器件具有24.8%的认证功率转换效率,仍有很大的改进空间。因此,对精确的光伏电池模型进行仿真、控制和优化对于使光伏发电系统在不同天气条件和温度下具有更高和稳定的转换效率具有帮助和至关重要。关于光伏模型,有几种主流模型,包括单二极管模型(SDM),双二极管模型(DDM),三二极管模型(TDM),光伏组件模型(MM)等。_光伏电池理想模型与五参数模型

Vulkan 提高路径——用VulkanSDK中的Sample及其Documents和 闻名遐迩的VSG为资料,win10 64位 VS2019 community_vulkanscenegraph-程序员宅基地

文章浏览阅读1.6k次。Vulkan确实很牛,这毋庸置疑。需要质疑的是我们能够多大程度上驾驭Vulkan。第一步. 下载升级安装自己机器的相关显卡的驱动,intel和amd的集显,或者nvidia和amd的独显,只要显卡不太太老,安装图形卡最新驱动。第二步. 本链接下载lunarg的VulkanSDK,用的是win10的64位版本。有另外三种版本可选 。可能有的浏览器显示不全页面内容,遇此的话,更换..._vulkanscenegraph

uniapp原生插件之安卓虹软人脸识别增值版原生插件_uniapp 虹软-程序员宅基地

文章浏览阅读610次,点赞8次,收藏6次。虹软人脸识别增值版支持在线激活,离线激活,支持图片人脸识别(可识别网络图片),活体检测,离线识别,相机预览旋转,相机人脸识别,批量注册(支持网络图片)等,支持保存用户的id和名称本插件是增值版插件,如果您想使用免费版插件请。_uniapp 虹软

spring-cloud-alibaba微服务Sentinel-程序员宅基地

文章浏览阅读1.1k次,点赞20次,收藏10次。spring-cloud-alibaba微服务Sentinel

python顺序读取文件夹中的图片方法_pycharm按原顺序读取文件夹图片-程序员宅基地

文章浏览阅读1.4w次,点赞14次,收藏73次。 https://blog.csdn.net/qq_22227123/article/details/79903116  https://blog.csdn.net/merdy_xi/article/details/78409632  涉及到文件操作,我们有时候会读取一个文件夹中的所有的文件。这些文件可能是文件名完全混乱的,也可能是完全格式化的(如1.png,2.png...)。下面介绍Python中的几种按顺序(假如有)读取文件夹中文件的方法。  首先不得不说的是python中的os.list_pycharm按原顺序读取文件夹图片

推荐文章

热门文章

相关标签