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

问题描述

我需要编辑保存为 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)

这里我收到一个错误

数据集中像素数据的长度(237568 字节)与预期长度(475136 字节)不匹配。数据集可能已损坏,或者像素数据处理程序可能存在问题。

所以我补充说:

imgAsByte+= img.tobytes()

结果是:

enter image description here

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

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

  • len(ds.PixelData) = 475136
  • len(ds.pixel_array[0]) = 464
  • len(ds.pixel_array) = 512

保存为 .dcm 之前的 .png 图像信息:

  • img.size = (464,512)
  • img.mode = L
  • len(imgAsByte) * 2 = 475136 # 乘以 2 后的长度与原始图像相同

解决方法

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

ds.BitsAllocated = 8
ds.BitsStored = 8

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...