专栏首页顶级程序员高斯模糊的算法

高斯模糊的算法

来自:阮一峰的网络日志 链接:www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。

"模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussian Blur)。它将正态分布(又名"高斯分布")用于图像处理。

本文介绍"高斯模糊"的算法,你会看到这是一个非常简单易懂的算法。本质上,它是一种数据平滑技术(data smoothing),适用于多个场合,图像处理恰好提供了一个直观的应用实例。

一、高斯模糊的原理

所谓"模糊",可以理解成每一个像素都取周边像素的平均值。

上图中,2是中间点,周边点都是1。

"中间点"取"周围点"的平均值,就会变成1。在数值上,这是一种"平滑化"。在图形上,就相当于产生"模糊"效果,"中间点"失去细节。

显然,计算平均值时,取值范围越大,"模糊效果"越强烈。

上面分别是原图、模糊半径3像素、模糊半径10像素的效果。模糊半径越大,图像就越模糊。从数值角度看,就是数值越平滑。

接下来的问题就是,既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?

如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。

二、正态分布的权重

正态分布显然是一种可取的权重分配模式。

在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。

计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

三、高斯函数

上面的正态分布是一维的,图像都是二维的,所以我们需要二维的正态分布。

正态分布的密度函数叫做"高斯函数"(Gaussian function)。它的一维形式是:

其中,μ是x的均值,σ是x的方差。因为计算平均值的时候,中心点就是原点,所以μ等于0。

根据一维高斯函数,可以推导得到二维高斯函数:

有了这个函数 ,就可以计算每个点的权重了。

四、权重矩阵

假定中心点的坐标是(0,0),那么距离它最近的8个点的坐标如下:

更远的点以此类推。

为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:

这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。

五、计算高斯模糊

有了权重矩阵,就可以计算高斯模糊的值了。

假设现有9个像素点,灰度值(0-255)如下:

每个点乘以自己的权重值:

得到

将这9个值加起来,就是中心点的高斯模糊的值。

对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

六、边界点的处理

如果一个点处于边界,周边没有足够的点,怎么办?

一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。

七、参考文献

* How to program a Gaussian Blur without using 3rd party libraries

本文分享自微信公众号 - 顶级程序员(TopCoding)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员如何在 App Store 上每月赚八万美元?

    对许多程序员来说,给苹果开发应用,多少都要经历一些坑。近日,苹果又在开发者网站上发出通知,自2018年7月起,应用商店的所有应用及更新必须以 iOS 11 SD...

    顶级程序员
  • 携程通报亲子园事件进展:园长被刑拘 两副总裁已停职

    ?   新浪科技讯 11月14日下午消息,携程今日发布亲子园事件内部通报,园方主要责任人郑某被警方刑拘,携程前人力资源副总裁施琦和现任人力资源副总裁冯卫华已停...

    顶级程序员
  • 治污女工程师走近垃圾写代码,监督2.5万家企业排污

    转自:程序猿(imkuqin) 因为一段被偶然拍上网的路旁写代码视频,阿里云算法工程师佳米突然火了。 ? 因为经常和治污项目打交道,佳米当时并没有意识到正在垃...

    顶级程序员
  • 高斯模糊的算法(转)

    "模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussian Blur)。它将正态分布(又名"高斯分布")用于图像处理。

    Jean
  • matlab使用TCP/IP Server Sockets

    server 与 client 通信:(image) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%...

    MachineLP
  • Angular+servlet java实现前后端数据交互

          每学习一个新知识我都会想到的是用它来实现对数据的CRUD,Angularjs也不例外,而实现CRUD的前提就是前后端数据能够进行交互,下面我就展示一...

    cfs
  • 禁止遮罩下页面滑动

    最近在业务中遇见一个问题,就是弹出一个蒙版,覆盖整个页面,有一部分内容固定在底部。可是底部内容还是能滑动。

    wade
  • 【手把手教你】搭建自己的量化分析数据库

    数据是金融量化分析的重要基础,包括股票历史交易数据、上市公司基本面数据、宏观和行业数据等。随着信息流量的日益膨胀,学会获取、查询和加工数据信息变得越来越重要。对...

    Python进阶者
  • lxl再次爆雷,我连夜爬了微博评论,结果。。。

    昨天娱乐圈又又又爆雷了,lixiaolu 和 pg1 的抖音视频疯传网络,看来嫂子就要成内子了。

    周萝卜
  • 百度系无人车创业公司领骏科技完成新一轮融资

    问耕 发自 凹非寺 量子位 出品 | 公众号 QbitAI ? 一家无人车创业公司,再次低调的完成了融资。 领骏科技(leadgentech.ai)创始人杨文利...

    量子位

扫码关注云+社区

领取腾讯云代金券