【问题标题】:Extract and save a slice from a volume with numpy使用 numpy 从卷中提取并保存切片
【发布时间】:2012-11-09 15:40:49
【问题描述】:

我正在尝试使用 numpy 从卷中提取切片。 体积是 512x512x132,我想要切片号 66。 每个体素都是一个无符号的 16 位整数。

我的代码是:

import numpy

original = numpy.fromfile(filepath, dtype=numpy.uint16)
original = numpy.reshape(original, (512,512,132))

slice = original[:,:,66]

f = open('test.rawl', 'w')
slice.tofile(f)
f.close()

代码很干净,但是当我用外部程序打开切片时,它不是切片数据而是垃圾。

我做错了什么?

谢谢

【问题讨论】:

  • 什么外部程序打开numpy数组文件?
  • 它们是原始文件,我使用MANGO,它是一个DICOM查看器,也可以打开原始数据。我认为要保存为 numpy 数组,您必须使用 load() 和 save()。如果我错了,请纠正我。
  • numpy.load() 和 numpy.save() 仅适用于基本上包含腌制数组对象的 Numpy 特定文件格式。

标签: python numpy imaging medical


【解决方案1】:

您的第一个问题是您的轴错了。假设您要使用 132 层 512x512 图像:

original = numpy.fromfile(filepath, dtype=numpy.uint16).reshape((132, 512, 512))

然后进行切片:

slc = original[66]

另外,像 Numpy 数组这样的二进制数据使用:

f = open('test.raw', 'wb')

模式中的“b”表示二进制。否则,Python 将假定您正在尝试编写文本并执行诸如将换行符转换为系统的适当格式等操作。

顺便说一下,ndarray.tofile() 方法也需要一个文件名,所以除非你有特殊原因,否则没有必要先创建一个文件句柄。你可以使用

arr.tofile('test.raw')

最后一点:尽量不要使用slice 作为变量。这是 Python 中的一个内置名称,如果用其他东西遮蔽它,您可能会遇到麻烦。

【讨论】:

  • 感谢您的回答,我采纳了您的建议,但问题仍然存在。将 Numpy 视图写入文件可能会出现问题吗?
  • 不,这不是问题。在不了解数据应该是什么样子或如何形成的情况下,我认为没有更好的答案。您确定您正在读取的文件仅包含原始数据吗?如果是这样,它是用 C 顺序编写的吗?
  • 我确信它只包含原始数据。如果我写入文件原始数组,它与原始输入文件相同。我确定它是 C 顺序的。我正在上传一个示例。
  • 你有没有安装过matplotlib?如果是这样,如果你这样做import matplotlib.pyplot as plt; plt.imshow(slice),它会显示什么?
  • 我无法上传图片,新用户。但你可以在这里看到i50.tinypic.com/21o7ckn.png 和i48.tinypic.com/8vw5c1.png。 matplotlib 也有同样的问题。
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2017-03-17
相关资源
最近更新 更多