我正在尝试在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的库吗?
答案 0 :(得分:4)
首先,参考你的wikipedia link:乘法是指构造索贝尔卷积核的方法,而不是最终结果。
对于2D sobel滤波器,您需要一个内核来获取x方向的导数,而另一个内核来获得Y方向的导数,例如:
这基本上是你的两个命令所做的,所以如果你使用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矩阵,如下所示:
为了达到这个幅度,你仍然必须采用平方导数(斜边)的平方根。
我没有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)