11

画像にSobelフィルターを適用して、scipyを使用してエッジを検出しようとしています。私はWindows7Ultimate(64ビット)でPython 3.2(64ビット)とscipy0.9.0を使用しています。現在、私のコードは次のとおりです。

import scipy
from scipy import ndimage

im = scipy.misc.imread('bike.jpg')
processed = ndimage.sobel(im, 0)
scipy.misc.imsave('sobel.jpg', processed)

何が間違っているのかわかりませんが、処理された画像は本来あるべき姿とはまったく異なります。画像「bike.jpg」はグレースケール(モード「L」ではなく「RGB」)画像であるため、各ピクセルには1つの値しか関連付けられていません。

残念ながら、私はまだここに画像を投稿することはできません(十分な評判がありません)が、以下のリンクを提供しました:

元の画像(bike.jpg): http ://s2.postimage.org/64q8w613j/bike.jpg

Scipy Filtered(sobel.jpg): http ://s2.postimage.org/64qajpdlb/sobel.jpg

期待される出力: http ://s1.postimage.org/5vexz7kdr/normal_sobel.jpg

私は明らかにどこかで間違っています!誰か教えてもらえますか?ありがとう。

4

3 に答える 3

29

1) より高い精度を使用します。2)ゼロ軸に沿った導関数の近似のみを計算しています。2D ソーベル演算子についてはWikipediaで説明されています。このコードを試してください:

import numpy
import scipy
from scipy import ndimage

im = scipy.misc.imread('bike.jpg')
im = im.astype('int32')
dx = ndimage.sobel(im, 0)  # horizontal derivative
dy = ndimage.sobel(im, 1)  # vertical derivative
mag = numpy.hypot(dx, dy)  # magnitude
mag *= 255.0 / numpy.max(mag)  # normalize (Q&D)
scipy.misc.imsave('sobel.jpg', mag)
于 2011-08-25T07:30:18.293 に答える
8

私はcgohlkeの答えにコメントできなかったので、彼の答えを訂正して繰り返しました。パラメータ0垂直微分に使用され、 1水平微分に使用されます (画像配列の最初の軸は y/垂直方向 - 行、2 番目の軸は x/水平方向 - 列)。間違った場所で間違いを探して 1 時間を失ったので、他のユーザーに警告したかっただけです。

import numpy
import scipy
from scipy import ndimage

im = scipy.misc.imread('bike.jpg')
im = im.astype('int32')
dx = ndimage.sobel(im, 1)  # horizontal derivative
dy = ndimage.sobel(im, 0)  # vertical derivative
mag = numpy.hypot(dx, dy)  # magnitude
mag *= 255.0 / numpy.max(mag)  # normalize (Q&D)
scipy.misc.imsave('sobel.jpg', mag)
于 2014-11-08T16:22:34.370 に答える