繁体   English   中英

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

[英]How to replace an image in DICOM in 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)

在这里我收到一个错误:

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

所以我补充说:

imgAsByte+= img.tobytes()

结果是:

在此处输入图像描述

.dcm 中的图像被复制了四次,不是黑白的。 为什么我保存为 dicom 的图像与 from.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 Instance UID,可能将 SOP Class 更改为 Secondary Capture,更改 Image Type 和其他一些标签 -这是在 SO 的其他问题中处理的,所以我不会在这里 go 进入它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM