在C#中使用fo-dicom处理和转换CT图像的PixelData

Boo*_*oma 3 c# type-conversion dicom fo-dicom

对于某些测试,我试图操纵PixelData以dicom格式存储的CT图像元素,然后使用C#中的Fellow Oak Dicom将其写回到文件中。经过一番研究,我发现,我要处理的基体是在BufferPixelData存储在byte-array。所以我写了下面的代码:

DicomFile ctFile = DicomFile.Open(image);
var pixDat = ctFile.Dataset.Get<byte[]>(DicomTag.PixelData);

for (int i = 0; i < pixData.Length; i++)
{
    pixDat[i] = Convert.ToByte(200);
}

ctFile.Dataset.AddOrUpdate<byte[]>(DicomTag.PixelData, pixDat);
ctFile.Save("new file folder");
Run Code Online (Sandbox Code Playgroud)

这是我的第一次尝试,并且ExceptionAddOrUpdate命令处输入了一个,因为它无法将byte-array 转换为OB。读例如Pianykh关于DICOM的书,OB表示Other Byte String。但是到目前为止,我还无法将操纵的byte数组转换为OB。当我尝试以下代码片段时:

DicomOtherByte dob = new DicomOtherByte(DicomTag.PixelData, pixDat);
ctFile.Dataset.AddOrUpdate<DicomOtherByte>(DicomTag.PixelData, dob);
Run Code Online (Sandbox Code Playgroud)

Exception仍然在呼吁AddOrUpdate为是无法将项目转化为OB。在这里在stackoverflow上搜索,在git或google中的fo-dicom文档我仍然不知道如何处理它的线索。所以我想知道如何将操纵矩阵转换为OB,因为我认为DicomOtherByte是OB。

编辑:Exception是“无法创建类型为Dicom.DicomOtherByte类型的值的OB类型的DICOM元素”-System.InvalidOperationException

提前致谢。

Nin*_*rry 6

Dicom数据集中的像素数据非常特殊。它不能轻易地作为单个标签读取或写入。Fo-Dicom具有用于处理像素数据的特殊功能和类。

这是一个例子:

DicomFile ctFile = DicomFile.Open(@"C:\Temp\original.dcm");

// Create PixelData object to represent pixel data in dataset
DicomPixelData pixelData = DicomPixelData.Create(ctFile.Dataset);
// Get Raw Data
byte[] originalRawBytes = pixelData.GetFrame(0).Data;

// Create new array with modified data
byte[] modifiedRawBytes = new byte[originalRawBytes.Length];
for (int i = 0; i < originalRawBytes.Length; i++)
{
    modifiedRawBytes[i] = (byte)(originalRawBytes[i] + 100);
}

// Create new buffer supporting IByteBuffer to contain the modified data
MemoryByteBuffer modified = new MemoryByteBuffer(modifiedRawBytes);

// Write back modified pixel data
ctFile.Dataset.AddOrUpdatePixelData(DicomVR.OB, modified);

ctFile.Save(@"C:\Temp\Modified.dcm");
Run Code Online (Sandbox Code Playgroud)

请注意,还有更多的帮助程序类可以直接以诸如PixelDataConverter和的特定格式处理像素数据PixelDataFactory

另外,如果要使用实际图像,请使用DicomImage该类。

DicomImage image = new DicomImage(ctFile.Dataset);
Run Code Online (Sandbox Code Playgroud)