Управление и преобразование PixelData изображения CT с помощью fo-dicom в C # - PullRequest
0 голосов
/ 12 сентября 2018

В некоторых тестах я пытаюсь манипулировать элементом PixelData изображения КТ, хранящимся в формате dicom, и записывать его обратно в файл с помощью Fellow Oak Dicom в C #. После некоторых исследований я обнаружил, что матрица, с которой я хочу иметь дело, находится в Buffer из 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 по команде 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. Ища здесь в stackoverflow, документации fo-dicom в git или в google, я до сих пор не понял, как с этим бороться. Поэтому мне интересно, как преобразовать мою управляемую матрицу в OB, потому что я думал, что DicomOtherByte - это OB.

РЕДАКТИРОВАТЬ: Exception «Не удается создать элемент DICOM типа OB со значениями типа Dicom.DicomOtherByte» - System.InvalidOperationException

Заранее спасибо.

1 Ответ

0 голосов
/ 12 сентября 2018

Пиксельные данные в наборе данных 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);
...