3

对于一些测试,我正在尝试操作PixelData以 dicom 格式存储的 CT 图像的元素,并将其写回到C# 中的Fellow Oak Dicom文件中。经过一番研究,我发现我要处理的矩阵是Buffer存储PixelData在一个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");

这是我的第一次尝试,我得到了一个ExceptionatAddOrUpdate命令,因为它无法将byte-array 转换为 OB。阅读例如 Pianykh 的关于 DICOM 的书,OB 表示Other Byte String。但到目前为止,我无法将操纵的byte-array 转换为 OB。当我尝试此代码段时:

DicomOtherByte dob = new DicomOtherByte(DicomTag.PixelData, pixDat);
ctFile.Dataset.AddOrUpdate<DicomOtherByte>(DicomTag.PixelData, dob);

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

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

提前致谢。

4

1 回答 1

8

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");

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

此外,如果您想使用实际图像,请使用DicomImage该类。

DicomImage image = new DicomImage(ctFile.Dataset);
于 2018-09-12T14:08:16.937 回答