0

我正在使用 SimpleITK 读取 DICOM,并将特定切片保存为 PNG 文件。我可以将一个新的 DICOM 文件写回磁盘,它看起来和预期的一样。但是每当我尝试以任何其他格式保存它时,它都会被严重损坏。我的意思是它看起来不像输入,它完全是乱码。

这是代码:

        var imageReader = new ImageFileReader();
        imageReader.SetOutputPixelType(PixelIDValueEnum.sitkUInt8);
        var dicomFileNames = ImageSeriesReader.GetGDCMSeriesFileNames(@"D:\Study");
        imageReader.SetFileName(dicomFileNames[255]);
        var image = imageReader.Execute();
        var fileWriter = new ImageFileWriter();
        fileWriter.SetFileName("slice.png");
        fileWriter.Execute(image);

获取图像的缓冲区并使用它来创建 BitMap 会遇到同样的问题。读取 DICOM 系列(我的最终目标)而不是一个文件,并使用 3D 体积并以这种方式提取切片也有同样的问题。

我错过了什么?

编辑:虽然对比度关闭并且丢失了一些细节,但使用PixelIDValueEnum.sitkUInt16大大提高了 的输出。ImageFileWriter我仍然无法将缓冲区转换为位图并将其另存为 PNG,此代码仍会创建损坏的数据:

        var size = image.GetSize();
        var length = (int)(size[0] * size[1]) * 2;
        var buffer = image.GetBufferAsUInt16();

        var rgbValues = new byte[length];

        Marshal.Copy(buffer, rgbValues, 0, length);

        var newBitmap = new Bitmap((int)image.GetWidth(), (int)image.GetHeight(), (int)image.GetWidth(), PixelFormat.Format16bppArgb1555, buffer);
        newBitmap.Save(@"C:\test.png", ImageFormat.Png);

我尝试了每个PixelFormat.16bpp*值都没有成功,一些数据肯定丢失了,因为 ImageFileWriter 的输出比我保存位图时大 50% 以上。

这是坏位图:

在此处输入图像描述

4

1 回答 1

1

大多数医学图像都是 16 位深(shortunsigned short),而不是 8 位(sitkUInt8)。尝试其他一些像素格式。如果这没有帮助,请附加一个提取的 PNG 切片 - 这将提供更多/更好的建议。

于 2019-07-01T13:13:41.693 回答