Android - 高斯模糊效果 - OpenGL

时间:2016-03-21 23:24:55

标签: android opengl-es grafika gaussianblur

如果没有指定,这个问题只是建立在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 };

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

一个很好的平滑沉重的模糊效果,但到目前为止,最好的香港专业教育管理是这样的:

正如你所看到的那样,它不是那么平滑而且有点方形。

我通过转换为使用此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项目中开展工作,我必须修改KERNEL_SIZE类中的mTexOffsetTexture2dProgram

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值,我刚从空气中汲取它并观察它的效果

1 个答案:

答案 0 :(得分:2)

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

  • 高斯核可以分解为X和Y分量,它们是分开计算的。图像处理程序使用此技术,因为它相对快速和准确。

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

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

  • 从较低分辨率的mip贴图中采样,可以获得更好的主观模糊质量。

  • 您可以从纹素之间进行采样,以便劫持纹理插值并获得比原本更多的点击。

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