最快速的“高斯”模糊算法(附Android源码)
这是一个外国人的算法,本人是搬运工。参考: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源码)的更多相关文章
- java实现插入排序算法 附单元测试源码
插入排序算法 public class InsertSortTest { /** * @param args */ public static void main(String[] args) { i ...
- Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决
昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...
- <转>如何高效快速看懂Android源码
原网址:http://jingyan.baidu.com/article/574c5219ca78ed6c8d9dc12a.html 在Android系统上工作了一段时间,经常会遇到题目中的问题,下面 ...
- 快速下载android源码
众所周知的原因,android源码被墙了,还好国内有不少镜像,这里使用清华提供的镜像. 以下内容转自: https://wiki.tuna.tsinghua.edu.cn/MirrorUsage/an ...
- 2014年最新720多套Android源码2.0GB免费一次性打包下载
之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年3月份开始不断整理源码区和其他网站上的android源码,目前总共有720套左右,根据实现的功能被我分成了100多个类,总共 ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- Android源码阅读 – Zygote
@Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...
- android源码的目录结构
android源码的目录结构 [以下网络摘抄] |-- Makefile ! l/ a5 n% S% @- `0 d# z# a$ P4 V3 o7 R|-- bionic ...
- Android源码-学习随笔
在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...
随机推荐
- Truncate Table 用法
TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作. 语法 TRUNCATE TABLE name 参数 name 是要截断的表的名称或要删除其全部行的表的名称. 注释 TRUNC ...
- C++编程规范之20:避免函数过长,避免嵌套过深
摘要: 短胜于长,平胜于优,过长的函数和嵌套过深的代码块的出现,经常是因为没能赋予一个函数以一个紧凑的职责所致,这两种情况通常都能够通过更好的重构予以解决. 每个函数都应该顾其名而能知其义,易于理解的 ...
- HDU 1874-畅通project续(最短路Dijkstra+优先队列)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- wm命令用法及LCD显示图标大小不正常时解决的方法
注:Android 4.3引入的wm工具 wm命令及使用方法: 系统说明: usage: wm [subcommand] [options] ...
- C程序设计的抽象思维-算法分析-大多数元素
[问题] 请编写下面函数 int MajorityElement(int array[],int n); 该函数返回数组array中的多数元素.多数元素是指在占绝对多数(至少51%)的一个值.假设多数 ...
- web性能优化——JSP
一.啰嗦 做web开发的都知道,性能的重要性就不必强调了.就前端展示的工作来说,jsp大家都熟悉html更熟悉:web服务器tomcat应该是最熟悉的了:web方面的基础知识上来说,静态页面比动态页面 ...
- setTimeout 理解
1.定义简介 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. function foo(){}; var id = setTimeout(foo,1000); //返回一 ...
- 解决SQL Server 占用80端口
停用掉下面的服务就可以了:
- MVC 5 下,应用log4net收集异常信息
1.安装log4net. 首先在VS中通过nuget安装logenet,我用的是VS2013,截屏如下:
- Swift 变量、常量、数据类型
import Foundation print("HelloSwift") // 声明变量 var a = var b = a = b = // 常量 let c = a+b va ...