图像模糊的本质, 从数字信号处理的角度看,图像模糊就要压制高频信号保留低频信号,

压制高频的信号的一个可选择的方法就是卷积滤波。选择一个低频滤波器,对图像上的

每个像素实现低频滤波,这样整体效果就是一张数字图像更加的模糊,显示更少的细节信息。

传统的卷积模糊计算量巨大,程序效率比较低,基于滑动窗口的Box Blur是一种快速模糊方法,

其结果近似于卷积模糊的结果。我没证明过!

一:Box Blur数学原理

根据输入的半径R,计算起始2*R +1个像素的平均值, 作为第一个输出像素的结果,

公式可以表示为

像素 X0 =  其中K代表输入像素集合, i的取值范围为 i∈[-R, R]

然后计算每一行输出像素的值根据Xi = X0 + (K[index + R + 1] – K[index - R])

二:Box Blur的特征

Box Blur是一种快速的图像模糊技术, 相比于传统的卷积模糊,Box Blur可以更有效率的

完成对图像模糊, 模糊的程度取决一下三个输入参数,

1.      X方向上半径 H Radius

2.      Y方向上半径 V Radius

3.      迭代次数 Iteration number

在半径相同的情况下, 迭代次数越多,输出的图像就越模糊

在迭代次数相同的情况下, 像素半径越大, 输出的图像就越模糊

上述两者之间的不同是对图像的拉伸效果, 半径越大,对图像的拉伸效果越显著

Box模糊利用滑动窗口算法,从而简化了每次计算平均值带来额外开销。

从数字图像和信号处理的角度看, Box Blur是一种不折不扣的低通滤波, 但是它并不

是真正的高斯低通滤波, 不是卷积实现, 因而速度更快。

当水平和垂直半径分别为1 时,是典型的3*3 的矩阵卷积

1, 1, 1

1, 1, 1

1, 1, 1

计算, 相比于传统的卷积计算之后,要进行归一化处理,box计算过程中已经完成像素平均,

无需归一化处理。

三:基于滑动窗口算法的Box模糊效果

水平和垂直方向

垂直方向:

水平方向:

四:程序关键代码解析

注释已经很详细的写在代码中,最重要的一个步骤是提前建立index,根据index来找到平均值。

  1. <span style="font-weight: normal;">    public static void blur( int[] in, int[] out, int width, int height, int radius ) {
  2. int widthMinus1 = width-1;
  3. int tableSize = 2*radius+1;
  4. int divide[] = new int[256*tableSize];
  5. // the value scope will be 0 to 255, and number of 0 is table size
  6. // will get means from index not calculate result again since
  7. // color value must be  between 0 and 255.
  8. for ( int i = 0; i < 256*tableSize; i++ )
  9. divide[i] = i/tableSize;
  10. int inIndex = 0;
  11. //
  12. for ( int y = 0; y < height; y++ ) {
  13. int outIndex = y;
  14. int ta = 0, tr = 0, tg = 0, tb = 0; // ARGB -> prepare for the alpha, red, green, blue color value.
  15. for ( int i = -radius; i <= radius; i++ ) {
  16. int rgb = in[inIndex + ImageMath.clamp(i, 0, width-1)]; // read input pixel data here. table size data.
  17. ta += (rgb >> 24) & 0xff;
  18. tr += (rgb >> 16) & 0xff;
  19. tg += (rgb >> 8) & 0xff;
  20. tb += rgb & 0xff;
  21. }
  22. for ( int x = 0; x < width; x++ ) { // get output pixel data.
  23. out[ outIndex ] = (divide[ta] << 24) | (divide[tr] << 16) | (divide[tg] << 8) | divide[tb]; // calculate the output data.
  24. int i1 = x+radius+1;
  25. if ( i1 > widthMinus1 )
  26. i1 = widthMinus1;
  27. int i2 = x-radius;
  28. if ( i2 < 0 )
  29. i2 = 0;
  30. int rgb1 = in[inIndex+i1];
  31. int rgb2 = in[inIndex+i2];
  32. ta += ((rgb1 >> 24) & 0xff)-((rgb2 >> 24) & 0xff);
  33. tr += ((rgb1 & 0xff0000)-(rgb2 & 0xff0000)) >> 16;
  34. tg += ((rgb1 & 0xff00)-(rgb2 & 0xff00)) >> 8;
  35. tb += (rgb1 & 0xff)-(rgb2 & 0xff);
  36. outIndex += height; // per column or per row as cycle...
  37. }
  38. inIndex += width; // next (i+ column number * n, n=1....n-1)
  39. }
  40. }</span>

