簡體   English   中英

Python 圖像卷積與 numpy 切片在某些圖像上產生奇怪的結果

[英]Python image convolution with numpy slices produces strange results on some images

我正在嘗試使用 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,],

發現問題! 該問題是由於錯誤地將數據從 GIMP 解析到 numpy 數組而引起的。 不小心交換了數組的維度,導致過濾器出現了一些奇怪的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM