c# - 在 C# 中使用 fo-dicom 操作和转换 CT 图像的像素数据

标签 c# type-conversion dicom fo-dicom

对于某些测试,我尝试操作以 dicom 格式存储的 CT 图像的 PixelData 元素,并使用 C# 中的 Fellow Oak Dicom 将其写回文件中.经过一些研究,我发现我要处理的矩阵位于 PixelDataBuffer 中,存储在 byte 数组中。所以我写了下面的代码:

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

这是我的第一次尝试,我在 AddOrUpdate 命令中遇到了一个 Exception,因为它无法将 byte 数组转换为 OB . 阅读例如Pianykh 关于 DICOM 的书,OB 的意思是 Other Byte String。但到目前为止,我无法将操作的 byte 数组转换为 OB。当我尝试这段代码片段时:

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

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

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

提前致谢。

最佳答案

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

请注意,有更多的辅助类可以直接以特定格式处理像素数据,例如 PixelDataConverterPixelDataFactory

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

DicomImage image = new DicomImage(ctFile.Dataset);

关于c# - 在 C# 中使用 fo-dicom 操作和转换 CT 图像的像素数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52292288/

相关文章:

c# - 如何维护 Devexpress 虚拟 TreeView 中项目的检查状态?

Python字节数组到位数组

java - 如何用 Java 读取 DICOM 文件的内容?

c# - 带有 Fellow-oak DICOM 的 Xamarin 不会在 bin 文件夹中创建 DicomNative.dll

dicom - DICOM 实例数的增长方向是什么?

c# - 如何在 NHibernate 中自动生成 ID

c# - 如何在 XAML WPF 中创建强制依赖属性

c# - 跟踪最近崩溃的应用程序

sql - 将时间戳字段的分钟和秒组件设置为 0

c++ - SQL numeric(18,0) 数据类型对应的 C++ 数据类型是什么?