编写幼稚的高斯模糊实际上很容易。 它的完成方式与任何其他卷积滤波器完全相同。 盒子滤波器和高斯滤波器之间的唯一区别是您使用的矩阵。
假设您有一个定义如下的图像:
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位于右侧顶部,像素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。
我希望能给您足够的解释。
如果觉得《android 高斯模糊 c c-如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊处理?...》对你有帮助,请点赞、收藏,并留下你的观点哦!