Android - 高斯模糊效果 - OpenGL

Posted

技术标签:

【中文标题】Android - 高斯模糊效果 - OpenGL【英文标题】:Android - Gaussian blur like effect - OpenGL 【发布时间】:2016-07-08 16:45:24 【问题描述】:

如果没有指定,这个问题只是建立在 github 上的 grafika 项目中的 CameraCaptureActivity 之上。

它具有利用 3x3 内核的内置模糊效果

kernel = new float[] 
    1f/16f, 2f/16f, 1f/16f,
    2f/16f, 4f/16f, 2f/16f,
    1f/16f, 2f/16f, 1f/16f ;

但是这种模糊效果不够强,我正在寻找类似高斯效果在 ios 上的 UIVisualEffectView 可以做的事情,它看起来像这样:

一个不错的平滑重度模糊效果,但到目前为止我管理的最好的是:

如您所见,它没有那么平滑,而且有点方。

我通过转换为使用handy tool 生成的 5x5 内核实现了这一点,其 sigma 为 30,内核大小为 5。它产生以下结果:

kernel = new float[] 
    0.039911f,  0.039978f,  0.04f,      0.039978f,  0.039911f,
    0.039978f,  0.040044f,  0.040067f,  0.040044f,  0.039978f,
    0.04f,      0.040067f,  0.040089f,  0.040067f,  0.04f,
    0.039978f,  0.040044f,  0.040067f,  0.040044f,  0.039978f,
    0.039911f,  0.039978f,  0.04f,      0.039978f,  0.039911f
;

为了在Grafika 项目中工作,我必须在Texture2dProgram 类中修改KERNEL_SIZEmTexOffset

KERNEL_SIZE 现在是 25mTextOffset 现在计算如下:

public void setTexSize(int width, int height) 

    float rw = 50.0f / width;
    float rh = 50.0f / height;

    float rw50 = rw * 0.5f;
    float rh50 = rh * 0.5f;

    mTexOffset = new float[] 
            -rw, -rh,   -rw50, -rh,     0f, -rh,    rw50, -rh,      rw, -rh,
            -rw, -rh50, -rw50, -rh50,   0f, -rh50,  rw50, -rh50,    rw, -rh50,
            -rw, 0f,    -rw50, 0f,      0f, 0f,     rw50, -0f,      rw, 0f,
            -rw, rh50,  -rw50, rh50,    0f, rh50,   rw50, rh50,     rw, rh50,
            -rw, rh,    -rw50, rh,      0f, rh,     rw50, rh,       rw, rh
    ;
;

有没有人对我可以修改什么以实现类似模糊的 iOS 有建议(我认为 iOS 也在减轻像素)?我认为我真正出错的地方是 setTextSize() 计算,特别是 50.0f 值,我刚刚从空气中提取了这个并观察了它的效果

【问题讨论】:

在***.com/questions/2067955/…、ssaurel.medium.com/…、***.com/questions/36447630/… 中查看RenderScript 解决方案(它们是相同的)。 【参考方案1】:

使用实际模糊内核进行卷积是一项计算密集型任务,即使在 GPU 上也是如此。有一些技术可以让它更好地工作:

高斯核可以分解为 X 和 Y 分量,分别计算。这种技术被图像处理程序使用,因为它相对快速和准确。

您可以使用泊松圆盘采样来模糊图像,而不是使用高斯核。

您可以使用多通道 Kawase 滤波器作为高斯滤波器的近似值。

对于给定的主观模糊质量,从较低分辨率的 mip 贴图采样将获得更好的性能。

您可以从纹素之间进行采样,以劫持纹理插值并获得比其他方式更多的抽头。

一旦您开始进行这些权衡,通常需要进行一些微调才能使其“看起来正确”。 An investigation of fast real-time GPU-based image blur algorithms (Filip S., 2014) 提供了一个很好的总结。

【讨论】:

以上是关于Android - 高斯模糊效果 - OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

基于Qt的OpenGL可编程管线学习(11)- 高斯模糊

基于Qt的OpenGL可编程管线学习(11)- 高斯模糊

Android 实现高斯模糊效果及低版本兼容

Android 实现高斯模糊效果及低版本兼容

❤️Android 12 高斯模糊-RenderEffect❤️

❤️Android 12 高斯模糊-RenderEffect❤️