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


19

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

我仍然有几个问题:

  • sigma和半径之间有什么关系?

    我读过西格玛等于半径,我看不到西格玛是如何用像素表示的。还是“半径”只是sigma的名称,与像素无关?

  • 如何选择西格玛?

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

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

    我已经看到大多数实现使用5x5内核。对于质量不错的快速实现来说,这可能是一个不错的选择,但是还有其他理由选择另一个内核大小吗?sigma与内核大小有何关系?我是否应该找到最佳的sigma,以便使内核外部的系数可以忽略不计并且仅进行归一化?

Answers:


21

sigma和半径之间有什么关系?我读过西格玛等于半径,我看不到西格玛是如何用像素表示的。还是“半径”只是sigma的名称,与像素无关?

这里有三件事。方差,(),半径,和像素的数量。由于这是二维高斯函数,因此有必要谈论协方差矩阵Σ。然而,尽管如此,这三个概念之间的联系微弱。σ2Σ

首先,二维高斯由以下方程式给出:

Gž=1个2π2|Σ|Ë-1个2ž-μŤΣ-1个 ž-μ

其中是包含图像中xy坐标的列向量。所以,ž = [ X ÿ ],并且μ是一个列向量编纂平均您的高斯函数的,在Xÿ方向μ = [ μ X μ ÿ ]žXÿž=[Xÿ]μXÿμ=[μXμÿ]

例:

现在,让我们设置协方差矩阵μ = [ 0 0 ]。我还将像素数设置为100 x 100。此外,我在其中评估此PDF的“网格”将xy都从10变为10。这意味着我的网格分辨率为10 10 Σ=[1个001个]μ=[00]100100-1010Xÿ。但这是完全任意的。通过这些设置,我将在左侧获得概率密度函数图像。现在,如果我更改“方差”(实际上是协方差),使得Σ=[ 9 0 0 9 ]并保持其他所有不变,那么我得到的图像就在右边。10--10100=0.2Σ=[9009]

在此处输入图片说明

两者的像素数仍然相同,为 x 100,但是我们更改了方差。假设我们做同样的实验,但是改用20 x 20像素,但是我仍然10跑到10。然后,我的网格的分辨率为10 10 1001002020-1010。如果我使用与以前相同的协方差,则会得到以下结果:10--1020=1个

在此处输入图片说明

这些是您必须了解这些变量之间相互作用的方式。如果您想要该代码,我也可以在此处发布。

如何选择西格玛?

高斯滤波器的方差/协方差矩阵的选择与应用密切相关。没有正确的答案。这就像问一个滤波器应该选择什么带宽。同样,这取决于您的应用程序。通常,您希望选择一个高斯滤波器,以便使图像中的大量高频分量消失。要获得良好的度量,您可以做的一件事是计算图像的2D DFT,并将其系数与2D高斯图像叠加。这将告诉您哪些系数正在受到严重惩罚。

例如,如果您的高斯图像的协方差是如此之宽以至于包含了图像的许多高频系数,那么您需要使其协方差元素变小。


1
如果这些图像使用顺序色图,则效果会更好。 喷气机是最糟糕的。
endlith 2013年

@endolith“更好”取决于应用程序。当需要视觉对比辨别时,我不使用喷气机。(热更好)。但是,在此消息的大小在高斯大小以内,因此使用喷射不会造成伤害。不过感谢您的链接。
Tarin Ziyaee

2
这是一个经过深思熟虑且非常形象化的答案!以该左上图像为例。显然,方差和内核大小的组合是浪费的,因为它是100x100内核,其中只有中心30x30(〜9%)不为零。
亚当·斯密

5

从连续的角度来看,参数sigma足以定义高斯模糊。但是实际上,图像和卷积核是离散的。如何选择连续高斯核的最佳离散逼近?

当使用较大的半径时,离散逼近将更接近连续的高斯核。但这可能以增加计算持续时间为代价。

理想情况下,将为sigma选择一个值,然后计算一个半径,以忠实地表示相应的连续高斯核。对于给定的近似误差,sigma越大,半径必须越大。

有趣的是,要使其正确进行,这可能变得非常复杂。构造高斯矩阵时,是对连续核进行采样的最佳解决方案还是更好的近似值?如何规范化计算的离散核以解决截断问题?等等

作为参考,在Mathematica中,函数GaussianMatrix具有几种计算高斯离散矩阵的方法,例如使用离散Bessel逼近。默认情况下,radius = 2 * sigma,这意味着在sigma = 1时,矩阵将为5x5。


这是一个很老的问题。但是,半径2 * sigma不会导致矩阵为9x9吗?
妄想逻辑2014年

@DelusionalLogic的sigma = 1,半径= 2,因此矩阵的大小为4,但需要奇数大小,因此大小为5x5。至少,这就是我所理解它..
Micka

如果半径为2,则邻域会将中心像素向左扩展2个像素,向右扩展2个像素,依此类推。这只是Mathematica使用的约定。
马提亚斯·奥迪西奥

2

事实证明,Pascal三角形的行非常好地近似于高斯,并具有使整数值之和为2的幂的实际优势(我们可以将这些值完全存储为整数,定点值或浮点数)。例如,假设我们希望构造一个7x7高斯内核,我们可以使用Pascal三角形的第七行,如下所示:

在此处输入图片说明

请注意,此过滤器在拐角处的影响最小,同时保留整数值。在这种情况下,您可以使用中间值20/64来确定相应的标准偏差sigma为64 /(20 * sqrt(2 * pi))= 1.276。您可以对高斯绘图,以查看这是一个很好的拟合。

因此,确定高斯核的合理标准偏差的一个很好的起点来自帕斯卡三角形(又称二项式系数)-对于(N + 1)x(N + 1)滤波器,它对应于上述构造用途

在此处输入图片说明

Wolfram Alpha的GaussianMatrix [3]仅使用r / 2 = 1.5。奇怪的是,GaussianMatrix [{3,1.276}] 不能产生与我的相同的2D滤波器,并且在-3到3之间的x,y 值不是以下数值:

在此处输入图片说明

我不确定为什么不呢?我的2D滤镜非常适合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.