问题描述
我需要编辑保存为 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 不同? 我试图解决这个问题的方法:
- 使用 cv2
- Open PIL image from byte file
- 更改 img.tobytes() 中的参数
有关 .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 标签,至少 BitsAllocated
和 BitsStored
,在这种情况下,它们都必须设置为 8:
ds.BitsAllocated = 8
ds.BitsStored = 8
您可能还需要调整其他标签,具体取决于您的数据和用例。如果您有压缩图像(在您的示例中似乎不是这种情况),您必须自己压缩数据(这很容易出错,所以我不会这样做),或者更改 DICOM 图像中的编码。>
如果你想将数据存储回 PACS,你必须做更多的事情来避免写入非法的 DICOM,例如生成一个新的 SOP 实例 UID,可能将 SOP 类更改为二级捕获,更改图像类型和一些其他标签 - 这在 SO 的其他问题中处理,所以我不会在这里讨论。