首页 > 其他分享 >高斯模糊性能优化

高斯模糊性能优化

时间:2024-10-23 22:32:35浏览次数:4  
标签:textureLod 高斯 srcTex color 模糊 像素 texCoordVsOut 优化

常见高斯模糊方法

假设被模糊图片分辨率宽为 \(W\),高为 \(H\),假设高斯模糊核大小为 \(S\),半径为 \(R\)(不包含中心点,即 \(S=2×R+1\))。
按照高斯模糊原始用法,渲染单个像素需要对周围 \(S × S\) 个像素进行采样,并乘以对应的符合高斯分布的权值,公式为:
G(x,y)=12πσexp(x2+y22σ2)
其中 \(x\)、\(y\) 为被采样像素到中心像素的横、纵距离,因此渲染一帧的时间复杂度为 \(O(W×H×S^2)\)。
但通过严格的数学证明,二维高斯模糊可以分为先横向后纵向,或先纵向后横向的两次一维模糊,两次模糊的核大小不变且相同,权值符合如下分布
G(x,y)=12πσexp(x22σ2)
因此渲染单个像素,仅需对其横向 \(S\) 个和纵向 \(S\) 个像素共 \(2S\) 个像素进行采样,因此渲染一帧的时间复杂度降为 \(O(W×H×S)\) 。
但要注意的是,该方法需要一个中间缓冲(纹理)记录第一次一维模糊的结果,因此会额外增加 \(O(W×H)\) 空间复杂度的消耗。

NonuniformBlur

由于高斯模糊的结果受核大小 \(S\) 与 \(\sigma\) 影响,二者越大图像越模糊,后者对性能没有影响,但前者的大小会显著影响程序性能,因此引入一种以高性能为目标的高斯模糊近似优化方法,该方法在《The Power of Box Filters: Real-time Approximation to Large Convolution Kernel by Box-filtered Image Pyramid 》[1] 提出,如下为太长不看版(本人总结):
高斯模糊的性能消耗大头在于对周围像素的采样频率,频率较大时会造成较高消耗。而 mipmap 各个层级的像素是原始纹理某个区域的像素平均值,因此文章作者使用 mipmap 这一数据结构来近似高斯模糊,并将采样频率降到较低水平。
同时,mipmap 在现代GPU上有较快的硬件生成速度(用计算着色器生成速度也很快),因此大尺度高斯模糊替换为本方法后,性能消耗会得到显著降低。
设 \(p_{Gaussian}\) 为一个像素高斯模糊结果,\(s(x,y)\) 为被采样像素值,\(l\) 为 mipmap 层数(注意,和 OpenGL ES 的层数是反过来的),\(w_{G}(l)\) 为在 mipmap 第 \(l\) 层的权值,\(S_{box}(l)\) 为在 mipmap 第 \(l\) 层采样的结果,公式为:
pGaussian=+G(x,y)s(x,y)dxdy=0+wG(l)Sbox(l)dl
其中
wG(l)16lln44π2σ4exp(4l2πσ2)
或者为
pGaussian=l=0lmaxwG(l)Sbox(l)l=0lmaxwG(l)
从公式可以看到,采样频率不再与高斯核大小有关,只与图像分辨率有关,单个像素的采样频率为 \(⌊log_2max(W,H)⌋+1\),而每张图片模糊的时间复杂度为 \(O(W×H×(1+log_2max(W,H)))\)。
同时,由于生成 mipmap,所以会额外增加三分之一的原始图片内存。
对一个 1920*720 的图片使用上述方法进行模糊,\(\sigma\) 为 5,在运行时生成着色器如下所示:

#version 320 es
precision mediump float;
in vec2 texCoordVsOut;
uniform sampler2D srcTex;
out vec4 fragColor;
void main()
{
  vec4 color = vec4(0.f, 0.f, 0.f, 0.f);
  color += textureLod(srcTex, texCoordVsOut,11.f) * 0.000000;
  color += textureLod(srcTex, texCoordVsOut,10.f) * 0.000000;
  color += textureLod(srcTex, texCoordVsOut,9.f) * 0.000000;
  color += textureLod(srcTex, texCoordVsOut,8.f) * 0.000000;
  color += textureLod(srcTex, texCoordVsOut,7.f) * 0.000000;
  color += textureLod(srcTex, texCoordVsOut,6.f) * 0.000000;
  color += textureLod(srcTex, texCoordVsOut,5.f) * 0.089084;
  color += textureLod(srcTex, texCoordVsOut,4.f) * 0.739691;
  color += textureLod(srcTex, texCoordVsOut,3.f) * 0.156954;
  color += textureLod(srcTex, texCoordVsOut,2.f) * 0.013316;
  color += textureLod(srcTex, texCoordVsOut,1.f) * 0.000898;
  color += textureLod(srcTex, texCoordVsOut,0.f) * 0.000057;
  fragColor = vec4(color.rgb, 1.0f);
}

可以看到,不仅 render pass 从原来的两次降为1次,单个像素采样频率也只有12次。

NonuniformBlur再优化

从优化方案生成的着色器可以看到部分权重为0,因此还能剔除这些权重的采样来降低性能消耗(可以按小于0.0039进行剔除,因为0.0039对应8位子像素归一化后一个色阶的大小,即1/256,因此权重小于0.0039意味着该层对最终结果的影响不足一个色阶,可以忽略)。
故而优化后的着色器为

