2017-07-31 50 views
1

我只是在玩SciPy和Python中的卷積和內核。我用於邊緣檢測下面的內核,因爲它是在this wikipedia article上市:

kernel

這是我所使用的圖像:
lion

我得到的結果是相當令人失望:
result邊緣檢測不能按預期工作

我用於卷積的代碼:

edge = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]) 
results = sg.convolve(img, edge, mode='same') 
results[results > 255] = 255 
results[results < 0] = 0 

...我用來讀取圖像的代碼:

img = np.array(Image.open('convolution_test/1.jpg')) 
img = img[:, :, 0] 

爲什麼會出現這些壞的結果?

TIA。

+0

什麼是'img'的類型。因爲如果它是未知的,這可能會導致下溢。 –

+0

如果將矩陣加載爲無符號整數,則結果可能會環繞,使得負數實際上是白色值。 –

+0

但'scipy.convolve'只適用於1d數組? –

回答

1

我認爲問題在於你的圖像與無符號的整數。因此,如果您例如從零中減去1,則的值爲0-1 = 255,因此在實際值應該爲黑色的位置顯示白色。

然而,您可以通過使用帶符號整數(最好具有更大的深度)來輕鬆解決此問題。例如:

from PIL import Image 
import numpy as np 
import scipy.signal as sg 

img = np.array(Image.open('convolution_test/1.jpg')) 
img = img[:, :, 0] 
img = img.astype(np.int16) 

edge = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]) 
results = sg.convolve(img, edge, mode='same') 
results[results > 255] = 255 
results[results < 0] = 0 

results = results.astype(np.uint8) 

對我來說,這會產生如下圖: enter image description here