在GLSL中寻找有效的模式滤波器

在GLSL中寻找有效的模式滤波器,glsl,webgl,shader,Glsl,Webgl,Shader,我想在GLSL中实现一个称为模式过滤器的图像过滤器,用于WebGL应用程序。模式过滤器从周围像素计算模式最频繁值,如果有一个最频繁的值,则将像素颜色设置为模式,否则保持不变。周围像素由内核大小决定,通常是以所讨论的像素为中心的9或25个像素 我是一个真正的着色器初学者,GLSL和实现性能的复杂性,我目前的实现似乎特别糟糕。我在寻找一种更有效的方法 我把我当前的着色器放到着色器玩具中,我得到10 fps以下!注意:您需要为iChannel0选择一些内容才能看到效果 编辑 我将计数排序算法转换为GL

我想在GLSL中实现一个称为模式过滤器的图像过滤器,用于WebGL应用程序。模式过滤器从周围像素计算模式最频繁值,如果有一个最频繁的值,则将像素颜色设置为模式,否则保持不变。周围像素由内核大小决定,通常是以所讨论的像素为中心的9或25个像素

我是一个真正的着色器初学者,GLSL和实现性能的复杂性,我目前的实现似乎特别糟糕。我在寻找一种更有效的方法

我把我当前的着色器放到着色器玩具中,我得到10 fps以下!注意:您需要为iChannel0选择一些内容才能看到效果

编辑

我将计数排序算法转换为GLSL,并从中值滤波器抓取了一个循环,结果现在是30fps,新版本在

在我的特殊情况下,我处理的是灰度照片,所以我只处理红色通道

以下是为webgl实现的着色器,它与shadertoy版本(例如texture2D,而不是texture)有细微的区别:


这实际上是一个非常有趣的问题

使这类事情更快的通常方法是使用多个过程。您不需要调用3x3内核,而是首先应用3x1内核,然后对结果应用1x3内核

然而,模式滤波器是不可分离的。我刚才提出了一个案例,它会崩溃:

151
555
151
中间像素应该变为5,但如果将其分解为h+v过程,结果将为1


话虽如此,我仍然认为如果你能想出一个解决方案,多通道解决方案会有所帮助。例如,您可以将模式值写入红色通道,将其计数写入绿色通道。这将允许您组合多个小的内核过程,以有效地实现较大的内核大小,尽管我认为它会偶尔出现错误,类似于我上面的示例。为了克服这些错误,您可以将第二多个模式值/计数写入蓝色和ALPHA。

好的,这是一个优化它的有趣想法。我会尝试尝试一下,谢谢:
151
555
151