AttributeError:“ FileDataset”对象没有属性“ PixelSpacing”

时间:2018-07-19 05:35:00

标签: python dicom pydicom

我想将一系列图像的文件类型从.dcm转换为.mha。以下是我的代码:

import numpy
import pydicom
import os
PathDicom ='./DicomResource'
lstFilesDCM = []
for dirName, subdirList, fileList in os.walk(PathDicom):
for filename in fileList:
    if '.dcm' in filename.lower():
        lstFilesDCM.append(os.path.join(dirName, filename))

RefDs = pydicom.read_file(lstFilesDCM[0])
ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM))
#RefDs.PixelSpacing = 0
ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), 
float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
info = ConstPixelDims + ConstPixelSpacing
f = open('info.txt', 'w')
for n in info:
    f.write(str(n)+' ')
f.close()
location = []
for i in range(len(lstFilesDCM)):
    ds = pydicom.read_file(lstFilesDCM[i])
    location.append(ds.SliceLocation)
location.sort()
ArrayDicom = numpy.zeros((len(lstFilesDCM), RefDs.Rows, RefDs.Columns), 
dtype=RefDs.pixel_array.dtype)
for filenameDCM in lstFilesDCM:
    ds = pydicom.read_file(filenameDCM)
    ArrayDicom[location.index(ds.SliceLocation), :, :] = ds.pixel_array
ds = ArrayDicom.tostring()
f = open('1.mha', 'wb')
f.write(ds)
f.close()

有了这个,我得到以下错误:

  

AttributeError:“ FileDataset”对象没有属性“ PixelSpacing”

我还尝试添加RefDs.PixelSpacing = 0。它引发下一个错误。 Error

有没有人可以帮助我解决问题?

1 个答案:

答案 0 :(得分:2)

并非所有SOP类都必须具有属性“ PixelSpacing”(0028,0030)。对于某些SOP类,如“ CT图像存储”(模态CT),此类型为“ 1”。与许多其他类型一样,它是“ 1C”类型。在SOP类中,例如“计算机射线照相图像存储”(模态CR),等效属性“成像器像素间距”(0018,1164)包含在数据集中。以下 2017a第3部分-信息对象定义中的引用对此进行了解释。

  

10.7.1.1像素间距
  像素间距(0028,0030)指定患者在每个像素中心之间的物理距离。
  如果存在像素间距(0028,0030)并且尚未校准图像以校正几何放大效果,则此属性的值应与“成像仪像素间距(0018,1164)”或“名义扫描像素间距”相同(0018,2010),如果存在这些属性之一。
  如果存在像素间距(0028,0030),并且其值与Imager像素间距(0018,1164)或标称扫描像素间距(0018,2010)中的值不同,则说明该图像已针对已知或假定的几何放大倍率进行了校正,或者相对于患者体内已知深度的已知大小的物体进行校准。
  如果缺少像素间距校准类型(0028,0A02)和成像仪像素间距(0018,1164)和标称扫描像素间距(0018,2010),则无法确定是否已执行校正或校准。
  注意
  1. DX系列IOD中必须使用“成像器像素间距(0018,1164)”。
  2.名义扫描像素间距(0018,2010)是多帧SC系列IOD的必需属性

看着您的问题,您的代码似乎未绑定到任何特定的Modality / SOP类。考虑到这一点,您的循环很有可能会遇到一些缺少此属性的实例。

关于第一个错误:

  

AttributeError:“ FileDataset”对象没有属性“ PixelSpacing”

错误非常明显。 DICOM数据集不包含您要查找的属性。

关于第二个错误:

  

TypeError:“ DSfloat”对象不支持索引

属性的值多重性是2。

Pixel Spacing = Row Spacing\Column Spacing = 0.30 mm\0.25 mm

因此,您应该能够使用索引访问该值。第一个值应用于行,第二个值应用于列。但这取决于您的工具箱/技术的实现。我不知道这两个地方,所以我不能说。

可能是,您的工具箱返回了单个值(没有数组;因此没有索引),您应该在分隔符('\')上进一步拆分然后使用它。

或者可能是由于该属性不存在,所以变量的值为null(或您技术中的类似值),这就是为什么索引无法正常工作。