高斯模糊如何实现?


42

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

过去我在1D中做过一些卷积运算,但我对此不太满意,也不知道在这种情况下究竟要进行哪些卷积运算。

谁能用简单的术语解释图像的2D高斯模糊处理方式?

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

Answers:


48

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

具体而言,高斯核(用于高斯模糊)是像素的正方形阵列,其中像素值对应于高斯曲线的值(在2D中)。

图片来自http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm

图像中的每个像素都乘以高斯核。这是通过将内核的中心像素放置在图像像素上并将原始图像中的值与内核中重叠的像素相乘来完成的。将这些相乘所得的值相加,并将该结果用作目标像素处的值。查看图像,您将输入数组中(0,0)的值乘以内核数组中(i)的值,将输入数组中(1,0)的值乘以(h)的值)在内核数组中,依此类推。然后将所有这些值相加,以在输出图像上获得(1,1)的值。

图片从http://www.songho.ca/dsp/convolution/convolution.html链接

首先要回答第二个问题,内核越大,操作成本就越高。因此,模糊的半径越大,操作所需的时间就越长。

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

1256[1464141624164624362464162416414641]=1256[14641][14641]

现在,您将输入图像中的每个像素与两个内核相乘,然后将结果值相加以获得输出像素的值。

有关如何查看内核是否可分离的更多信息,请单击此链接

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

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


1
您能否添加一条简短的说明来解释为什么两个不同的5 x 5内核具有略微不同的数字(一个总数为273,另一个总数为256)?对于新手来说,这似乎是一个潜在的困惑。
trichoplax

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

不要忘记在线性色彩空间中工作以获得正确的结果。
v.oddou 2015年

16

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

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

因此,对于大小(),您只需要评估值(),该值就小得多。如果您的操作包括读取纹理元素(通常称为“ tap”),那么这是个好消息:更少的拍子更便宜,因为获取纹理的成本很高。n×nO(n2)2×nO(n)

这就是为什么模糊算法通过执行两次遍历来使用该属性的原因,一次遍历通过收集水平像素进行水平模糊,而一次遍历通过收集垂直像素进行垂直模糊处理。结果是最终的模糊像素颜色。nn


13

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

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

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

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

高斯模糊遵循与框模糊相同的宽泛过程,但是它使用更复杂的公式来确定权重。可以根据与中心的距离r,通过计算。高斯中所有样本的总和最终为如果您对每个像素进行采样,则大约为1.0,但是高斯具有无限支持(它的值无处不在)这一事实意味着您需要使用经过稍微修改的版本,仅使用几个值就可得出1.0。

ex2/22π

当然,如果您在很大的半径上执行它们,那么这两个过程都可能非常昂贵,因为您需要采样很多像素才能计算出模糊。这就是最终的诀窍所在:高斯模糊和盒式模糊都称为“可分离”模糊。这意味着,如果您沿一个轴执行模糊处理,然后沿另一轴执行模糊处理,则将产生与您同时沿两个轴执行模糊处理时完全相同的结果。这可能非常重要。如果模糊范围为10px,则需要100天真形式的样本,但分离时仅需要20个样本。由于合并的模糊是,而分离的形式是,所以差异只会变得更大。O(n2)O(n)


1
查看您的其他答案,看来您的数学背景比我以前使用的要好,但我希望它仍然能详细介绍以提供帮助。我希望它对任何背景的人都有用。
porglezomp 2015年

1
如果您在跟我说话,那根本就没有。您的回答和伯特的观点令人惊讶。非常感谢!现在一定要消化一些信息(:
艾伦·沃尔夫

11

正如其他人指出的那样,实现高斯模糊时要考虑的最重要的事情是将2D卷积滤波器分为两个1D卷积,因为它将复杂度从到。O(n2)O(n)

但是在实际的实现中,您可能还需要考虑两个技巧:

滤镜具有一定的半径,因此,在边界处,您将需要使用落在图像外部的像素进行计算。在这种情况下,您可以尝试以下操作之一:对于外部像素,您只需获取最后一个可能的值(即,位于边界处的像素,如中所示max(x, 0)。),也可以将图像“反射”至外部(如中所示x < 0 ? -x : x)。或者,您可以简单地在边界处停下来,然后需要在卷积滤波器中调整分母,使其总和为1。例如:

sum1256[1464141624164624362464162416414641]=sum1225[0000001624160024361600162416000000]=1.
另一个技巧涉及如何计算内核的实际系数。显然,您可以尝试实现高斯函数,但更快的方法是观察一维内核重新组合Pascal的三角形。例如:
     1
    1 1
   1 2 1
  1 3 3 1
[1 4 6 4 1]
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.