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


西格玛和半径之间有什么关系?
我读过西格玛等于半径,我看不到西格玛如何以像素表示。还是“半径”只是sigma的名称,与像素无关?选择一个好的sigma以在任何给定通行证中获得我想要的sigma?如果所得的sigma等于sigma平方和的平方根,并且sigma等于radius,那么获得所需半径的简便方法是什么?
一个内核的大小合适,以及它与sigma有什么关系?
我已经看到大多数实现使用5x5内核。对于质量不错的快速实现来说,这可能是一个不错的选择,但是还有其他理由选择另一个内核大小吗? sigma与内核大小有何关系?我是否应该找到最佳的sigma,以便使内核外部的系数可以忽略不计并且仅进行归一化?

#1 楼


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


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

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

$$
g({\ bf z})= \ frac {1 } {\ sqrt {(2 \ pi)^ 2 | \ boldsymbol {\ Sigma} |}} e ^ {-\ frac {1} {2}({\ bf z}-\ boldsymbol {\ mu})^ T \ boldsymbol {\ Sigma} ^ {-1} \({\ bf z}-\ boldsymbol {\ mu})}
$$

其中$ {\ bf z} $是图像中包含$ x $和$ y $坐标的列向量。因此,$ {\ bf z} = \ begin {bmatrix} x \\ y \ end {bmatrix} $,而$ \ boldsymbol {\ mu} $是在$ x中将高斯函数的均值编码的列向量$和$ y $方向$ \ boldsymbol {\ mu} = \ begin {bmatrix} \ mu_x \\ \ mu_y \ end {bmatrix} $。

示例:

现在,假设我们设置协方差矩阵$ \ boldsymbol {\ Sigma} = \ begin {bmatrix} 1&0 \\ 0&1 \ end {bmatrix} $,并且$ \ boldsymbol {\ mu} = \ begin {bmatrix} 0 \\ 0 \ end {bmatrix} $。我还将像素数设置为$ 100 $ x $ 100 $。此外,我在其中评估此PDF的“网格”在$ x $和$ y $中将从$ -10 $变为$ 10 $。这意味着我的网格分辨率为$ \ frac {10-(-10)} {100} = 0.2 $。但这是完全任意的。通过这些设置,我将在左侧获得概率密度函数图像。现在,如果我更改“方差”(实际上是协方差),使得$ \ boldsymbol {\ Sigma} = \ begin {bmatrix} 9&0 \\ 0&9 \ end {bmatrix} $,并保留其他所有内容同样,我得到正确的图像。



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



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


我该如何选择sigma?


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

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

评论


$ \ begingroup $
如果这些图像使用顺序颜色图,效果会更好。喷气飞机是最糟糕的。
$ \ endgroup $
– Endolith
13年7月27日在17:13

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

$ \ begingroup $
这是一个经过深思熟虑且形象化的答案!以该左上图像为例。显然,方差和内核大小的组合是浪费的,因为它是100x100内核,其中只有中心30x30(〜9%)不为零。
$ \ endgroup $
–亚当·史密斯(Adam Smith)
16年4月4日在22:11

#2 楼

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

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

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

有趣的是,将其正确处理会变得非常复杂。
构造高斯矩阵时,是对连续核进行采样的最佳解决方案还是更好的近似值?
如何标准化计算的离散核以解决截断问题?

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

评论


$ \ begingroup $
这是一个很老的问题。但是2 * sigma的半径不会导致9x9的矩阵吗?
$ \ endgroup $
–妄想逻辑
2014年4月28日在18:19

$ \ begingroup $
@DelusionalLogic的sigma = 1,半径= 2,因此矩阵的大小为4,但需要奇数大小,因此大小为5x5。至少我是这样理解的。
$ \ endgroup $
– Micka
2015年9月17日下午12:53

$ \ begingroup $
如果半径为2,则邻域会将中心像素向左扩展2个像素,向右扩展2个像素,依此类推。这只是Mathematica使用的约定。
$ \ endgroup $
–马特西亚·奥迪西奥(Matthias Odisio)
2015年9月21日在23:12

#3 楼

事实证明,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滤波器,并且x,y在-3和3之间不符合以下条件:

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