Filter 建立高斯模糊?

Filter 建立高斯模糊?,filter,blur,gaussian,edge-detection,Filter,Blur,Gaussian,Edge Detection,我正在尝试使用Python2.7编写自己的(或至少更好地理解)高斯模糊过滤器。我真的很想知道方向。我看过的其他地方都是使用内置的 您需要在图像中的每个像素之间循环。在每个像素处,从其周围环境中获取加权样本,并将它们相加为像素的新值。所以代码看起来像这样: for x in range(input.size[0]): for y in range(input.size[1]): result[x, y] = 0 result[x, y] += 0.01 *

我正在尝试使用Python2.7编写自己的(或至少更好地理解)高斯模糊过滤器。我真的很想知道方向。我看过的其他地方都是使用内置的

您需要在图像中的每个像素之间循环。在每个像素处,从其周围环境中获取加权样本,并将它们相加为像素的新值。所以代码看起来像这样:

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]
但在我的代码中,我没有考虑图像的边缘。这将导致图像索引不足和索引过度。至少有三种不同的简单方法来处理边缘:

  • 可以减小for循环的范围,使其不会模糊边缘上的像素,并在模糊后从图像中裁剪出未模糊的像素
  • 您可以使用if语句检查您是否处于图像的边缘。在边缘上,您没有将采样移出范围,也没有将其他像素的权重调整为总和为1.0
  • 你可以将图像镜像到每一面。这可以通过实际镜像图像或访问图像内部的像素来实现,尽可能远离边缘,尽可能远离过度索引
  • 使用选项2和3,边缘不会像图像中心那样模糊。如果示例窗口大小为3x3,则这是一个小问题,但如果示例窗口大小大得多,则可以看到它

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

    关于同一件事,请在中用其他词语解释