Kia*_*ash 4 python numpy image-processing computer-vision
我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)
但是根据我对计算 2d的wiki 页面的理解,我应该乘以 1d sobel 结果而不是假设:confused
无论如何,要转到 3d,我想我需要在每个轴上计算 1d sobel,然后将所有值相乘,但我不确定......是否有任何库可以更快地计算 3d sobel?
首先,参考您的维基百科链接:那里的乘法指的是构建索贝尔卷积核的方式,而不是最终结果。
对于 2D sobel 滤波器,您需要一个内核来获取 x 方向的导数,以及另一个内核来获取 Y 方向的导数,例如

这基本上就是你的两个命令所做的,所以如果你使用 numpy,你不需要自己构建这些内核。
dx = ndimage.sobel(preSobel, 0) # horizontal derivative
dy = ndimage.sobel(preSobel, 1) # vertical derivative
Run Code Online (Sandbox Code Playgroud)
现在对于 3D 情况,您需要使用 3 个内核进行 3 次操作,一个用于 dx、dy、dz。链接的 wiki 部分告诉您如何通过乘以组件来构建内核。例如,dZ 的成品 sobel 内核是一个 3x3x3 矩阵,如下所示:

要获得大小,您仍然必须在之后取平方导数(斜边)的平方根。
我没有 numpy 但据我从文档中可以看出ndimage sobel 命令可以处理任意数量的维度,因此,内核已经提供:
dx = ndimage.sobel(your3Dmatrix, 0) # x derivative
dy = ndimage.sobel(your3Dmatrix, 1) # y derivative
dz = ndimage.sobel(your3Dmatrix, 2) # z derivative
Run Code Online (Sandbox Code Playgroud)
现在斜边命令可能只需要 2 个参数,因此您必须找到另一种有效计算 mag = sqrt(dx dx + dy dy + dz*dz) 的方法。但是 NumPy 应该有你需要的一切。
更新
实际上,如果您只对大小感兴趣,那么 numpy 中有一个完整的函数:
mag = generic_gradient_magnitude(your3Dmatrix, sobel)
Run Code Online (Sandbox Code Playgroud)