python中的3d sobel算法?

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?

Hug*_*une 5

首先,参考您的维基百科链接:那里的乘法指的是构建索贝尔卷积核的方式,而不是最终结果。

对于 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)