【问题标题】:3 x 3 filter kernel (blur) on a SurfaceViewSurfaceView 上的 3 x 3 过滤器内核(模糊)
【发布时间】:2023-03-21 01:45:02
【问题描述】:

我正在尝试在 SurfaceView 或 GlSurfaceView 上实现实时模糊以获取摄像头供稿和 遇到了这个:Grafika https://github.com/google/grafika

它有一个功能可以让您应用实时模糊滤镜,但模糊效果不够强 如此处所示:https://www.youtube.com/watch?v=kH9kCP2T5Gg

Grafika 类使用一个 Grafika 类使用一个 3x3 过滤器内核, 据我了解,这是一个浮点值,当编辑某个值时,它会将所需的效果应用于视图。

这里是模糊代码:

'case CameraCaptureActivity.FILTER_BLUR:
    programType = Texture2dProgram.ProgramType.TEXTURE_EXT_FILT;
    kernel = new float[] {
        1f/16f, 2f/16f, 1f/16f,
        2f/16f, 4f/16f, 2f/16f,
        1f/16f, 2f/16f, 1f/16f };
     break;'

有没有人知道如何使用这些数字来增强模糊效果?

锐化有完全不同的分数:

'kernel = new float[] {
                    0f, -1f, 0f,
                    -1f, 5f, -1f,
                    0f, -1f, 0f };'

我无法完全弄清楚这种模式。 任何帮助,将不胜感激。

【问题讨论】:

    标签: android camera surfaceview blur glsurfaceview


    【解决方案1】:

    基本思想在维基百科image processing kernel page 上进行了解释。模糊示例与 Grafika 中的示例相同(并显示在您的问题中)。

    这个想法是(x,y)处的像素是它周围像素的加权和,即

    [x-1,y-1]  [x,y-1]  [x+1,y-1]
    [x-1,y]    [x,y]    [x+1,y]
    [x-1,y+1]  [x,y+1]  [x+1,y+1]
    

    为了获得原始图像,我们将对除当前像素之外的所有内容使用零权重:

    0 0 0
    0 1 0
    0 0 0
    

    我们可以通过平均所有 9 个像素来获得简单的模糊。如果我们像这样为每个像素设置权重 1:

    1 1 1
    1 1 1
    1 1 1
    

    然后该值将溢出 9 倍,因为我们只是将 9 个像素加在一起 ​​- 一些暗像素会非常亮,但任何中等亮度的像素都会被洗掉。所以我们需要通过除以 9 来归一化这个值。

    在您问题中显示的模糊示例中,我们为每个像素使用不同的权重:

    1 2 1
    2 4 2
    1 2 1
    

    总权重是 1+2+1+2+4+2+1+2+1 = 16,所以我们需要将结果除以 16。除法相对昂贵——请记住我们正在做这数百万大图像上的次数——但我们可以通过将系数除以 16 来完全避免它。

    对于您问题中显示的锐化示例,我们将当前像素的权重设为 5,并从四个附近像素中减去像素值,最终权重仍为 1。如果所有像素值大致相同,我们将计算 5 * 像素 - 4 * 像素 == 像素。如果附近的值不同——表明我们处于某种边缘——那么新的像素值将趋于非常亮或非常暗。

    您可以使用 3x3 过滤器内核完成很多工作,但在某些情况下,您可能需要使用更大的过滤器内核(例如,参见维基百科上的 7x7 gaussian blur page)。这会增加您的处理时间,但幸运的是 GPU 非常擅长并行处理大量数学运算。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2022-09-27
      相关资源
      最近更新 更多