python - 如何在python中将图像写为dicom?
问题描述
我正在尝试从 python 中保存一组 dicom 格式的图像。我只会提取 PixelData 字段,因此我尝试使用最少的代码/标签来完成它。我正在使用 pydicom 读取文件:
ds = dicom.read_file(currentDir + file)
Image = ds.pixel_array
不幸的是,似乎没有函数 dicom.write_file(filename,header=MakeOneUp)。您能否建议将 numpy 数组写为 dicom 图像的最简单方法,而不依赖于读取 dicom/复制标题。我正在尝试使用此示例进行操作:
from dicom.dataset import Dataset, FileDataset
file_meta = Dataset()
file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.2'
file_meta.MediaStorageSOPInstanceUID = "1.2.3"
file_meta.ImplementationClassUID = "1.2.3.4"
ds = FileDataset(FullPath, {}, file_meta=file_meta, preamble=b"\0" * 128)
ds.PatientName = "Test^Name"
ds.PatientID = "00-000-000"
# Set the transfer syntax
ds.is_little_endian = True
ds.is_implicit_VR = True
# Set creation date/time
dt = datetime.datetime.now()
ds.ContentDate = dt.strftime('%Y%m%d')
timeStr = dt.strftime('%H%M%S.%f') # long format with micro seconds
ds.ContentTime = timeStr
但是,当我看到图像时,它崩溃了:
ds.PixelData = Image[:,:,l]
# Alternatively
# ds.pixel_array = np.ascontiguousarray(Image[:,:,l]), but this isn't a standard field?
ds.save_as(FullPath)
这失败并出现错误:如果我尝试这样做
np.ascontiguousarray(Image[:,:,l])
这不会将 dicom.read_file 作为人类可读的数组返回。
谢谢
PS:被要求提供错误回溯。
ds.PixelData = np.ascontiguousarray(Image[:,:,l])
ds.save_as(FullPath)
结果是:
Traceback (most recent call last):
File "/home/m047659/Programs/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-2-078b166fa765>", line 1, in <module>
ds.save_as(FullPath)
File "/home/m047659/Programs/anaconda3/lib/python3.6/site-packages/dicom/dataset.py", line 491, in save_as
dicom.write_file(filename, self, write_like_original)
File "/home/m047659/Programs/anaconda3/lib/python3.6/site-packages/dicom/filewriter.py", line 356, in write_file
write_dataset(fp, dataset)
File "/home/m047659/Programs/anaconda3/lib/python3.6/site-packages/dicom/filewriter.py", line 200, in write_dataset
write_data_element(fp, dataset[tag], dataset_encoding)
File "/home/m047659/Programs/anaconda3/lib/python3.6/contextlib.py", line 99, in __exit__
self.gen.throw(type, value, traceback)
File "/home/m047659/Programs/anaconda3/lib/python3.6/site-packages/dicom/tagtools.py", line 21, in tag_in_exception
raise type(e)(err)
ValueError: Invalid tag (7fe0, 0010): ndarray is not C-contiguous
解决方案
您需要为 PixelData 分配图像的字节字符串表示形式。Image 是一个 numpy 数组,需要转换为字节字符串。
ds.PixelData = Image.tobytes()
您还需要设置其他与图像相关的属性,例如行、列、PixelRepresentation 等,以便正确填充 pixel_array。见http://dicom.nema.org/medical/dicom/2014c/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.3。
推荐阅读
- vue.js - Vue 2 的 __vue__ 的 Vue 3 等价物是什么?
- reactjs - 创建 React App 构建无法正常工作
- java - Java vs PHP - 方法参数中的引用
- wordpress - 在 allTribeEvents(事件日历)中显示 ACF 查询
- python - 如何使用线性回归模型生成单个预测值?
- vue.js - 在 vue.js 的 UL 中渲染 LI。有隐形标签吗?
- javascript - 在 Svelte onMount 回调中使用流星数据订阅错误
- java - Java regex 不会查找第一个以外的单词
- c# - .Net Core 3.1 HttpClient Headers.TryAddWithoutValidation 不工作
- eclipse - 有没有办法在 Eclipse 中删除 Maven 启动配置?