建立高斯模糊?

时间:2014-09-30 23:14:30

标签: filter blur gaussian edge-detection

我正在尝试使用Python 2.7编写自己的(或至少可以更好地理解)高斯模糊滤镜。我真的很感激一些方向。我看过的其他任何地方都只使用内置插件......

1 个答案:

答案 0 :(得分:0)

您需要遍历图像中的每个像素。在每个像素处从其周围环境中取出加权样本并将它们全部加到像素的新值上。所以代码看起来像这样:

for x in range(input.size[0]):
    for y in range(input.size[1]):
        result[x, y] = 0
        result[x, y] += 0.01 * input[x-1, y+1] + 0.08 * input[x, y+1] + 0.01 * input[x+1, y+1]
        result[x, y] += 0.08 * input[x-1, y  ] + 0.64 * input[x, y  ] + 0.08 * input[x+1, y  ]
        result[x, y] += 0.01 * input[x-1, y-1] + 0.08 * input[x, y-1] + 0.01 * input[x+1, y-1]

但在我的代码中,我没有照顾图像的边缘。这将导致对图像进行索引和过度索引。如何处理边缘至少有三种不同的简单方法:

  1. 您可以缩小for循环的范围,使其不会模糊边缘上的像素,并在模糊后裁剪出图像外的模糊像素。
  2. 如果你在图像的边缘,你可以制作if语句。在边缘上,您不会将样本取出范围并将其他像素的权重调整为1.0。
  3. 您可以将图像镜像到每一面。这可以通过实际镜像图像或通过访问图像内部的像素来完成,就像过度索引一样。
  4. 使用选项2和3,边缘不像图像中心那样模糊。如果您的样本窗口大小为3x3,则这是一个小问题,但是如果样本窗口大小更大,则可以看到它。

    如果要获得良好的性能,可以尝试使用OpenCL或OpenGL启动替换for循环,并将内部循环写入OpenCL内核或GLSL着色器。这些将导致尽可能多的像素并行计算。通过先在水平轴上然后在垂直轴上模糊,可以进一步优化这些,这样可以减少样品数量,并且在样品窗口较大时应该更快。

    关于同样的事情用this post中的其他词来解释。