当前位置: 首页 > 面试题库 >

从numpy数组创建pydicom文件

广瑞
2023-03-14
问题内容

我正在尝试从标准大小(512 x 512或256 x 256)的numpy数组创建mew
dicom图像。看来这应该很简单,我从http://code.google.com/p/pydicom/source/browse/source/dicom/examples/write_new.py修改了我的代码,该代码似乎执行了相同的操作处理,但是当我保存文件时,无法在RadiAnt或MicroDicom中查看它。

import dicom, dicom.UID
from dicom.dataset import Dataset, FileDataset

def write_dicom(pixel_array,filename):

    file_meta = Dataset()
    ds = FileDataset(filename, {},file_meta = file_meta,preamble="\0"*128)
    ds.PixelData = pixel_array.tostring()
    ds.save_as(filename)
    return

if __name__ == "__main__":
    import numpy as np
    pixel_array = np.tile(np.arange(256).reshape(16,16), (16,16)) * 4
    write_dicom(pixel_array,'pretty.dcm')

问题答案:

上面的示例可以工作,但会导致许多工具抱怨DICOM,并且甚至不能通过使用itk /
SimpleITK作为堆栈来读取它们。我发现从numpy制作DICOM的最好方法是使用SimpleITK工具并逐片生成DICOM。一个基本示例(https://github.com/zivy/SimpleITK/blob/8e94451e4c0e90bcc6a1ffdd7bc3d56c81f58d80/Examples/DicomSeriesReadModifyWrite/DicomSeriesReadModifySeriesWrite.py)显示了如何加载到堆栈中,执行转换然后重新保存文件,但是可以很容易地保存文件通过使用

import SimpleITK as sitk
filtered_image = sitk.GetImageFromArray(my_numpy_array)

最终在输出图像中的标签数量很大,因此手动创建所有标签都是很乏味的。另外,SimpleITK支持8、16、32位图像以及RGB,因此比在pydicom中制作图像要容易得多。

(0008, 0008) Image Type                          CS: ['DERIVED', 'SECONDARY']
(0008, 0016) SOP Class UID                       UI: Secondary Capture Image Storage
(0008, 0018) SOP Instance UID                    UI: 1.2.826.0.1.3680043.2.1125.1.35596048796922805578234000521866725
(0008, 0020) Study Date                          DA: '20170803'
(0008, 0021) Series Date                         DA: '20170803'
(0008, 0023) Content Date                        DA: 0
(0008, 0030) Study Time                          TM: '080429.171808'
(0008, 0031) Series Time                         TM: '080429'
(0008, 0033) Content Time                        TM: 0
(0008, 0050) Accession Number                    SH: ''
(0008, 0060) Modality                            CS: 'OT'
(0008, 0064) Conversion Type                     CS: 'WSD'
(0008, 0090) Referring Physician's Name          PN: ''
(0010, 0010) Patient's Name                      PN: ''
(0010, 0020) Patient ID                          LO: ''
(0010, 0030) Patient's Birth Date                DA: ''
(0010, 0040) Patient's Sex                       CS: ''
(0018, 2010) Nominal Scanned Pixel Spacing       DS: ['1', '3']
(0020, 000d) Study Instance UID                  UI: 1.2.826.0.1.3680043.2.1125.1.33389357207068897066210100430826006
(0020, 000e) Series Instance UID                 UI: 1.2.826.0.1.3680043.2.1125.1.51488923827429438625199681257282809
(0020, 0010) Study ID                            SH: ''
(0020, 0011) Series Number                       IS: ''
(0020, 0013) Instance Number                     IS: ''
(0020, 0020) Patient Orientation                 CS: ''
(0020, 0052) Frame of Reference UID              UI: 1.2.826.0.1.3680043.2.1125.1.35696880630664441938326682384062489
(0028, 0002) Samples per Pixel                   US: 1
(0028, 0004) Photometric Interpretation          CS: 'MONOCHROME2'
(0028, 0010) Rows                                US: 40
(0028, 0011) Columns                             US: 50
(0028, 0100) Bits Allocated                      US: 32
(0028, 0101) Bits Stored                         US: 32
(0028, 0102) High Bit                            US: 31
(0028, 0103) Pixel Representation                US: 1
(0028, 1052) Rescale Intercept                   DS: "0"
(0028, 1053) Rescale Slope                       DS: "1"
(0028, 1054) Rescale Type                        LO: 'US'
(7fe0, 0010) Pixel Data                          OW: Array of 8000 bytes


 类似资料:
  • 主要内容:numpy.empty(),numpy.zeros(),numpy.ones(),numpy.asarray(),numpy.frombuffer(),numpy.fromiter()在《 NumPy Ndarray对象》一节,介绍了创建 ndarray 数组的基本方法,除了使用 array() 方法外,NumPy 还提供了其他创建 ndarray 数组的方法。本节对这些常用方法做简单介绍。 numpy.empty() numpy.empty() 创建未初始化的数组,可以指定创建数组的

  • 问题内容: 我有一个二维的numpy数组,具有相等数量的列和行。我想将它们排列成一个较大的数组,对角线上的数组较小。应该可以指定起始矩阵在对角线上的频率。例如: 因此,如果我希望此数组在对角线上2次,则期望的输出将是: 3次: 有没有一种快速的方法来使用numpy方法以及对于任意大小的起始数组(仍然考虑到起始数组具有相同的行数和列数)来实现这一点? 问题答案: 方法1 经典案例- 样品运行- 方法

  • 主要内容:1. numpy.arange(),2. numpy.linspace(),3. numpy.logspace所谓区间数组,是指数组元素的取值位于某个范围内,并且数组元素之间可能会呈现某种规律,比如等比数列、递增、递减等。 为了方便科学计算,Python NumPy 支持创建区间数组。 1. numpy.arange() 在 NumPy 中,您可以使用 arange() 来创建给定数值范围的数组,语法格式如下: numpy.arange(start, stop, step, dtype

  • 在数组的属性和方法这一小节中我们学习到了如何查看数组的大小、维数(秩)、元素的数据类型、每个元素的大小等等。这一小节将详述如何从数值范围创建特殊数组,比如指定间隔的等差数列型数组、等比数列型数组等。 1. 创建等间隔序列数组 通常定义一个等间隔序列数组(即等差数组),需要指定某些具体要素,例如起始值、终止值、步长、样本数量等。主要功能类似于 Python 内置的 range 函数,但是返回的是一个

  • 我得到以下输出: 当我尝试使用Res_fs1、Res_fs2、Res_ps1、Res_ps2创建numppy数组时 我得到这个错误消息说键错误,虽然键存在:

  • 问题内容: 所以-我有一个需要a 作为输入的第三方库。我有一个。 我不想将字节写入磁盘..我想将其保留在内存中。我如何从提供的内容创建一个想法(无需写入磁盘)? 问题答案: 抱歉,不可能。除非您具有RAM磁盘,否则File本质上是磁盘上的实体-但这不是您可以用Java创建的东西。 这正是API不应该基于File对象(或过载以接受InputStream)的原因。

  • 问题内容: 假设我有三个任意的一维数组,例如: 这三个数组代表3D网格中的采样间隔,我想为所有相交构造一个三维矢量的一维数组,例如 订单实际上对此并不重要。生成它们的明显方法是: 所以问题是…有没有更快的方法?我看过但没有找到(可能只是找不到正确的Google关键字)。 我目前正在使用此: 但是我感觉好像错过了一些聪明的幻想的Numpy方式吗? 问题答案: 要在上述示例中使用numpy网格,将可以

  • 问题内容: 创建数组时,NumPy非常有用。如果for的第一个参数具有and方法,则根据它们可能是有效序列使用它们。 不幸的是,我想创建一个包含没有NumPy是“有用的”的数组。 分解为一个最小的示例,该类将如下所示: 如果“可迭代对象”的长度不同,那么一切都很好,而我得到的结果恰好是我想要的: 但是NumPy会创建一个多维数组,如果它们恰好具有相同的长度: 不幸的是,只有一个参数,所以我想知道是