图像处理------快速均值模糊(Box Blur)的更多相关文章

  1. UnityShader实例13:屏幕特效之均值模糊(Box Blur)

    均值模糊(Box Blur) 概述 因为公司手游项目需求.须要一个适合手机平台的模糊效果,同一时候须要开放一个參数便于调节模糊值.我首先想到的就是ps里面的均值模糊. 查资料能够知道均值模糊是一种高速 ...

  2. opencv3.2.0图像处理之均值滤波blur API函数

    ##.均值滤波:blur函数 ##函数原型 : ,-),int borderType=BORDER_DEFAULT) (参数详解同boxFilter函数) /**********新建Qt控制台程序** ...

  3. Unity Shader-后处理:简单均值模糊

    一.简介   今天来学习一下后处理中比较常用的一种效果,屏幕模糊效果.模糊效果,在图像处理中经常用到,Photoshop中也有类似的滤镜.我们在游戏中也会经常用到.因为屏幕模糊效果是一些高级后处理效果 ...

  4. Unity shader学习之屏幕后期处理效果之均值模糊

    均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...

  5. 图像处理之均值滤波介绍及C算法实现

    1 均值滤波介绍 滤波是滤波是将信号中特定波段频率滤除的操作,是从含有干扰的接收信号中提取有用信号的一种技术. 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临 ...

  6. Unity Shader-简单均值模糊

    http://blog.csdn.net/puppet_master/article/details/52547442 与Amplify中的Simple Blur例子实现一样

  7. OpenCV---高斯模糊(均值模糊的另一种)

    高斯分布: 高斯模糊的原理 一:图像产生高斯噪声循环代码实现(耗时) def clamp(pv): #使我们的随机值在0-255之间 : : return pv import cv2 as cv im ...

  8. 卷积、矩阵乘积、高斯模糊滤波(降噪)、空域计算(2D卷积计算)、频域计算(FFT)的理解

    矩阵乘积:对应行列对应元素相乘的和组成新的矩阵 两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵 并将此乘积记为: ...

  9. [CNN] Understanding Convolution

    From: http://blog.csdn.net/zouxy09/article/details/49080029 一个概念需经过反复的推敲以及时间的沉淀,之后才能真正理解 [OpenCV] Im ...

随机推荐

  1. Call to undefined function mysql_connect()错误原因

    从PHP5.0开始就不推荐使用mysql_connect()函数,到了php7.0则直接废弃了该函数,替代的函数是: mysqli_connect();

  2. wpf datagrid row height 行高自动计算使每行行高自适应文本

    wpf 的datagrid的行高 要么是Auto,要么是定值:但会带来麻烦就是每行行高都一样. 当需要按内容(主要是wrap 换行的textbox或textblock)来动态调整行高的时候,需要用到d ...

  3. Spring-shiro源码陶冶-AuthorizingRealm用户认证以及授权

    阅读源码有助于陶冶情操,本文旨在简单的分析shiro在Spring中的使用 简单介绍 Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能 AuthorizingReal ...

  4. Go基础之--排序和查找操作

    排序操作主要都在sort包中,导入就可以使用了import("sort") 常用的操作 sort.Ints:对整数进行排序sort.Strings:对字符串进行排序sort.Flo ...

  5. 关于http与https之间的区别

    年前的时候进行了一家公司的电话面试两轮,视频面试一轮(已拿到offer),过程中遇到了一个关于http与https的问题,当时回答的并不好,今天将其进行了总结和整理,望读者喜欢: 前言 谷歌在2018 ...

  6. msp430系统时钟

    转自 http://m.blog.csdn.net/blog/msdumin/38441493# MSP430基础时钟模块包含以下3个时钟输入源. 一.4个时钟振荡源 1.LFXT1CLK:  外部晶 ...

  7. memcached安装与使用详解

    一.memcache的简介 memcache是高速,分布式的内存缓存服务器 php的缓存方式一般可以使用memcache技术和redis技术,其中各有优劣,因不同的情况而选择较为适合的缓存技术,其中m ...

  8. 异步任务利器Celery(一)介绍

    django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间.可不可以立刻对用户返回响应,然后在后台运行那些操作呢? crontab定时任务很难达到这样的要 ...

  9. 置换群、Burnside引理与等价类计数问题

    置换群.Burnside引理与等价类计数问题 标签: 置换群 Burnside引理 置换 说说我对置换的理解,其实就是把一个排列变成另外一个排列.简单来说就是一一映射.而置换群就是置换的集合. 比如\ ...

  10. Linux目录结构及作用

    /:根目录 /bin:存放基础系统所需的最基础的命令(程序) binary 比如:ls.cp.mkdir等 功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令   /b ...