【问题标题】:Python image convolution with numpy slices produces strange results on some images带有 numpy 切片的 Python 图像卷积在某些图像上产生奇怪的结果
【发布时间】:2018-04-13 06:29:26
【问题描述】:

我正在尝试使用 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 高斯模糊:

输入:

不正确的输出:

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

我尝试将 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,],

【问题讨论】:

  • 您能否也展示用于生成内核的代码,以便我们重现您所看到的内容?
  • 当然,我只是用高斯内核调用函数,编辑了主帖以添加该信息

标签: python numpy image-processing convolution gimp


【解决方案1】:

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

【讨论】:

  • 您能否接受这个答案,以便希望回答问题的人知道它已解决。
猜你喜欢
  • 2014-03-05
  • 2019-12-04
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多