如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊?

2024-03-12

我想使用原生高斯模糊公式来模糊图像。我读维基百科文章 http://en.wikipedia.org/wiki/Gaussian_blur,但我不确定如何实现这一点。

如何使用公式来确定权重?

我不想使用 MATLAB 等内置函数


编写朴素的高斯模糊实际上非常简单。它的完成方式与任何其他卷积滤波器完全相同。盒子和高斯滤波器之间的唯一区别是您使用的矩阵。

假设您有一个定义如下的图像:

 0  1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99

3x3 盒式滤波器矩阵定义如下:

0.111 0.111 0.111
0.111 0.111 0.111
0.111 0.111 0.111

要应用高斯模糊,您需要执行以下操作:

对于像素 11,您需要加载像素 0、1、2、10、11、12、20、21、22。

然后将像素 0 乘以 3x3 模糊滤镜的左上部分。像素 1 在顶部中间,像素 2,像素 3 在右上角,像素 10 在中间左侧,依此类推。

然后将它们相加并将结果写入像素 11。如您所见,像素 11 现在是其自身和周围像素的平均值。

边缘情况确实会变得更复杂一些。您使用什么值作为纹理边缘的值?一种方法是绕到另一侧。这对于稍后平铺的图像来说看起来不错。另一种方法是将像素推入周围的位置。

因此,对于左上角,您可以按如下方式放置示例:

 0  0  1
 0  0  1
10 10 11

我希望您能看到如何轻松地将其扩展到大型过滤器内核(即 5x5 或 9x9 等)。

高斯滤波器和盒式滤波器之间的区别在于矩阵中的数字。高斯滤波器在行和列上使用高斯分布。

例如,对于任意定义的过滤器(即这不是高斯分布,但可能相差不远)

0.1 0.8 0.1

第一列将相同,但乘以上面行的第一项。

0.01 0.8 0.1
0.08 
0.01 

第二列将相同,但值将乘以上面行中的 0.8(依此类推)。

0.01 0.08 0.01
0.08 0.64 0.08
0.01 0.08 0.01

将上述所有内容相加的结果应等于 1。上述滤波器与原始盒式滤波器之间的区别在于,写入的结束像素对中心像素(即位于该位置的像素)具有更重的权重已经)。之所以会出现模糊,是因为周围的像素确实模糊到了该像素中,尽管程度没有那么模糊。使用这种滤镜,您会得到一种模糊效果,但不会破坏尽可能多的高频(即颜色从一个像素到另一个像素的快速变化)信息。

这些类型的过滤器可以做很多有趣的事情。您可以使用此类过滤器通过从当前像素中减去周围像素来进行边缘检测。这只会留下真正大的颜色变化(高频)。

编辑:5x5 过滤器内核的定义与上面完全相同。

例如,如果您的行是 0.1 0.2 0.4 0.2 0.1 那么如果您将其中的每个值乘以第一项以形成一列,然后将每个值乘以第二项以形成第二列,依此类推,您最终将得到一个过滤器的

0.01 0.02 0.04 0.02 0.01
0.02 0.04 0.08 0.04 0.02
0.04 0.08 0.16 0.08 0.04
0.02 0.04 0.08 0.04 0.02
0.01 0.02 0.04 0.02 0.01

取任意位置,您可以看到位置 0, 0 就是简单的 0.1 * 0.1。位置 0、2 为 0.1 * 0.4,位置 2、2 为 0.4 * 0.4,位置 1、2 为 0.2 * 0.4。

我希望这能给你一个足够好的解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊? 的相关文章

随机推荐