我已经读到模糊是通过在一个轴上然后在另一个轴上完成的,在实时图形中完成的。

有人可以用简单的术语解释图像的2D高斯模糊处理吗?

我也听说模糊的半径会影响性能。那是由于必须进行更大的卷积吗?

#1 楼

卷积中,两个数学函数被组合以产生第三个函数。在图像处理中,功能通常称为内核。内核不过是一个(正方形)像素阵列(可以说是一个小图像)。通常,内核中的值加一。这是为了确保操作后不会在图像上添加或移除任何能量。

具体来说,高斯核(用于高斯模糊)是像素的正方形阵列,其中像素值对应高斯曲线的值(以2D表示)。



图像中的每个像素都乘以高斯核。这是通过将内核的中心像素放置在图像像素上并将原始图像中的值与内核中重叠的像素相乘来完成的。将这些相乘所得的值相加,并将该结果用作目标像素处的值。查看图像,将输入数组(0,0)的值乘以内核数组(i)的值,输入数组(1,0)的值乘以(h)的值)在内核数组中,依此类推。然后将所有这些值相加,以在输出图像上获得(1,1)的值。操作费用更高。因此,模糊半径越大,运算所需的时间就越长。

要回答您的第一个问题,如上所述,可以通过将每个输入像素乘以整个内核来进行卷积。但是,如果内核是对称的(高斯内核),则还可以独立地乘以每个轴(x和y),这将减少乘法的总数。用适当的数学术语,如果矩阵是可分离的,则可以将其分解为(M×1)和(1×N)个矩阵。对于上面的高斯内核,这意味着您还可以使用以下内核:

$$ \ frac1 {256} \ cdot \ begin {bmatrix}
1&4&6&4&1 \\
4&16&24&16&4 \\
4&16&24&16&4 \\
1&4&6&4&1
\ end {bmatrix}
=
\ frac1 { 256} \ cdot \ begin {bmatrix}
1 \\ 4 \\ 6 \\ 4 \\ 1
\ end {bmatrix} \ cdot \ begin {bmatrix}
1&4&6&4&1
\ end {bmatrix}
$$

您现在将输入图像中的每个像素与两个内核相乘,然后将结果值相加以获得输出像素的值。 >
有关如何查看内核是否可分离的更多信息,请单击此链接。

编辑:上面显示的两个内核使用略有不同的值。这是因为在两种情况下,用于高斯曲线以创建这些内核的(sigma)参数都略有不同。为了解释哪些参数会影响高斯曲线的形状,并因此影响内核中的值,请点击此链接

编辑:在上方的第二个图像中,它表示使用的内核已翻转。如果您使用的内核不是对称的,那么这当然不会有任何区别。您需要翻转内核的原因与卷积运算的数学特性有关(请参阅链接以获取有关卷积的更深入说明)。简而言之:如果您不翻转内核,则卷积运算的结果将被翻转。通过翻转内核,您可以获得正确的结果。

评论


$ \ begingroup $
您能添加一个简短的注释来解释为什么两个不同的5×5内核具有略微不同的数字(一个加起来等于273,另一个加起来等于256)吗?对于新手来说,这似乎是一个潜在的困惑。
$ \ endgroup $
– trichoplax
2015年8月9日在22:14

$ \ begingroup $
同样,您能否解释一下为什么在第二张图中翻转了内核?我认为这与解释无关,但实际上这是一个明显的额外步骤,可能会妨碍那些不知道没有必要的人理解。
$ \ endgroup $
– trichoplax
2015年8月9日在22:16

$ \ begingroup $
不要忘记在线性色彩空间中工作以获得正确的结果。
$ \ endgroup $
–v.oddou
2015年11月18日,0:57

#2 楼

这是我读过的关于该主题的最好的文章:
具有线性采样的高效高斯模糊。它解决了您所有的问题,并且确实可以访问。

对于外行人来说,简短的解释是:高斯函数具有很好的可分离性,这意味着可以通过将两个函数组合起来来计算2D高斯函数一维高斯函数。

因此,对于$ n \ times n $大小($ O(n ^ 2)$),您只需要评估$ 2 \ times n $值($ O(n) $),它要少得多。如果您的操作是读取纹理元素(通常称为“ tap”),那么这是个好消息:更少的拍子会更便宜,因为纹理获取会产生成本。通过执行两次遍历,一次通过收集$ n $个水平像素进行水平模糊,另一次通过收集$ n $个垂直像素进行垂直模糊。结果是最终的模糊像素颜色。

#3 楼

