首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >3d sobel算法在python中的实现

3d sobel算法在python中的实现
EN

Stack Overflow用户
提问于 2012-06-30 03:41:39
回答 1查看 5.1K关注 0票数 4

我正在尝试用python计算一个3d sobel滤波器。我有一个非常好的二维图像代码,如下所示。

顺便说一句。我的原始图像是uint8类型的。

代码语言:javascript
运行
复制
    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的库?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-30 04:11:47

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

对于2D sobel滤波器,您需要一个核来获得x方向的导数,另一个核来获得Y方向的导数,例如

这实际上就是您的两个命令所做的事情,所以如果您使用numpy,则不需要自己构造这些内核。

代码语言:javascript
运行
复制
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命令可以处理任意数量的维度,因此,内核已经提供:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
 mag = generic_gradient_magnitude(your3Dmatrix, sobel)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11267994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档