【问题标题】:How to replace an image in DICOM in python?如何在python中替换DICOM中的图像?
【发布时间】:2021-06-16 06:14:56
【问题描述】:

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

结果是:

.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 后,我的长度与原始图像相同

【问题讨论】:

    标签: python type-conversion png dicom


    【解决方案1】:

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

    ds.BitsAllocated = 8
    ds.BitsStored = 8
    

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

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

    【讨论】:

    • 谢谢。这个解决方案对我来说足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多