最佳答案
编写朴素的高斯模糊实际上非常简单。它的完成方式与任何其他卷积滤波器完全相同。框和高斯滤波器之间的唯一区别是您使用的矩阵。
假设您有一个定义如下的图像:
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。
我希望这能给你一个足够好的解释。
关于c - 如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1696113/