【问题标题】:Reshaping numpy array重塑numpy数组
【发布时间】:2018-11-15 06:37:11
【问题描述】:

我要做的是获取一个表示 3D 图像数据的 numpy 数组,并计算每个体素的粗麻布矩阵。我的输入是一个形状矩阵 (Z,X,Y),我可以轻松地沿 z 进行切片并检索单个原始图像。

gx, gy, gz = np.gradient(imgs)

gxx, gxy, gxz = np.gradient(gx)
gyx, gyy, gyz = np.gradient(gy)
gzx, gzy, gzz = np.gradient(gz)

我可以按如下方式访问单个体素的粗麻布:

x = 100
y = 100
z = 63

H = [[gxx[z][x][y], gxy[z][x][y], gxz[z][x][y]],
     [gyx[z][x][y], gyy[z][x][y], gyz[z][x][y]],
     [gzx[z][x][y], gzy[z][x][y], gzz[z][x][y]]]

但这很麻烦,我不能轻松地对数据进行切片。

我尝试过如下使用 reshape

H = H.reshape(Z, X, Y, 3, 3) 

但是当我通过检索特定体素的粗麻布来测试时,从重新整形的数组返回的值与原始数组完全不同。

我想我可以以某种方式使用 zip,但我只能找到用于制作元组列表的方法。

  • 奖励:如果有更快的方法来完成此任务,请告诉我,我基本上需要为 3D 数据集中的每个体素计算 hessian 矩阵的三个特征值。计算粗麻布值非常快,但找到单个 2D 图像切片的特征值大约需要 20 秒。是否有任何用于图像处理的 GPU 或张量流加速库?

【问题讨论】:

  • [无耻插件] 你应该尝试使用PyDIP。在那里你可以做H = dip.Hessian(img); D,V = dip.EigenDecomposition(H),返回一个带有特征值的对角矩阵图像D 和一个带有特征向量的矩阵图像V。在这些图像中,H[x,y,z] 返回索引 (x,y,z) 处像素的 Hessian 矩阵。

标签: python numpy image-processing hessian-matrix


【解决方案1】:

我们可以使用列表推导来获取 hessian -

H_all = np.array([np.gradient(i) for i in np.gradient(imgs)]).transpose(2,3,4,0,1)

稍微解释一下:[np.gradient(i) for i in np.gradient(imgs)] 循环遍历来自np.gradient 调用的两个级别的输出,从而在外部两个轴上产生一个(3 x 3) 形状的张量。我们需要这两个作为最终输出中的最后两个轴。所以,我们用转置将它们推到最后。

因此,H_all 包含所有粗麻布,因此我们可以在给定x,y,z 的情况下提取特定的粗麻布,就像这样 -

x = 100
y = 100
z = 63
H = H_all[z,y,x]

【讨论】:

  • 使用上述方法,我得到了 4x3 而不是 3x3 的 hessian 矩阵
  • @dadrake imgs的形状是什么?
  • 86x480x480 所以我希望输出为 86 x 480 x 480 x 3 x 3
  • @dadrake 做:np.array([np.gradient(i) for i in np.gradient(imgs)]).transpose(2,3,4,0,1).
  • 很有效,你能解释为什么它有效吗?
猜你喜欢
  • 2016-02-10
  • 2020-07-11
  • 1970-01-01
  • 2013-12-13
  • 2020-10-25
  • 2021-03-03
  • 2013-01-06
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多