首页 > 解决方案 > AttributeError:“FileDataset”对象没有属性“PixelSpacing”

问题描述

我想将一系列图像的文件类型从 .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. 它引发下一个错误。 错误

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

标签: pythondicompydicom

解决方案


属性“PixelSpacing”(0028,0030) 在所有 SOP 类中不是强制性的。对于一些 SOP 类,如“CT 图像存储”(Modality CT),这是类型“1”。与许多其他人一样,它是“1C”型。在“Computed Radiography Image Storage”(Modality CR)等 SOP 类中,等效属性“Imager Pixel Spacing”(0018,1164)包含在数据集中。以下引用2017a 第 3 部分 - 信息对象定义对此进行了一些解释。

10.7.1.1 像素间距
像素间距 (0028,0030) 指定了患者中每个像素中心之间的物理距离。
如果像素间距 (0028,0030) 存在且图像尚未校准以校正几何放大的影响,则此属性的值应与成像器像素间距 (0018,1164) 或标称扫描像素间距中的相同(0018,2010),如果存在这些属性中的任何一个。
如果像素间距 (0028,0030) 存在且值与成像器像素间距 (0018,1164) 或标称扫描像素间距 (0018,2010) 中的值不同,则图像已针对已知或假定的几何放大率进行了校正,或者相对于患者体内已知深度的某些已知大小的物体进行校准。
如果没有像素间距校准类型(0028,0A02)和成像器像素间距(0018,1164)和标称扫描像素间距(0018,2010),则无法确定是否进行了校正或校准。

1. Imager Pixel Spacing (0018,1164) 是 DX 系列 IOD 中的必需属性。
2. 标称扫描像素间距 (0018,2010) 是多帧 SC 系列 IOD 中的必需属性

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

关于第一个错误:

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

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

关于第二个错误:

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

属性的值多重性为 2。

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

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

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

或者可能是由于属性不存在,变量的值是null(或您的技术中的任何类似内容),这就是索引不起作用的原因。


推荐阅读