高斯模糊 - 标准偏差,半径和内核大小

时间:2013-07-24 17:40:43

标签: image-processing glsl shader gaussian fragment-shader

我在GLSL中实现了高斯模糊片段着色器。我理解所有这些背后的主要概念:卷积,使用线性分离x和y,多次传递以增加半径......

我仍然有几个问题:

sigma和radius之间的关系是什么?

我已经读过sigma相当于radius,我看不出sigma是以像素表示的。或者“半径”只是sigma的名称,与像素无关?

如何选择sigma?

考虑到我使用多次传球来增加sigma,我如何选择一个好的sigma来获得我想要的sigma在任何给定的传球?如果得到的sigma等于 sigma的平方和的平方根和sigma相当于radius,那么获得任何所需半径的简单方法是什么?

内核的大小有多大,它与sigma有什么关系?

我见过大多数实现使用5x5内核。对于具有良好质量的快速实现而言,这可能是一个不错的选择,但是还有另一个选择另一个内核大小的理由吗? sigma如何与内核大小相关?我应该找到最好的sigma,以便我的内核之外的系数可以忽略不计并正常化吗?

1 个答案:

答案 0 :(得分:15)

sigma和radius之间的关系是什么?

我认为您的条款可以互换,具体取决于您的实施方式。对于高斯模糊的大多数glsl实现,他们使用sigma值来定义模糊量。在高斯模糊定义中,半径可以被认为是“模糊半径”。这些术语位于像素空间中。

如何选择sigma?

这将定义您想要的模糊程度,这与卷积中使用的内核大小相对应。较大的值会导致更多的模糊。

NVidia实现使用的内核大小为int(sigma * 3)。

出于性能考虑,您可以尝试使用较小的内核大小和较高的sigma值。这些是要试验的免费参数,它们定义了用于调制的像素数以及要在结果中包含多少相应的像素。

内核的大小是多少,它与sigma有什么关系?

根据sigma值,您需要选择相应的内核大小。内核大小将决定卷积过程中要采样的像素数,sigma将定义调制它们的程度。

您可能希望发布一些代码以获得更详细的说明。 NVidia在如何构建Gaussian Kernel方面有一个非常好的章节。 看例40-1。