4

我正在尝试在 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 页面的理解,我应该乘以 1d sobel 结果而不是hypot :confused

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

4

1 回答 1

5

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

对于 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,但据我从文档中可以看出,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 应该有你需要的一切。


更新

实际上,如果您只对幅度感兴趣,那么 numpy 中有一个完整的函数

 mag = generic_gradient_magnitude(your3Dmatrix, sobel)
于 2012-06-29T20:11:46.900 回答