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

时间:2018-09-12 09:51:21

标签: c# type-conversion dicom fo-dicom

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

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,因为它无法将AddOrUpdate数组转换为OB。 阅读例如Pianykh关于DICOM的书,OB表示 Other Byte String 。但是到目前为止,我仍无法将操纵的byte数组转换为OB。当我尝试以下代码片段时:

byte

DicomOtherByte dob = new DicomOtherByte(DicomTag.PixelData, pixDat); ctFile.Dataset.AddOrUpdate<DicomOtherByte>(DicomTag.PixelData, dob); 仍在呼叫Exception,因为无法将项目转换为OB。在这里在stackoverflow上搜索,或者在git或google中使用fo-dicom文档,我仍然不知道如何处理它。因此,我想知道如何将操纵矩阵转换为OB,因为我认为AddOrUpdate是OB。

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

谢谢。

1 个答案:

答案 0 :(得分:4)

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

这里是一个例子:

async samplePermissionRequest = () => {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
          'title': 'Cool Location tracking App Permission',
          'message': 'This Cool App needs access to your location '
        }
      )
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        this.justStart();
        alert("You can use the app");
      } else {
        alert("You can not use the app");
      }
    } catch (err) {
      console.warn(err);
    }
  }

请注意,还有更多的帮助程序类可以直接以特定格式(例如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