我正在尝试在图像上应用Sobel滤镜以使用scipy检测边缘。我在Windows 7 Ultimate(64位)上使用Python 3.2(64位)和scipy 0.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”)图像,因此每个像素只有一个与之关联的值。

不幸的是,我还不能在这里发布图片(信誉不高),但是我在下面提供了链接:

原始图片(bike.jpg):
http://s2.postimage.org/64q8w613j/bike.jpg

被Scipy过滤(sobel.jpg):
http://s2.postimage.org/64qajpdlb/sobel.jpg

预期产量:
http://s1.postimage.org/5vexz7kdr/normal_sobel.jpg

我显然在某个地方出错了!有人可以告诉我在哪里。谢谢。

最佳答案

1)使用更高的精度。 2)您仅在计算沿零轴的导数的近似值。 2D Sobel运算符在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)

关于python - 使用scipy应用Sobel滤波器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7185655/

10-12 23:12