对于一些测试,我试图操纵PixelData
以 dicom 格式存储的 CT 图像的元素,并将其写回到文件中橡树迪康研究员在 C# 中。经过一番研究,我发现我想要处理的矩阵位于Buffer
of PixelData
存储在一个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");
这是我的第一次尝试,我得到了Exception
at the AddOrUpdate
命令,因为它无法转换byte
-数组到 OB。
阅读例如Pianykh 的关于 DICOM 的书,OB 的意思其他字节串。但到目前为止我无法转换被操纵的byte
-数组到 OB。当我尝试这个代码片段时:
DicomOtherByte dob = new DicomOtherByte(DicomTag.PixelData, pixDat);
ctFile.Dataset.AddOrUpdate<DicomOtherByte>(DicomTag.PixelData, dob);
the Exception
仍然在召唤AddOrUpdate
因为无法将项目转换为 OB。在 stackoverflow、git 中的 fo-dicom 文档或使用 google 进行搜索时,我仍然不知道如何处理它。所以我想知道如何将我的操纵矩阵转换为 OB,因为我想DicomOtherByte
is 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");
请注意,还有更多帮助器类可以直接以特定格式处理像素数据,例如PixelDataConverter
and PixelDataFactory
.
另外,如果您想使用实际图像,请使用DicomImage
class.
DicomImage image = new DicomImage(ctFile.Dataset);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)