在不使用任何内置高斯函数的情况下,如何使高斯模糊图像?
c
image-processing
8
0

我想使用本机高斯模糊公式对图像进行模糊处理。我阅读了Wikipedia文章 ,但不确定如何实现这一点。

如何使用公式确定权重?

我不想使用像MATLAB一样的内置函数

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

这是我在C#中用于计算内核的代码的伪代码。我不敢说我正确地对待了最终条件:

double[] kernel = new double[radius * 2 + 1];
double twoRadiusSquaredRecip = 1.0 / (2.0 * radius * radius);
double sqrtTwoPiTimesRadiusRecip = 1.0 / (sqrt(2.0 * Math.PI) * radius);
double radiusModifier = 1.0;

int r = -radius;
for (int i = 0; i < kernel.Length; i++)
{
    double x = r * radiusModifier;
    x *= x;
    kernel[i] =
    sqrtTwoPiTimesRadiusRecip * Exp(-x * sqrtTwoPiTimesRadiusRecip);
    r++;
}

double div = Sum(kernel);
for (int i = 0; i < kernel.Length; i++)
{
    kernel[i] /= div;
}

希望这会有所帮助。

收藏
评论

要使用Wikipedia文章中讨论的过滤器内核,您需要实现(离散) 卷积 。这个想法是,您有一个小的值矩阵(内核),将内核从图像中的一个像素移动到另一个像素(即,矩阵的中心在像素上),然后将矩阵元素与重叠的图像相乘元素,将结果中的所有值相加,然后用该总和替换旧像素值。

高斯模糊可以分为两个1D卷积(一个垂直卷积和一个水平卷积),而不是2D卷积,这也使处理速度有所提高。

收藏
评论

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

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

 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。

我希望能给您足够的解释。

收藏
评论

我不清楚您是否要将此限制某些技术,但如果不是,则SVG(ScalableVectorGraphics)具有高斯模糊的实现。我相信它适用于所有包括像素的图元。 SVG具有成为开放标准并被广泛实施的优势。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题