[英]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.