#version 320 es
precision mediump float;
in vec2 texCoordVsOut;
uniform sampler2D srcTex;
out vec4 fragColor;
void main()
{
vec4 color = vec4(0.f, 0.f, 0.f, 0.f);
color += textureLod(srcTex, texCoordVsOut,5.f) * 0.089084;
color += textureLod(srcTex, texCoordVsOut,4.f) * 0.739691;
color += textureLod(srcTex, texCoordVsOut,3.f) * 0.156954;
color += textureLod(srcTex, texCoordVsOut,2.f) * 0.013316;
fragColor = vec4(color.rgb, 1.0f);
}

可以看到,采样频率降低为4次。

参考文献

[1] Xu T, Ren X, Wu E. The Power of Box Filters: Real-time Approximation to Large Convolution Kernel by Box-filtered Image Pyramid[M]//SIGGRAPH Asia 2019 Technical Briefs. 2019: 1-4.

标签:textureLod,高斯,srcTex,color,模糊,像素,texCoordVsOut,优化
From: https://www.cnblogs.com/tianrenbushuai/p/18498510

相关文章

  • Spark 优化
    Spark优化定义和目标定义:Spark优化是指通过调整Spark应用程序的配置参数、代码结构和数据处理方式,以提高Spark作业的性能和效率。目标:优化的目标包括减少作业的执行时间、降低资源消耗、提高吞吐量等。优化可以涉及到多个方面,如内存管理、数据分区、任务调度、代码优......
  • 质量流量计优化燃油滤清器泄漏测试的效率
    组件的质量部分取决于其压力或泄漏完整性。组件的一些示例包括燃料箱、机油和燃料过滤器、散热器、空调和加热系统组件、歧管、齿轮箱、软管等。在向汽车制造商交付零部件之前,零部件供应商通常需要测试和记录零部件的质量。一家领先的燃油滤清器制造商希望提高其质量控制测......
  • 反弹shell优化
    做个记录https://www.bilibili.com/video/BV1qp4y1Z7Pv?t=385.6有时反弹得到的shell是这样的:这种shell只能进行ls、cat这样的简单的查询动作,而对于进入mysql-uroot-p这种进入MySQL终端的交互行为就无能为力,这时就要在此shell上进行优化优化方式1:python3-c'importpty;p......
  • 基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不
    1.算法仿真效果      本课题是在博主以前写的文章《m基于FPGA的64QAM调制解调通信系统verilog实现,包含testbench,不包含载波同步》的升级,升级内容包括信道模块(可以设置SNR),误码率统计,同时修正了数据输入频率问题,从而提升了系统的仿真效率。 vivado2019.2仿真结果如下(完......
  • 图论优化
    图论优化三元环计数首先给所有边定向,从度数小的点指向度数大的点,如果度数一样,则从编号小的指向编号大的,最终形成一张DAG。枚举\(u\)以及\(u\)指向的点\(v\)以及\(v\)指向的点\(w\),如果\(u\)也指向\(w\)则成三元环。如果要一开始是有向图计数则最后判断一下\(u,v,w\)的方向即可......
  • 【PowerShell】如何优化脚本性能?
    优化PowerShell脚本性能可以从多个方面着手,以下是一些常见的策略和具体的例子来说明如何实现这些优化:1.减少不必要的循环描述:在处理大量数据时,避免使用过多的循环。可以考虑使用管道和内置cmdlet来替代。示例:低效代码:$files=Get-ChildItem-PathC:\Tempforeach(......
  • 内存优化的秘密:深入理解 Linux 中的 madvise
    madvise是一个在Linux和其他类Unix操作系统中使用的系统调用,用于向内核提供关于内存映射区域的建议。它可以帮助操作系统优化内存使用,以提高性能。使用场景madvise函数通常用于以下几种情况:预取数据:如果应用程序知道将来会使用某些数据,可以建议操作系统提前加载这些数据到内......
  • CATIA软件许可优化策略探讨
    在当今的工程设计领域,CATIA软件已成为众多企业和设计师的首选工具。然而,随着软件使用的普及和复杂度的提升,如何优化许可策略以提高使用效率并降低成本,成为了一个亟待探讨的课题。本文将围绕CATIA软件许可优化策略展开讨论,旨在帮助企业实现更高效、更经济的软件应用。一、了解许可......
  • 字符串优化
    字符串问题\(\mathcalO(nm)-\mathcalO(1)\)比较字符串子串大小令\(lcp_{x,y}=\operatorname{lcp}(s[x\simn],s[y\simn])\),有\[lcp_{x,y}=\left\{\begin{aligned}&lcp_{x+1,y+1}+1&&s_x=s_y\\&0&&s_x\not=s_y\end{aligned}\right.\]......
  • Vite 优化配置方案
    前言Vite是一个快速的前端构建工具,特别适用于现代前端框架如Vue和React。为了进一步提升项目的性能和开发体验,我们可以对Vite进行一些优化配置。本文将介绍一些常见的优化策略,并提供详细的配置示例和注释。1.安装必要的插件首先,我们需要安装一些常用的Vite插件来帮......