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

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">图像模糊的本质, 从数字信号处理的角度看,图像模糊就要压制高频信号保留低频信号,</p><p style="color: rgb(51, 51, 51); font-family: Arial; font-siz

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

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

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

 传统的卷积模糊计算量巨大,程序效率比较低,基于滑动窗口的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 plain copy
  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>  

相关文章
|
7月前
|
存储 机器学习/深度学习 关系型数据库
《ONNX模型牵手MySQL:数据交换全攻略》
ONNX模型与MySQL数据库的数据交换是机器学习系统中的关键环节。ONNX作为开放式神经网络交换格式,提供跨框架的模型兼容性;MySQL则以高效稳定的结构化数据管理能力著称。两者结合时,需解决数据格式适配、表结构设计及预处理等问题。通过序列化、反序列化和性能优化(如索引、批量操作、缓存),可实现高效的数据交互。同时,还需应对数据一致性、格式匹配及连接问题,确保系统稳定性和可扩展性,为AI应用提供坚实支持。
246 32
|
11月前
|
API 网络架构
一文带你了解 Flutter 路由
一文带你了解 Flutter 路由
377 5
|
9月前
|
人工智能 安全 算法
《生成式AI牵手量子密码学,网络安全开启“超维”防护》
在数字时代,网络安全至关重要。传统防护手段逐渐失效,量子密码学与生成式AI的结合带来了新曙光。量子密码学基于量子力学原理,提供无条件安全的密钥分发;生成式AI则通过智能分析和模拟攻击,提升检测与防御效率。两者携手,优化密钥管理、加密算法及数据隐私保护,为网络安全带来全方位突破。学术界与产业界的共同努力将推动这一变革,构筑坚不可摧的安全防线。
414 4
|
算法 计算机视觉
图像处理之快速均值模糊(Box Blur)
图像处理之快速均值模糊(Box Blur)
170 0
|
机器学习/深度学习 计算机视觉 网络架构
【YOLOv8改进】Non-Local:基于非局部均值去噪滤波的自注意力模型 (论文笔记+引入代码)
YOLO目标检测专栏探讨了YOLO的创新改进,包括引入非局部操作以捕获远程依赖,增强上下文信息。非局部模块可应用于图像分类、目标检测等任务,尤其适合视频分类。文章介绍了Non-local自注意力模型,通过计算任意位置间交互,提供全局信息。此外,展示了如何在YOLOv8中实现NLBlockND模块。详细内容及实战配置见相关链接。
【YOLOv8改进】Non-Local:基于非局部均值去噪滤波的自注意力模型 (论文笔记+引入代码)
|
C#
WPF技术之Visibility
WPF中的Visibility属性用于控制元素在界面上的可见性。
889 1
|
项目管理
设置甘特图依赖关系技巧:项目管理高效指南
甘特图中的依赖关系是项目管理的关键,指任务间需按特定顺序执行的关系。依赖关系通常分为4种:Finish-to-Start(最常见)、Start-to-Start、Finish-to-Finish和Start-to-Finish。Zoho Projects提供了直观的甘特图工具,允许用户轻松设置和管理这些依赖关系,确保项目按需顺畅进行。理解并正确配置任务间的依赖对于项目成功至关重要。
348 1
|
Java 开发者
Java IO流实战技巧:如何优化InputStream/OutputStream和Reader/Writer的使用?
【6月更文挑战第26天】Java IO流优化涉及缓冲、资源管理、字符编码和流式处理。使用Buffered流提高读写效率,如`BufferedInputStream`和`BufferedReader`。确保资源关闭使用try-with-resources,如`try (InputStream is = ...) {...}`。处理文本时指定编码,如`InputStreamReader(is, StandardCharsets.UTF_8)`防止乱码。流式处理大文件,分块读写避免内存溢出,以减少内存占用。这些技巧能提升程序性能和健壮性。
608 0
|
机器学习/深度学习 数据采集 TensorFlow
TensorFlow与迁移学习:利用预训练模型
【4月更文挑战第17天】本文介绍了如何在TensorFlow中运用迁移学习,特别是利用预训练模型提升深度学习任务的性能和效率。迁移学习通过将源任务学到的知识应用于目标任务,减少数据需求、加速收敛并提高泛化能力。TensorFlow Hub提供预训练模型接口,可加载模型进行特征提取或微调。通过示例代码展示了如何加载InceptionV3模型、创建特征提取模型以及进行微调。在实践中,注意源任务与目标任务的相关性、数据预处理和模型调整。迁移学习是提升模型性能的有效方法,TensorFlow的工具使其变得更加便捷。
|
移动开发
钉钉往企业内部(H5微应用)推送一些消息通知。一般看哪个接口呢?
钉钉往企业内部(H5微应用)推送一些消息通知。一般看哪个接口呢?
629 1