最快速的“高斯”模糊算法(附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/ 书籍: ...
随机推荐
- [Qt] CFlip 翻页功能实现
由于需要给table制作翻页功能,所以写了一个翻页的类. 看上去总体效果感觉还是不错的,哈哈. //flip.h #ifndef CFLIP_H #define CFLIP_H #include &l ...
- iOS socket 实现tcp和服务器长链接的简单使用心得
首先iOS端用了一个第三方的框架 GCDAsyncSocket 当然这个是CocoaAsyncSocket框架里面的一部分 Github下载地址https://github.com/robbiehan ...
- 如何让asp.net mvc 直接运行mobile页面
在controller里面加上下面一句 HttpContext.SetOverriddenBrowser(BrowserOverride.Mobile);
- 如何解决svn图标不显示呢?
svn图标不显示解决 确保设置正确: 右键->TortoiseSVN->setting->Icon Overlays->Status cache->default/She ...
- 网站项目后台的目录命名为admin后,网页莫名其妙的变样了
这是我的第一篇博客文章,与其说是分享经验,倒不如说是求助 最近因为要完成一个课程设计,在拿一个现成的项目过来改,要用到select下拉菜单,可是发觉怎么我的这个下拉菜单怎么变样了 刚开始它是这样的 感 ...
- js获得url的参数
网上找的一段代码,非常好用,现在难以找到原作者,但是非常感谢!/** * 获取当前URL参数值 * @param name 参数名称 * @return 参数值 */ function ...
- 使用Teleport Pro离线下载网页所有内容
在学习生活中,碰到网页中内容太多,如何讲其保存到本地,已方便随时查看呢? 使用Teleport Pro就可以解决问题: 首先下载Teleport Pro V1.54 汉化绿色版的,解压完之后 ...
- (转)SQL NEWID()随机函数
从A表随机取2条记录,用SELECT TOP 10 * FROM ywle order by newid()order by 一般是根据某一字段排序,newid()的返回值 是uniqueidenti ...
- 多维背包 hrbudt 1335 算法与追MM
hrbust #include<string.h> //多进制储存数,第i位进制维back[i]+1,可以避免重复 #include<stdio.h> using namesp ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...