Python 修改大量DICOM(.dcm)文件。
这也许是一个简单的问题,但我没有取得进展,希望得到帮助 我有一张422号的单子。在索引0中,有135个指向.dcm映像的文件路径。例如,索引1中的“~/images/0001.dcm”和“~/images/0135.dcm”有112个图像路径,索引2有110个路径,等等 所有图像的大小均为512 x 512。我希望将它们的大小重新调整为64 x 64 这是我第一次同时处理图像和.dcm数据,所以我很不确定如何调整大小。如果您愿意,我也不确定如何访问和修改“内部”列表中的文件 像这样的事情是不是太离谱了Python 修改大量DICOM(.dcm)文件。,python,nested-lists,dicom,cv2,Python,Nested Lists,Dicom,Cv2,这也许是一个简单的问题,但我没有取得进展,希望得到帮助 我有一张422号的单子。在索引0中,有135个指向.dcm映像的文件路径。例如,索引1中的“~/images/0001.dcm”和“~/images/0135.dcm”有112个图像路径,索引2有110个路径,等等 所有图像的大小均为512 x 512。我希望将它们的大小重新调整为64 x 64 这是我第一次同时处理图像和.dcm数据,所以我很不确定如何调整大小。如果您愿意,我也不确定如何访问和修改“内部”列表中的文件 像这样的事情是不是太
IMG_PX_SIZE = 64
result = []
for i in test_list:
result_inner_list = []
for image in i:
# resize all images at index position i and store in list
new_img = cv2.resize(np.array(image.pixel_array (IMG_PX_SIZE,IMG_PX_SIZE))
result_inner_list.append(new_img)
# Once all images at index point i are modified, append them these to a master list.
result.append(result_inner_list)
您似乎在为两个问题而挣扎:
- 访问文件路径
- 调整大小
IMG_PX_SIZE = 64
def resize(image):
# your resize code here similar to:
# return v2.resize(np.array(image.pixel_array(IMG_PX_SIZE,IMG_PX_SIZE))
pass
def read(path):
# your file read operation here
pass
big_list = [['~/images/0001.dcm','~/images/0135.dcm'],
['~/images/0002.dcm','~/images/0136.dcm']]
resized_images = [[resize(read(path)) for path in paths] for paths in big_list]
之后你想做什么?如果你像这样调整大小,你应该验证一些dicom字段,图像位置,像素间距等。。。我想最好的方法是在软件中重新打开dicom序列,如itk snap或slicer 3d等。。。并检查图像是否重叠。我不确定是否理解索引组织。为什么不能使用dicom标签对不同的序列进行排序?@p.deman感谢您的回复-数据是从医疗数据托管网站下载的。这是我第一次使用.dcm文件,所以我对格式的技术细节有点不确定。基本上,我有一个422大小的列表,代表422名患者。对于这些患者中的每一位,从他们的3d扫描到他们各自的.dcm文件都有大约90-140条路径。我正在培训一名CNN,希望将图像的大小从512 x 512调整到64 x 64。本质上,我有一个列表,每个索引中都有另一个DCM路径列表,我希望迭代打开并调整其大小。所有患者的所有文件都在同一文件夹中,或者每个患者都有子文件夹?如果所有文件都在同一个文件夹中,我建议先运行一次,以便根据标记正确分割序列。如果Dicom是匿名的,您可以使用标记:Series实例UID和研究ID。然后,您将为每个序列生成一个文件路径列表。要调整大小,如果重新保存为dicom文件,请不要忘记修改相应的dicom标记。例如行、列、像素间距,可能是图像位置,我认为cv2无法做到这一点。您可以始终使用您提到的“索引”,但这不是使用dicom时的“正确方式”。我们使用标签。@p.deman我不知道这一点。最终,将其保留为512X512格式并没有什么害处,但对我来说,这似乎相当大,例如,一名患者的大小可能为512 x 512 x 135(即,3d图像的135个切片)。对我来说,这对于训练神经网络来说似乎是相当大的。很好的发现。这正是我的两个问题。我现在就试试这段代码,看看能不能让它正常工作。谢谢,谢谢你的回答。我有一个关于你的代码的问题。在函数
def read(path):
中,具体用途是什么?对于大列表中的路径,对于路径中的路径]对于大列表中的路径,
这段代码的[[resize(read(path))对于路径中的路径]对于大列表中的路径]
是否没有访问所需的元素?如果您正确理解任务,您就有一个fielnames列表,它是类似于“~/images/0001.dcm”的字符串。您必须将fiel inself读入像素数组,这就是read()
函数的目的。如上所述,您应该能够首先为一个fielname获得所需的结果,例如resize(read(“~/images/0001.dcm”)
,检查它是否按预期工作,甚至可以使用一些assert
语句,然后转向如何使此工作操作在列表(或列表列表)中的所有路径上工作的任务。对不起,听起来很抱歉,谢谢。这很有道理。不幸的是,我在尝试缩小这些图像的大小时仍然收到错误。属性或类型错误取决于我尝试调整大小的方式。我不熟悉.dcm,但它的行为似乎与标准.jpeg有所不同