【问题标题】:Anyone know where i can find a glsl implementation of a bilateral filter (blur)?任何人都知道我在哪里可以找到双边滤波器(模糊)的 glsl 实现?
【发布时间】:2011-06-30 16:54:33
【问题描述】:

我希望在 GPU 上进行“选择性模糊”或“表面模糊”。我已经阅读了一些关于该主题的研究论文,并且看到了大量的 C 代码,但理想情况下我想要 GLSL、HSL 或 CG 的东西。

【问题讨论】:

    标签: graphics opengl-es


    【解决方案1】:

    实际上,双边模糊与高斯模糊没有太大区别,您只需将样本的值乘以高斯因子乘以中心像素的实际值之间的“接近度”函数的结果和采样的像素。

    所以,在伪 GLSL 中

    vec3 centreColour = texture2D(image,texCoord);
    vec3 result = centreColour;
    float normalization = 1;
    for (int i = 0; i < NUM_SAMPLES; ++1)
    {
       vec3 sample = texture2D(image, texCoord + offsets[i]);
       float gaussianCoeff = computeGaussianCoeff(offsets[i]);
    
       //depends on your implementation, this is quick
       float closeness = 1.0f - distance(sample,centreColour) / length(vec3(1,1,1));
    
       float sampleWeight = closeness * gaussian;
    
       result += sample * sampleWeight;
       noralization += sampleWeight;
    }
    vec3 bilateral = result / normalization;
    

    您可能应该有更好的方法来确定接近度值,例如在感知均匀的空间(如 LUV)中进行。

    对于优化,您可以应用所有适用于高斯模糊的技术,除了那些忽略您必须知道像素值这一事实的技术。例如,使用纯高斯,您可以明智地选择您的 texcoords 并在一次提取中集成 4 个像素。那是行不通的。

    有效的大事:

    *分离你的过滤器。代替 5x5 样本 (25),水平执行 5 个,保存到中间缓冲区,垂直执行 5 个。它看起来并不完全相同,但仍会消除噪音。

    *以较低的分辨率执行您的滤镜,然后将其与原版合成以获得一些细节。

    【讨论】:

    • 谢谢,这比我读过的大部分内容更容易理解,并感谢关于我在优化方面能做什么和不能做什么的提示。我会看看是否可以将其转换为 Quartz Composer 示例。为了澄清起见,我的目标是在保持边缘细节的同时平滑图像。
    • 这正是双边剂量,它在保持细节的同时去除噪音。它也是我在 Photoshop 时最喜欢的 :)
    • 偶然发现了这篇文章,我想我会链接到几个简单的双边过滤 QC 实验:github.com/lbergnehr/quartz-compositions
    • 优化 2D 高斯模糊的最常见方法之一是利用内核可分离性。请注意,这不适用于双边模糊。
    • 贴近的线是否应该是“float closeness = 1.0 - distance(sample,centreColour) / length(vec3(1,1,1));”相反,还是我错过了什么?随着颜色越来越不同,重量应该越来越小,对吧?
    【解决方案2】:

    对于到达这里的任何人,如果您不自己重新实现,GPUImageView for Android 中有一个完整的实现。

    实现包括顶点着色器和片段着色器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2019-07-31
      • 2017-12-04
      相关资源
      最近更新 更多