Управление и преобразование PixelData изображения CT с помощью fo-dicom в C#
Для некоторых тестов я пытаюсь манипулировать PixelData
элемент изображения CT сохраняется в формате dicom и записывается обратно в файл с Fellow Oak Dicom в C#. После некоторого исследования я обнаружил, что матрица, с которой я хочу иметь дело, находится в 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");
Это была моя первая попытка, и я получил Exception
на AddOrUpdate
команда, потому что не удалось преобразовать byte
- массив для OB. Например, читая книгу Пианых о DICOM, OB означает Other Byte String. Но до сих пор я не могу конвертировать манипулировать byte
- массив для OB. Когда я попробовал этот фрагмент кода:
DicomOtherByte dob = new DicomOtherByte(DicomTag.PixelData, pixDat);
ctFile.Dataset.AddOrUpdate<DicomOtherByte>(DicomTag.PixelData, dob);
Exception
все еще зовет AddOrUpdate
за невозможность конвертировать предмет в OB. Ища здесь в stackru, документации fo-dicom в git или в google, я до сих пор не понял, как с этим бороться. Поэтому мне интересно, как преобразовать мою управляемую матрицу в OB, потому что я подумал DicomOtherByte
это OB.
РЕДАКТИРОВАТЬ: Exception
"Невозможно создать элемент DICOM типа OB со значениями типа Dicom.DicomOtherByte" - System.InvalidOperationException
Заранее спасибо.
1 ответ
Пиксельные данные в наборе данных 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);