Управление и преобразование 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);
Другие вопросы по тегам