我正在尝试用python计算一个3d sobel滤波器。我有一个非常好的二维图像代码,如下所示。
顺便说一句。我的原始图像是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的理解,我应该将1dsobel的结果相乘,而不是假设:
无论如何,为了转到3d,我想我需要在每个轴上计算1d sobel,然后乘以所有,但我不确定…有没有更快计算3d sobel的库?
发布于 2012-06-29 20:11:47
首先,关于你的wikipedia link:这里的乘法是指构建sobel卷积内核的方法,而不是最终结果。
对于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
现在the命令可能只有2个参数,所以您必须找到另一种有效地计算dx_dx= dy_dy ( mag +sqrt+ dz*dz)的方法。但是NumPy应该有你需要的所有东西。
更新
实际上,如果你只对大小感兴趣,there is a complete function in numpy for this
mag = generic_gradient_magnitude(your3Dmatrix, sobel)
https://stackoverflow.com/questions/11267994
复制相似问题