如何在python中替换DICOM中的图像?

2024-10-06 11:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要编辑保存为dicom的医学图像。我的目标是编辑、进行阈值选择并将新图像保存为黑白

ds = pydicom.dcmread(filename)
png = Image.fromarray(ds.pixel_array)

我可以通过ImageMagic编辑并保存图像。接下来,我必须将包含图像的ds.PixelData替换为字节。这就是我为什么这么做的原因:

imgAsBytes = png.tobytes()
ds.PixelData = imgAsBytes
plt.imshow(ds.pixel_array , cmap=plt.cm.bone)

这里我收到一个错误:

The length of the pixel data in the dataset (237568 bytes) doesn't match the expected length (475136 bytes). The dataset may be corrupted or there may be an issue with the pixel data handler.

所以我补充说:

imgAsByte+= img.tobytes()

结果是:

enter image description here

.dcm中的图像复制了四次,并且不是黑白的。为什么保存为dicom的图像与.png不同? 我试图解决的问题是:

有关.dcm中原始图像的信息:

  • len(ds.PixelData)=475136
  • len(ds.pixel_数组[0])=464
  • len(ds.pixel_数组)=512

保存为.dcm之前,有关.png中图像的信息:

  • img.size=(464512)
  • img.mode=L
  • len(imgAsByte)*2=475136#在多片2之后,我的长度与原始图像中的长度相同

Tags: the图像编辑imglenpngdsplt
1条回答
网友
1楼 · 发布于 2024-10-06 11:21:36

大多数灰度DICOM图像(如MR和CT图像)每像素使用2字节(这可以在BitsAllocated标记中看到,通常为16字节)。您的图像处理似乎为这些图像创建了每像素1个字节-因此您必须调整相应的DICOM标记,至少BitsAllocatedBitsStored,在这种情况下,这两个标记都必须设置为8:

ds.BitsAllocated = 8
ds.BitsStored = 8

根据您的数据和用例,您可能还需要调整其他标记。如果您有压缩图像(在您的示例中似乎不是这种情况),您必须自己压缩数据(这很容易出错,所以我不会这样做),或者更改DICOM图像中的编码

如果您想将数据存储回PACS,您必须做更多的工作来避免写入非法的DICOM,例如生成一个新的SOP实例UID,可能将SOP类更改为二次捕获,更改图像类型和一些其他标记-这在其他问题中处理,所以我在这里不进行讨论

相关问题 更多 >