这是一个外国人的算法,本人是搬运工。参考: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. JS浏览器对象-计时器

    setInterval用法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  2. Socket tips: UDP Echo service - Server code

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...

  3. Use GraceNote SDK in iOS(一)通过序列化GDO查询专辑封面

    于Use MusicBrainz in iOS之后,因为MusicBrainz找出专辑封面,它只能转移到其他网站提供的音乐信息搜索服务,领导给出GraceNote.(有压力.. .) 需求类似:通过一 ...

  4. (转)Phonegap VS AppCan

    简介 Phonegap PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够利用iPhone,Android,Palm,Sym ...

  5. taglib的使用

    使用自定义的taglib可以是我们对页面数据的处理放在后台,不仅使用方便,而且影藏了处理逻辑,也更加的安全. 需要使用到servlet.jar 1.在web-inf下建立taglib.tld文件 &l ...

  6. Flex布局摆脱float带来的布局问题

    完整文章地址http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool 使用浮动(float)的一个比较疑惑 ...

  7. jQuery自学笔记(五):关于jQuery的遍历

    向上遍历 DOM 树 parent()  //返回被选元素的直接父元素,该方法只会向上一级对 DOM 树进行遍历. parents()    //返回被选元素的所有祖先元素,它一路向上直到文档的根元素 ...

  8. ASP.NET环境下集成CKEditor与CKEditor实现文件上传

    1.从http://ckeditor.com网站上下载ckeditor_aspnet_3.6.4与ckfinder_aspnet_2.4; 2.解压下载的文件ckeditor_aspnet_3.6.4 ...

  9. 分割gbk中文出现乱码的问题解决

    近日遇到一个神奇的字“弢(tao)”. 具体的过程是这样的: $list = explode('|', 'abc弢|bc'); var_dump($list); 取得这个分割的结果. 和想象不同,结果 ...

  10. 项目中redis类似MVC的使用