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

Lod*_*ner 9 shader image-processing glsl gaussian fragment-shader

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

我仍然有几个问题:

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

我已经读过sigma相当于radius,我不知道sigma是如何用像素表示的.或者"半径"只是sigma的名称,与像素无关?

我该如何选择西格玛?

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

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

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

Aar*_*gan 18

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

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

我该如何选择西格玛?

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

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

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

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

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

您可能希望发布一些代码以获得更详细的解释.NVidia在如何构建高斯内核方面有很好的篇章(http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html).看例40-1.

  • [OpenCV](https://github.com/opencv/opencv/blob/9c23f2f1a682faa9f0b2c2223a857c7d93ba65a6/modules/imgproc/src/smooth.cpp#L3782)使用内核半径`(sigma * 3)`,而[scipy.ndimage.gaussian_filter ](https://github.com/scipy/scipy/blob/4bfc152f6ee1ca48c73c06e27f7ef021d729f496/scipy/ndimage/filters.py#L214) 使用 `int(4 * sigma + 0.5)` 的内核半径 (2认同)