python - 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
. 它引发下一个错误。
有没有人可以帮我解决这个问题?
解决方案
属性“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
(或您的技术中的任何类似内容),这就是索引不起作用的原因。
推荐阅读
- python - 将字典存储在唯一值列中具有重复条目的数据框中
- amazon-web-services - 如何在 AWS 中获取自定义私有 DNS
- scala - 从kafka主题获取最后插入的消息
- c# - GetUtcOffset 返回某些年份/日期的错误偏移量
- python - How to plot a pie chart in matplotlib with 3 columns?
- plsql - ORA-06502: PL/SQL: 将同一列批量收集到自己声明的类型时出现数字或值错误
- web-crawler - 将发现的 url 循环回获取它们的正确方法是什么?
- java - 如何通过 mvvm 架构使 Room 数据库插入方法返回 int?
- c# - Assembly.GetExecutingAssembly().GetManifestResourceStream 不加载流
- javascript - 在 React Hooks 中设置状态是否有通用方法?如何管理多个状态?