我正在使用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:
答案 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切片-这样可以提供更多/更好的建议。