另存为PNG时,DICOM切片损坏

时间:2019-07-01 03:05:35

标签: c# itk simpleitk

我正在使用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的输出,尽管对比度已经关闭并且丢失了一些细节。我仍然无法将缓冲区转换为BitMap并将其另存为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%以上。

这是不好的BitMap:

Documentation

1 个答案:

答案 0 :(得分:1)

大多数医学图像的深度为16位(using System; using System.Diagnostics; using System.Collections; using System.Collections.Generic; using static System.Console; using System.Threading; namespace ConProc { class Program { private static string choice; static void useSwitch() { WriteLine("\n" + "use kill, restart, exit."); choice = Convert.ToString(Console.ReadLine()); switch (choice) { case "kill": WriteLine("Enter a process ID: "); Operational(); break; case "restart": UpdateProc(); break; case "exit": Environment.Exit(0); break; } } static void Operational() { int tempId; tempId = Convert.ToInt32(Console.ReadLine()) + 1; Process proc2 = Process.GetProcessById(tempId); WriteLine("Process was killed."); Thread.Sleep(200); proc2.Kill(); } static void UpdateProc() { foreach (Process proc in Process.GetProcesses()) { Console.WriteLine("|| " + proc.ProcessName + " || ID: " + proc.Id); Console.WriteLine("---------------------------------------------"); } } static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.DarkGreen; List<int> procIdarr = new List<int>(); UpdateProc(); while (true) { useSwitch(); } } } } short),而不是8位(unsigned short)。尝试其他几种像素格式。如果这样做没有帮助,请附加提取的PNG切片-这样可以提供更多/更好的建议。