14

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

不过我还有几个问题:

sigma和radius有什么关系?

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

如何选择西格玛?

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

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

我见过大多数实现都使用 5x5 内核。对于质量不错的快速实现来说,这可能是一个不错的选择,但是还有其他理由选择其他内核大小吗?sigma 与内核大小有何关系?我是否应该找到最好的 sigma 以便我的内核之外的系数可以忽略不计并且只是标准化?

4

1 回答 1

23

sigma和radius有什么关系?

我认为您的术语可以根据您的实施情况互换。对于大多数高斯模糊的 glsl 实现,它们使用 sigma 值来定义模糊量。在高斯模糊定义中,半径可以被认为是“模糊半径”。这些术语在像素空间中。

如何选择西格玛?

这将定义你想要多少模糊,这对应于卷积中要使用的内核的大小。较大的值将导致更多的模糊。

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

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

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

根据 sigma 值,您需要选择相应的内核大小。内核大小将确定在卷积期间要采样多少像素,而 sigma 将定义对它们进行调制的程度。

您可能想发布一些代码以获得更详细的解释。NVidia 有一个关于如何构建高斯内核的非常好的章节。请看示例 40-1。

于 2013-07-25T14:28:49.263 回答