Python中的sobel算法?

时间:2012-06-29 19:41:39

标签: python image-processing numpy computer-vision

我正在尝试在python中计算一个3d sobel过滤器。我有一个非常好的代码,用于下面的2D图像。

顺便说一句。我的原始图片是uint8类型。

    preSobel = preSobel.astype('int32')
    dx = ndimage.sobel(preSobel, 0)  # horizontal derivative
    dy = ndimage.sobel(preSobel, 1)  # vertical derivative
    mag = numpy.hypot(dx, dy)  # magnitude
    mag *= 255.0 / numpy.max(mag)  # normalize (Q&D)
    img[i,:,:]=mag

但是根据我对计算2d的wiki page的理解,我应该乘以1d sobel结果而不是hypot:confused

无论如何,要去3d,我想我需要在每个轴上计算1d sobel,然后乘以所有但是我不确定...那里有没有更快地计算3d sobel的库吗?

1 个答案:

答案 0 :(得分:4)

首先,参考你的wikipedia link:乘法是指构造索贝尔卷积核的方法,而不是最终结果。

对于2D sobel滤波器,您需要一个内核来获取x方向的导数,而另一个内核来获得Y方向的导数,例如: enter image description here

这基本上是你的两个命令所做的,所以如果你使用numpy,你不需要自己构建这些内核。

dx = ndimage.sobel(preSobel, 0)  # horizontal derivative
dy = ndimage.sobel(preSobel, 1)  # vertical derivative

现在对于3D情况,你需要3个内核的3个操作,一个用于dx,dy,dz。 链接的wiki部分告诉您如何通过乘以组件来构造内核。例如,用于dZ的完成的sobel内核是一个3x3x3矩阵,如下所示:

enter image description here

为了达到这个幅度,你仍然必须采用平方导数(斜边)的平方根。

我没有numpy,但据我所知,the documentation ndimage sobel命令可以处理任意数量的维度,所以内核已经提供了:

dx = ndimage.sobel(your3Dmatrix, 0)  # x derivative
dy = ndimage.sobel(your3Dmatrix, 1)  # y derivative
dz = ndimage.sobel(your3Dmatrix, 2)  # z derivative

现在,hypotenuse命令可能只占用2个参数,因此您必须找到另一种方法来有效地计算mag = sqrt(dx dx + dy dy + dz * dz)。 但NumPy应该拥有你需要的一切。


<强>更新

实际上,如果您只对幅度感兴趣,there is a complete function in numpy for this

 mag = generic_gradient_magnitude(your3Dmatrix, sobel)