图像处理------快速均值模糊(Box Blur)

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

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

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

 传统的卷积模糊计算量巨大,程序效率比较低,基于滑动窗口的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来找到平均值。

[java] view plaincopy

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

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

用photoshop快速处理模糊照片教程

下面我们来看看用photoshop快速处理模糊照片教程吧,很多时候照出来的照片都不清楚或有一点自己不喜欢的东西所以我们就要想法办法把它去了,现在我们就是来讲这个办法哦. 第一步:打开原素材图片,然后下图图中红圈出,说明亮部和暗部匀无细节 第二步:创建一个新的色阶调整层按住红圈中的滑块向箭头方向移动 第三步:创建一个新的色彩平衡调整层:对阴影高光分别进行调整 第四步:按ctrl+m曲线来提亮皮肤,添加蒙板后察出不需提亮部分 第五步:ctrl+shift+alt+e盖印图层,进行适当的磨皮修饰 第六

图像处理——运动模糊motion blur

问题描述 要做一个图像处理的软件,里面设计到图像的模糊处理.找到一些资料,知道运动模糊与角度和距离有关,但是具体要如何根据angle和distance对图像的像素进行处理呢?就比如说图像的平滑处理是将原图中的每一点的灰度和它周围八个点的灰度相加,然后除以9,作为新图中对应的灰度.那运动模糊要如何处理呢?想知道原理,有没有知道? 解决方案 解决方案二:不知道,没搞过.帮你顶起解决方案三:最简单的就是把上一次渲染的画面记下来,将这次要渲染的画面按一定比例和上一次画面做叠加.解决方案四:我现在要做的东

图像处理------基于阈值模糊

算法思想: 实现一个高斯卷积模糊但是只运用与周围的像素值与中心像素值差值小于阈值.两个 像素值之间的距离计算可以选用向量距离即曼哈顿距离或者欧几里德距离.高斯模糊 采用先XY方向一维高斯模糊完成目的是为了减小计算量. 程序效果: 关键代码解释: 分别完成XY方向的一维高斯模糊 [java] view plaincopy <span style="font-weight: normal;">thresholdBlur( kernel, inPixels, outPixels,

图像处理-快速傅里叶变换蝶形公式如何理解

问题描述 快速傅里叶变换蝶形公式如何理解 // 采用蝶形算法进行快速傅里叶变换 for(k = 0; k < r; k++) { for(j = 0; j < 1 << k; j++) { bfsize = 1 << (r-k); for(i = 0; i < bfsize / 2; i++) { p = j * bfsize; X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2]; X2[i + p + bfsize /

图像处理------移动模糊

卷积模糊或者卷积平滑滤波,可以消除图像噪声,也可以产生一些常见的图像模糊特效,但 是移动模糊特效也是基于卷积,相比于Box Blur, Gaussian Blur的算法,移动模糊只需要完成 一次的一维卷积,所不同的是一维卷积的完成,要基于一定的角度,而不是只是在水平和垂 直两个方向上.移动模糊的一维卷积要考虑一下三个因素:                      a. 操作数的多少 - 即距离(Distance)                      b.一维操作数在像素数组中的移动方向

【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性.(摘自网络) 图像滤波的目的 1,消除图像中混入的噪声 2,为图像识别抽取出图像特征 图像滤波的要求 1,不能损坏图像轮廓及边缘 2,图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就

Javascript图像处理—平滑处理实现原理_javascript技巧

前言 上一篇文章,我们讲解了图像的虚拟边缘,这篇文章开始进行平滑(也就是模糊)处理. 基本原理 这里直接引用OpenCV 2.4+ C++ 平滑处理和OpenCV 2.4+ C++ 边缘梯度计算的相关内容: 平滑也称模糊, 是一项简单且使用频率很高的图像处理方法. 平滑处理时需要用到一个滤波器 . 最常用的滤波器是线性 滤波器,线性滤波处理的输出像素值(例如:)是输入像素值(例如:)的加权平均: 称为核 , 它仅仅是一个加权系数. 这里涉及一种叫做"卷积"的运算,那么卷积是什么呢? 卷

图像处理------高斯模糊

高斯模糊是一种两维的卷积模糊操作,在图像完成高斯模糊相对于均值模糊来说, 计算量会增加,但是高斯模糊可以实现一些特殊效果,特别是在图像噪声(非椒盐 噪声)消去方面,更是有着非常好的效果.一维高斯公式如下: 其中x是制定[-n,n]范围的整数,sigma代表标准方差.通常取值为1. 一维高斯函数Java代码如下: [java] view plaincopy private float[] get1DKernalData(int n, float sigma) {       float sigma

Android高级模糊技术

转自http://www.eoeandroid.com/forum.php?mod=viewthread&tid=330350 模糊五帖 Android模糊图像教程(1) http://www.eoeandroid.com/thread-330348-1-1.html Android模糊图像教程(2) http://www.eoeandroid.com/thread-330349-1-1.html Android模糊图像教程(3) http://www.eoeandroid.com/thread