python中的3d-sobel算法?

2024-09-29 23:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用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的理解来看,我应该乘以1d的sobel结果,而不是hypot:confussed

不管怎样,要想进入3d,我想我需要计算每个轴上的1d sobel,然后乘以所有的,但我不确定。。。有没有哪家图书馆能更快地计算出3d-sobel?在


Tags: 代码图像numpy过滤器ndimagedydxastype
1条回答
网友
1楼 · 发布于 2024-09-29 23:25:38

首先,关于你的wikipedia link:乘法指的是构造sobel卷积核的方法,而不是最终结果。在

对于2D-sobel滤波器,需要一个内核来获得x方向的导数,而另一个内核则需要Y方向的导数,例如。 enter image description here

这基本上就是您的两个命令所做的,所以如果您使用的是numpy,您不需要自己构建这些内核。在

dx = ndimage.sobel(preSobel, 0)  # horizontal derivative
dy = ndimage.sobel(preSobel, 1)  # vertical derivative

现在对于3D的情况,你需要3个操作和3个内核,一个用于dx,dy,dz。 linkedwiki部分告诉您如何通过将组件相乘来构造内核。例如,dZ的sobel内核是一个3x3x3矩阵,如下所示:

enter image description here

为了得到这个量值,你还需要求平方导数的平方根(斜边)。在

我没有numpy,但是从the documentation可以看出ndimage sobel命令可以处理任意数量的维,因此,内核已经提供了:

^{pr2}$

现在斜边命令可能只需要两个参数,所以您必须找到另一种方法来有效地计算mag=sqrt(dxdx+dydy+dz*dz)。 但NumPy应该有你需要的一切。在


更新

实际上,如果你只对震级感兴趣,there is a complete function in numpy for this

 mag = generic_gradient_magnitude(your3Dmatrix, sobel)

相关问题 更多 >

    热门问题