通常,通过在滑动窗口中获取两个函数的乘积的积分来进行卷积,但是如果您不是来自数学背景,那不是很有帮助的解释,当然也不会给您带来有用的直觉为了它。更直观地讲,卷积允许输入信号中的多个点影响输出信号上的单个点。

由于您对卷积不太满意,让我们首先回顾一下卷积在离散中的含义在这样的上下文中,然后进行简单的模糊处理。

在离散上下文中,我们可以通过简单地将每个对应的样本相乘来将两个信号相乘。积分也很容易离散进行,我们只需要在积分的间隔内将每个样本相加即可。一种简单的离散卷积是计算移动平均值。如果要获取10个样本的移动平均值,则可以认为这是通过分布10个长度为0.1的样本来对信号进行卷积,窗口中的每个样本首先要乘以0.1,然后将所有10个样本相加在一起得出平均。这也揭示了一个有趣且重要的区别,当您用卷积模糊时,您使用的分布在所有样本上的总和应为1.0,否则在应用图像时会增加或降低图像的整体亮度。如果我们的平均分布在整个时间间隔内为1,那么在卷积之后总信号将亮10倍。

现在我们已经了解了卷积,现在可以继续进行模糊处理了。高斯模糊是通过高斯分布对图像进行卷积实现的。通常通过将图像按其他分布进行卷积来实现其他模糊。最简单的模糊是盒子模糊,它使用我们上面描述的相同分布,即一个单位面积的盒子。如果要模糊10x10区域,则将框中的每个样本乘以0.01,然后将它们加在一起以产生中心像素。我们仍然需要确保模糊分布中所有样本的总和为1.0,以确保图像不会变得更亮或更暗。

高斯模糊遵循与框模糊,但它使用更复杂的公式来确定权重。可以根据距中心r的距离,通过评估$$ \ frac {e ^ {-x ^ 2/2}} {\ sqrt {2 \ pi}} $$来计算分布如果您对每个像素进行采样,那么高斯最终将接近1.0,但是高斯具有无限支持(每个地方都有值)的事实意味着您需要使用经过稍微修改的版本,仅使用几个值就可得出1.0。 br />
当然,如果在很大的半径上执行它们,那么这两个过程都会非常昂贵,因为您需要采样很多像素才能计算出模糊。这就是最终的诀窍所在:高斯模糊和盒式模糊都称为“可分离”模糊。这意味着,如果沿一个轴执行模糊处理,然后沿另一轴执行模糊处理,则产生的效果与您同时沿两个轴执行模糊处理的效果相同。这可能非常重要。如果模糊范围为10px,则需要100天真形式的样本,但分离时仅需要20个样本。由于合并的模糊是$ O(n ^ 2)$,而分离的形式是$ O(n)$,因此差异只会变得更大。

评论


$ \ begingroup $
查看您的其他答案,看来您的数学背景比我以前的工作要好,但我希望它能继续详细介绍以提供帮助。我希望它对任何背景的人都有用。
$ \ endgroup $
–porglezomp
2015年8月5日,下午4:34

$ \ begingroup $
如果您在跟我说话,那根本就不会。您的回答和伯特的观点令人惊讶。非常感谢!现在要消化一下信息(:
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
2015年8月5日在5:03

#4 楼

正如其他人指出的那样,实现高斯模糊时要考虑的最重要的事情是将2D卷积滤波器分为两个1D卷积,因为它将复杂度从$ O(n ^ 2)$降低到$ O(n)美元。您将需要使用落在图像外部的像素进行计算。在这种情况下,您可以尝试以下操作之一:对于外部像素,您只需获取最后一个可能的值(即max(x, 0)中位于最边界的像素。或者您可以将图像“反射”到外部(例如x < 0 ? -x : x) ),也可以只是在边界处停下来,然后需要在卷积过滤器中调整分母,使其总和为1。例如:

$$
\ operatorname { sum}
\ frac {1} {256}
\ begin {bmatrix}
1&4&6&4&1 \\
4&16&24&16& 4 \\
6&24&36&24&6 \\
4&16&24&16&4 \\
1&4&6&4&1 \\
\ end {bmatrix}
=
\ operatorname {sum}
\ frac {1} {225}
\ begin {bmatrix}
0&0& 0&0&0 \\
0&16&24&16&0 \\
0&24&36&16&0 \\
0&16&24&16&0 \\
0&0&0&0&0 \\
\ end {bmatrix}
= 1.
$$
另一个技巧是如何计算内核的实际系数。显然,您可以尝试实现高斯函数,但是更快的方法是观察一维内核重新组合Pascal的三角形。例如:

     1
    1 1
   1 2 1
  1 3 3 1
[1 4 6 4 1]