Библиотека GDCM не может прочитать файл dicom в C#

Я попытался прочитать файл DICOM, используя библиотеку GDCM, используя этот код:

gdcm.ImageReader imagereader = new gdcm.ImageReader();
imagereader.SetFileName(@"E:\sample_success.dcm");
if (!imagereader.Read()) throw new Exception("Cannot read dicom file!");

Для файла "sample_success.dcm" я могу прочитать файл очень хорошо ( sample_success.png). Но используя файл "sample_failed.dcm", GDCM выдает исключение, потому что не может его прочитать. Я попытался открыть файл с помощью другой программы просмотра DICOM, такой как Radiant, и это сработало. Что-то не так с моей сборкой GDCM? Почему он не может прочитать это?

Я использую GDCM 2.6.5. Пожалуйста, найдите оба образца здесь.

1 ответ

Решение

Ваш файл содержит мусор (куча двоичных 0) после смещения 0x1480aa (где-то в атрибуте Pixel Data). Что вы ожидали от инструментария, если не сообщаете об ошибке должным образом?

По замыслу GDCM будет загружать все, что может, до появления ошибки. Так что если вы удалите new Exception в вашем коде, вы можете решить (например) передать imagereader.GetFile() к gdcm::Writer и переписать файл как чистый DICOM.

Как примечание стороны, у меня нет доступа к Radiant Программное обеспечение, но я нахожу это очень странным, что это не указывает на ошибку в этом случае.

Я проверил с DCMTK и dicom3tools, они все сообщают о проблеме разбора.

Используя инструмент командной строки gdcm, вы можете почти полностью переписать файл, используя:

$ gdcmconv -I sample_failed.dcm sample_failed_correct.dcm

Поскольку ваш входной набор данных недействителен, GDCM (ложно) полагает, что видит атрибут, вы можете удалить его, используя:

$ gdcmanon --dumb --remove 0,0 sample_failed_correct.dcm sample_failed_correct_clean.dcm

А потом:

$ gdcminfo sample_failed_correct.dcm 
MediaStorage is 1.2.840.10008.5.1.4.1.1.3.1 [Ultrasound Multi-frame Image Storage]
TransferSyntax is 1.2.840.10008.1.2.4.50 [JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression]
NumberOfDimensions: 3
Dimensions: (800,600,21)
SamplesPerPixel    :3
BitsAllocated      :8
BitsStored         :8
HighBit            :7
PixelRepresentation:0
ScalarType found   :UINT8
PhotometricInterpretation: YBR_FULL_422
PlanarConfiguration: 0
TransferSyntax: 1.2.840.10008.1.2.4.50
Origin: (0,0,0)
Spacing: (0.0106324,0.0106324,1)
DirectionCosines: (1,0,0,0,1,0)
Rescale Intercept/Slope: (0,1)
Orientation Label: AXIAL

Который действителен с количеством фрагментов в пиксельных данных:

$ gdcmdump sample_failed_correct.dcm | grep Item | grep "ff.d8" | wc
     21     126    2856
Другие вопросы по тегам