代码之家  ›  专栏  ›  技术社区  ›  tombuben

Python图像卷积与numpy切片在某些图像上产生奇怪的结果

  •  1
  • tombuben  · 技术社区  · 8 年前

    我正在尝试使用Numpy在GIMP中的插件中实现卷积,我得到了一些奇怪的结果。

    给我带来问题的函数是:(它只在灰度图像上运行)

    def convolve(self, pixels, kernel):
      bw, bh = pixels.shape
      k_w, k_h = kernel.shape
      if (k_w != k_h):
        raise ValueError("Passed kernel is not of the right shape")
    
      #expand the image
      bigger = np.lib.pad(pixels, int(k_w/2), 'reflect').astype(np.float)
    
      pixels.fill(0)
      pixels = pixels.astype(np.float)
      for x in range(k_w):
        for y in range(k_h):
          pixels += kernel[x,y]*bigger[x : bw + x,
                                       y : bh + y]
      return np.clip(pixels,0,255).astype(np.uint8)
    

    不知何故,对于某些尺寸的图像,输出会变得一团糟。具体示例可以是在该图像上应用5x5高斯模糊时:

    输入: input

    输出不正确: incorrect output

    最奇怪的是,对于很多图像,尤其是正方形的图像,这个插件工作得很好。例如,如果我在GIMP中手动将图像展开为正方形,则会得到正确模糊的图像:

    correct output

    我曾尝试将numpy数组调整为正方形,然后将其裁剪回来,但令人惊讶的是,这并没有解决问题。

    编辑:当前正在运行以下代码:

    self.convolve(pixels,
                  np.array([
                  [ 1, 4, 6, 4, 1,],
                  [ 4,16,24,16, 4,],
                  [ 6,24,36,24, 6,],
                  [ 4,16,24,16, 4,],
                  [ 1, 4, 6, 4, 1,],
                  ], dtype=np.float)*1/256)
    

    但在任何3x3过滤器中都可以看到同样的问题,像这样的内核可以很好地工作

    [  0, 0,   0,],
    [0.5, 0, 0.5,],
    [  0, 0,   0,],
    

    [ 0, 0.5, 0,],
    [ 0,   0, 0,],
    [ 0, 0.5, 0,],
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   tombuben    8 年前

    发现问题!该问题是由于错误地将数据从GIMP解析到numpy数组引起的。意外地交换了数组的维度,这导致了过滤器的一些奇怪行为。