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

标签 c image-processing gaussianblur

我想使用原生高斯模糊公式来模糊我的图像。我读了the Wikipedia article ,但我不确定如何实现。

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

我不想使用像 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。

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

关于c - 如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1696113/

相关文章:

c++ - 图像二值化库的设计模式

css - 在 safari 和移动浏览器中的图像上使用 <feGaussianBlur/> 的奇怪人工制品

android - 在屏幕截图中模糊矩形

C - 传递 json_t (jansson lib) 作为参数(指针)

c++ - 在 Opencv 中找不到带有函数的标识符,如何解决?

opencv - 使用 OpenCV 进行零件识别/分类

java - 如何对openCV中的图片应用高斯模糊?

c - 从 C 中的用户定义函数返回指针

c++ - GMP 如何在任意数量的字节上存储它的整数?

Java队列链表