这是一个外国人的算法,本人是搬运工。参考:http://blog.ivank.net/fastest-gaussian-blur.html

 

1:高斯模糊算法(参考:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html)

所谓的模糊算法就是当前像素点和周围像素点进行加权均值之后的结果替换当前像素值。因此均值模糊是最简单的,只要将周围的像素点相加取平均值即可。

    而高斯模糊则是将周围的像素点的权值按照高斯分布进行取值,即根据距离当前像素点的距离确定取值的权值。如下图:距离当前像素点越近权值越高,反之越低。之所以这么做是因为高斯模糊出来的效果比较好。

(图片来自:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html)

 

2:高斯模糊的时间复杂度

    假设图片的像素宽,高是(w*h),模糊半径是r,那么二维的高斯模糊的时间复杂度是w*h*r*r,如果图片过大则时间复杂度很高(见二维的高斯分布)。而一般的解决办法就是将二维的变为一维,因为高斯分布支持卷积运算(参考:http://blog.csdn.net/liguan843607713/article/details/42215965),因此先进行x方向的一维的高斯模糊,在进行y轴方向的一维高斯模糊,这样做出来的效果是一样的(见一维的高斯分布)。

    但是即使这样高斯模糊的时间复杂度是w*h*2*r,仍然很高。所以需要另一种办法解决。

二维的高斯分布

 

一维的高斯分布

 

3:最快速的高斯模糊

    其实这篇文章(http://blog.ivank.net/fastest-gaussian-blur.html)给出的并不是真正的高斯模糊,而是使用均值模糊(box blur)进行拟合之后,效果接近高斯模糊。均值模糊之所以快速是因为进行模糊处理时当前的像素值的计算可以利用到之前只算的值,所以不必重复计算。而均值模糊也可以进行卷积计算,可以讲二维的降为一维。因此大大减少了时间的消耗。

    根据这篇论文(http://www.csse.uwa.edu.au/~pk/research/pkpapers/FastGaussianSmoothing.pdf),基本上3次均值模糊就可以接近于高斯模糊(本人论文并没有研读,只是直接使用了http://blog.ivank.net/fastest-gaussian-blur.html给出的计算半径的公式)。问题的关键就在于怎么根据高斯模糊的半径,找到对应的均值模糊模糊的半径。上述网址给出了计算方法:

 

    总之,总结起来就是,利用多次均值模糊进行拟合成高斯模糊。一般来说3次就可以达到效果。因为均值模糊的时间复杂度是w*h,所以利用多次均值模糊代替高斯模糊的时间复杂度大大减少。具体效果参考http://blog.ivank.net/fastest-gaussian-blur.html

 

4:说明

    在Android最快的高斯模糊并不是以上的两种方法,而是使用RenderScript,但是RenderScript的缺点是模糊半径不能大于25。在实际应用中可以先将图片缩小模糊,再放大可以节省很多时间。

 

5:Android源代码分享:

    Android代码包括,一个一维的标准的高斯模糊和利用3次均值模糊拟合过的"最快速高斯模糊"。利用jni编写。

 

代码Github网址:https://github.com/amazingyyc/fasted_gauss_blur

 

原始图片,670x455的分辨率

 

模糊后的效果:可以看到两个算法时间差别巨大!!

最快速的“高斯”模糊算法(附Android源码)的更多相关文章

  1. java实现插入排序算法 附单元测试源码

    插入排序算法 public class InsertSortTest { /** * @param args */ public static void main(String[] args) { i ...

  2. Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

    昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...

  3. <转>如何高效快速看懂Android源码

    原网址:http://jingyan.baidu.com/article/574c5219ca78ed6c8d9dc12a.html 在Android系统上工作了一段时间,经常会遇到题目中的问题,下面 ...

  4. 快速下载android源码

    众所周知的原因,android源码被墙了,还好国内有不少镜像,这里使用清华提供的镜像. 以下内容转自: https://wiki.tuna.tsinghua.edu.cn/MirrorUsage/an ...

  5. 2014年最新720多套Android源码2.0GB免费一次性打包下载

    之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年3月份开始不断整理源码区和其他网站上的android源码,目前总共有720套左右,根据实现的功能被我分成了100多个类,总共 ...

  6. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  7. Android源码阅读 – Zygote

    @Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...

  8. android源码的目录结构

    android源码的目录结构 [以下网络摘抄] |-- Makefile ! l/ a5 n% S% @- `0 d# z# a$ P4 V3 o7 R|-- bionic              ...

  9. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

随机推荐

  1. 如何使用深度学习破解验证码 keras 连续验证码

    在实现网络爬虫的过程中,验证码的出现总是会阻碍爬虫的工作.本期介绍一种利用深度神经网络来实现的端到端的验证码识别方法.通过本方法,可以在不切割图片.不做模板匹配的情况下实现精度超过90%的识别结果. ...

  2. Javascript 精髓整理篇之二(函数篇)postby:http://zhutty.cnblogs.com

    今天总结的内容是javascript的function, 涉及到function顺便讲讲this. Function 是javascript的函数,也是js的执行单元.函数是JavaScript的一种 ...

  3. 高性能WEB开发(11) - flush让页面分块,逐步呈现

    高性能WEB开发(11) - flush让页面分块,逐步呈现 在处理比較耗时的请求的时候,我们总希望先让用户先看到部分内容,让用户知道系统正在进行处理,而不是无响应.一般大家在处理这样的情况,都使用a ...

  4. POJ 2318 TOYS/POJ 2398 Toy Storage

    计算几何终于开坑了... 叉积+二分. #include<iostream> #include<cstdio> #include<cstring> #include ...

  5. mybatis之mapper.xml分析

    select: id:方法名,在同一个mapper.xml中,要保持唯一 parameterType:指定输入的参数类型,不是必须的,如果不指定,mybatis会自动识别(推荐指定). resultT ...

  6. virtual-虚方法

    看来本人理论果然不行啊,这个东西折腾死我了.即便是到现在,还是云里雾里.... 个人认为virtual的特点就是可以被override而不是必需的,到目前为止我用它的地方也比较少. public cl ...

  7. asp.net验证控件注意事项

    1.如果触发某个控件事件是只对指定验证控件进行验证,可以将验证控件和被触发控件放到到一个ValidationGroup中.比如点提交按钮的时候,验证文本框,可以将提交按钮和验证控件放到一个Valida ...

  8. ArcGIS Server 9.3 安装(win7).

    概述: 安装的过程还不算复杂,但是有个地方需要注意:就是防火墙.需要将 "本机的防火墙" 关掉, 并将 "杀毒软件关闭"(360和avira都会乱来,搞得我安了 ...

  9. .Net HttpClient 模拟登录微信公众平台发送消息

    1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...

  10. struts2 JS获取上传文件的绝对路径,兼容IE和FF

    因为file控件上传失败后会自动清空,所以使用文本框来保存上传路径,而且在不同的浏览器下,控件的样式也需要兼容.下面是自己用到的实例 // 初始化判断浏览器的版本,根据版本的不同使用不同的样式func ...