如何使用 pyDicom 替换同一 DICOM 文件中的像素数据以使用任何 DICOM 查看器再次读取它?

How to replace pixel data in same DICOM file using pyDicom to read it again with any DICOM viewer?

我想阅读一些 DICOM 文件,所以我正在测试 pydicom 我的工作,我认为这非常有用。

现在我想加载现有的 DICOM 文件,用另一个像素阵列替换像素数据阵列(例如预处理或字面上另一个 DICOM 像素阵列),最重要的是,我想用任何 DICOM 查看器再次阅读它申请。

对于这个测试,我使用了下面的教程代码。此代码加载测试数据文件。图片大小为64*64。下面的代码从原始数据中进行子采样。之后图片大小为8*8,结果保存到after.dcm.

但是当我使用 DICOM 查看器应用程序读取文件时(我使用 'Dicompass'),DICOM 图像的大小仍然是 64*64。我错过了什么?

我参考了 pydicom 文档 (http://pydicom.readthedocs.io/en/stable/getting_started.html, https://pydicom.github.io/pydicom/stable/index.html) 来解决我的问题。

# authors : Guillaume Lemaitre <g.lemaitre58@gmail.com>
# license : MIT

import pydicom
from pydicom.data import get_testdata_files

print(__doc__)

# FIXME: add a full-sized MR image in the testing data
filename = get_testdata_files('MR_small.dcm')[0]
ds = pydicom.dcmread(filename)

# get the pixel information into a numpy array
data = ds.pixel_array
print(data)

print('The image has {} x {} voxels'.format(data.shape[0],
                                        data.shape[1]))
data_downsampling = data[::8, ::8]
print('The downsampled image has {} x {} voxels'.format(
    data_downsampling.shape[0], data_downsampling.shape[1]))

# copy the data back to the original data set
ds.PixelData = data_downsampling.tostring()
# update the information regarding the shape of the data array
ds.Rows, ds.Columns = data_downsampling.shape

# print the image information given in the dataset
print('The information of the data set after downsampling: \n')
print(ds)
print(ds.pixel_array)
print(len(ds.PixelData))
ds.save_as("after.dcm")

代码看起来不错。但是,您并没有覆盖原始文件。

您加载文件:

filename = get_testdata_files('MR_small.dcm')[0]
ds = pydicom.dcmread(filename)

原始文件名是 "MR_small.dcm".

然后你保存文件:

ds.save_as("after.dcm")

目标文件名不同。也就是说,原始文件仍然没有改变。

您应该在 DICOM 查看器中加载 "after.dcm" 进行测试

您应该在保存文件时覆盖文件 (pydicom.filewriter.dcmwrite)。


不是你的问题的一部分,但如果你正在创建原始图像的副本并改变像素数据,建议你也修改数据集中的实例特定信息,如 InstanceNumber (0020,0013)、SOPInstanceUID (0008) ,0018) 等等