对于某些测试,我试图操纵以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
谢谢。
答案 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