2017-07-31 14 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'の種類は何ですか。それはunsiged場合は、アンダーフローにつながる可能性があります。 –

+0

行列を符号なし整数としてロードすると、実際には負の値が白の値になるように結果がラップアラウンドします。 –

+0

しかし 'scipy.convolve'は1d配列でしか動かないのですか? –

答えて

1

私の問題は、画像がの符号なしの整数で動作することです。結果として、たとえば0から1を減算すると、uint8には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

関連する問題