Файлы DICOM в DICOMDIR для записи компакт-дисков ⇐ C++
-
Anonymous
Файлы DICOM в DICOMDIR для записи компакт-дисков
Я хочу создать файл DICOMDIR, соответствующий профилям приложений для хранения мультимедиа DICOM Part 11, в соответствии с приведенной здесь таблицей: чтобы я мог записать группу файлов DICOM на компакт-диск в читаемом формате.
По сути, я хочу соответствовать стандартам DICOM и записать на компакт-диск несколько файлов DICOM.
(Перейдите к пункту 3, если недостаточно времени или терпения для чтения)
[*]Я попробовал библиотеку dcm4che и смог очень легко сгенерировать файл DICOMDIR, но он был неполным и не содержал достаточно информации для соответствия таблице, указанной выше.
Вывод здесь:
Метаинформация файла: (0002,0001) OB [0\1] FileMetaInformationVersion (0002,0002) UI [1.2.840.10008.1.3.10] MediaStorageSOPClassUID (0002,0003) UI [2.25.237654598197464422367806677484373603215] MediaStorageSOPI (0002,0010) UI [1.2.840.10008.1.2.1] TransferSyntaxUID (0002,0012) UI [1.2.40.0.13.1.3] ImplementationClassUID (0002,0013) SH [dcm4che-5.31.0] ИмяВерсии Реализации Информация о наборе файлов: (0004,1130) CS [] FileSetID (0004,1200) UL [0] OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity (0004,1202) UL [0] OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity (0004,1212) США [0] FileSetConsistencyFlag ============================================ =============================================== ==============================
[*]Я также попробовал библиотеку Linux gdcmdump, но она дала мне только дамп, а не DICOMDIR, независимо от команды: gdcmdump --выходной-каталог . --output-dicomdir
(Пример) дампа:
# Используемый TransferSyntax: (0002,0000) UL 240 # 4,1 Длина группы метаинформации файла (0002,0001) OB 00\01 # 2,1 Версия метаинформации файла (0002,0002) UI [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса SOP хранилища носителей (0002,0003) UI [1.2.826.0.1.3680043.10.940.5328757926486257676537973510518955349] # 64,1 UID экземпляра SOP хранилища мультимедиа (0002,0010) UI [1.2.840.10008.1.2] # 18,1 Передача синтаксиса UID (0002,0012) UI [1.2.826.0.1.3680043.10.940.7793821961413241559492252192301648016] # 64,1 UID класса реализации (0002,0013) SH [PYDICOM 2.2.0] # 14,1 Имя версии реализации # Набор данных Dicom # Используемый синтаксис TransferSyntax: 1.2.840.10008.1.2 (0008,0008) ?? (CS) (нет значения) # 0,2-n Тип изображения (0008,0016) ?? (UI) [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса СОП (0008,0018) ?? (UI) [1.2.826.0.1.3680043.10.940.5328757926486257676537973510518955349] # 64,1 UID экземпляра SOP (0008,0020) ?? (DA) [2022-06-01] # 10,1 Дата исследования (0008,0021) ?? (DA) [20220601] #8,1 Дата серии (0008,0022) ?? (DA) [20220601]#8,1 Дата приобретения (0008,0023) ?? (DA) [20220601] # 8,1 Дата содержания (0008,0030) ?? (TM) [17:21:20.384] # 12,1 Время обучения (0008,0031) ?? (TM) [174403] #6,1 Серия Время (0008,0032) ?? (TM) [174403] #6,1 Время сбора данных (0008,0033) ?? (TM) [174403] # 6,1 Время контента (0008,0050) ?? (SH) (нет значения) # 0,1 Номер доступа (0008,0060) ?? (CS) [MR] # 2,1 Модальность (0008,0090) ?? (PN) [y ] # 2,1 Имя направляющего врача (0008,009c) ?? (PN) [y ]#2,1-n Имя врача-консультанта (0008,1010) ?? (SH) [VGS-01] # 6,1 Название станции (0008,1030) ?? (LO) (нет значения) # 0,1 Описание исследования (0008,103e) ?? (LO) [_Head First ] # 12,1 Описание серии (0008,1040) ?? (LO) [Отдел 1] # 12,1 Название институционального отдела (0008,1050) ?? (PN) [y ] # 2,1-n Имя врача-исполнителя (0008,1070) ?? (PN)[tyi]#4,1-n Имя оператора (0008,1090) ?? (LO) [model_1 ] # 8,1 Название модели производителя (0010,0010) ?? (PN) [PoojaK] # 6,1 Имя пациента (0010,0020) ?? (LO) [108 ] # 4,1 Идентификатор пациента (0010,0030) ?? (DA) [15 июля 1992] # 10,1 Дата рождения пациента (0010,0032) ?? (TM) (нет значения) # 0,1 Время рождения пациента (0010,0040) ?? (CS) [O ] # 2,1 Пол пациента (0010,0200) ?? (CS) [Нет] № 2,1 Субъект контроля качества (0010,1010) ?? (AS) [29] № 2,1 Возраст пациента (0010,1020) ?? (DS) (нет значения) # 0,1 Размер пациента (0010,1030) ?? (ДС) [76] # 2,1 Вес пациента (0018,0010) ?? (LO) (нет значения) # 0,1 Контраст/Болюсный агент (0018,0015) ?? (CS) [HEAD] # 4,1 Осмотр части тела (0 (0028,0101) ?? (США) 16 # 2,1 бит сохранено (0028,0102) ?? (США) 15 # 2,1 Старший бит (0028,0103) ?? (США) Представление пикселей 0 # 2,1 (0028,0106) ?? (США или SS => США) 0 # 2,1 Наименьшее значение пикселя изображения (0028,0107) ?? (США или SS => США) 16384 # 2,1 Наибольшее значение пикселя изображения (0028,0108) ?? (США или SS => США) 0 # 2,1 Наименьшее значение пикселя в серии (0028,0109) ?? (США или СС => США) 16384 # 2,1 Наибольшее значение пикселя в серии (0028,1050) ?? (DS) [8061]#4,1-н Центр окна (0028,1051) ?? (DS) [10092 ] # 6,1-n Ширина окна (0028,1052) ?? (DS) [0 ] # 2,1 Перехват масштабирования (0028,1053) ?? (DS) [1 ] # 2,1 Изменить масштаб наклона (0028,2110) ?? (CS) [00] # 2,1 Сжатие изображения с потерями (300а,012с) ?? (DS) (нет значения) # 0,3 Положение изоцентра (7fe0,0010) ?? (OB или OW => OW) 13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\ 00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\ 13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00 #524288,1 Пиксельные данные # Формат-файла Dicom # Заголовок-мета-информации Dicom # Используемый синтаксис переноса: (0002,0000) UL 240 # 4,1 Длина группы метаинформации файла (0002,0001) OB 00\01 # 2,1 Версия метаинформации файла (0002,0002) UI [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса SOP хранилища носителей (0002,0003) UI [1.2.826.0.1.3680043.10.940.6124846486233564953824351180022446594] # 64,1 UID экземпляра SOP хранилища носителей (0002,0010) UI [1.2.840.10008.1.2] # 18,1 Передача синтаксиса UID (0002,0012) UI [1.2.826.0.1.3680043.10.940.7793821961413241559492252192301648016] # 64,1 UID класса реализации (0002,0013) SH [PYDICOM 2.2.0] # 14,1 Имя версии реализации # Набор данных Dicom # Используемый синтаксис TransferSyntax: 1.2.840.10008.1.2 (0008,0008) ?? (CS) (нет значения) # 0,2-n Тип изображения (0008,0016) ?? (UI) [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса СОП (0008,0018) ?? (UI) [1.2.826.0.1.3680043.10.940.6124846486233564953824351180022446594] # 64,1 UID экземпляра SOP (0008,0020) ?? (DA) [2022-06-01] # 10,1 Дата исследования (0008,0021) ?? (DA) [20220601] #8,1 Дата серии (0008,0022) ?? (DA) [20220601]#8,1 Дата приобретения (0008,0023) ?? (DA) [20220601] # 8,1 Дата содержания (0008,0030) ?? (TM) [17:21:20.384] # 12,1 Время обучения (0008,0031) ?? (ТМ) [174406] ============================================ =============================================== ====================================== 3. Затем я перешел к библиотеке dcmmtk и ее dcmmkdir для ее создания. Результаты безупречны с помощью команды: dcmmkdir +e --recurse * однако он не принимает более 8 символов, включая путь к папке и имя файла. После некоторых исследований я узнал, что это связано с ограничениями старых CD/DVD и больше не требуется для оптических дисков на основе UDF.
Примеры журналов ошибок для всех файлов:
E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\4326688929300096838936144 628784162469.dcm E: недопустимый символ(ы) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\5328757926486257676537973510518955 349.dcm Э: ^ E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\532875792648625767653797351051 8955349.dcm E: недопустимый символ(ы) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\6124846486233564953824351180022446 594.dcm Э: ^ E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\612484648623356495382435118002 2446594.dcm E: недопустимый символ(ы) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\7652333561139847401343034531526053 249.дкм Э: ^ E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\765233356113984740134303453152 6053249.dcm E: нет хороших файлов: DICOMDIR не создан ============================================ =============================================== ==================================
Наконец, я нашел компромисс с помощью скрипта Python, который переименовывает все файлы и каталоги с помощью короткого случайного числа, чтобы этот скрипт работал успешно. Однако я действительно не хочу терять имена папок и файлов и поэтому прошу использовать альтернативные инструменты или решения.
Я также пытался собрать код DCMTK из исходного кода, но даже несмотря на то, что я собрал все как библиотеку для последующего включения в другой проект, я не смог изменить необходимое 8-символьное условие и создать новый exe. Любые рекомендации в этом аспекте также высоко ценятся.
Я хочу создать файл DICOMDIR, соответствующий профилям приложений для хранения мультимедиа DICOM Part 11, в соответствии с приведенной здесь таблицей: чтобы я мог записать группу файлов DICOM на компакт-диск в читаемом формате.
По сути, я хочу соответствовать стандартам DICOM и записать на компакт-диск несколько файлов DICOM.
(Перейдите к пункту 3, если недостаточно времени или терпения для чтения)
[*]Я попробовал библиотеку dcm4che и смог очень легко сгенерировать файл DICOMDIR, но он был неполным и не содержал достаточно информации для соответствия таблице, указанной выше.
Вывод здесь:
Метаинформация файла: (0002,0001) OB [0\1] FileMetaInformationVersion (0002,0002) UI [1.2.840.10008.1.3.10] MediaStorageSOPClassUID (0002,0003) UI [2.25.237654598197464422367806677484373603215] MediaStorageSOPI (0002,0010) UI [1.2.840.10008.1.2.1] TransferSyntaxUID (0002,0012) UI [1.2.40.0.13.1.3] ImplementationClassUID (0002,0013) SH [dcm4che-5.31.0] ИмяВерсии Реализации Информация о наборе файлов: (0004,1130) CS [] FileSetID (0004,1200) UL [0] OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity (0004,1202) UL [0] OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity (0004,1212) США [0] FileSetConsistencyFlag ============================================ =============================================== ==============================
[*]Я также попробовал библиотеку Linux gdcmdump, но она дала мне только дамп, а не DICOMDIR, независимо от команды: gdcmdump --выходной-каталог . --output-dicomdir
(Пример) дампа:
# Используемый TransferSyntax: (0002,0000) UL 240 # 4,1 Длина группы метаинформации файла (0002,0001) OB 00\01 # 2,1 Версия метаинформации файла (0002,0002) UI [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса SOP хранилища носителей (0002,0003) UI [1.2.826.0.1.3680043.10.940.5328757926486257676537973510518955349] # 64,1 UID экземпляра SOP хранилища мультимедиа (0002,0010) UI [1.2.840.10008.1.2] # 18,1 Передача синтаксиса UID (0002,0012) UI [1.2.826.0.1.3680043.10.940.7793821961413241559492252192301648016] # 64,1 UID класса реализации (0002,0013) SH [PYDICOM 2.2.0] # 14,1 Имя версии реализации # Набор данных Dicom # Используемый синтаксис TransferSyntax: 1.2.840.10008.1.2 (0008,0008) ?? (CS) (нет значения) # 0,2-n Тип изображения (0008,0016) ?? (UI) [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса СОП (0008,0018) ?? (UI) [1.2.826.0.1.3680043.10.940.5328757926486257676537973510518955349] # 64,1 UID экземпляра SOP (0008,0020) ?? (DA) [2022-06-01] # 10,1 Дата исследования (0008,0021) ?? (DA) [20220601] #8,1 Дата серии (0008,0022) ?? (DA) [20220601]#8,1 Дата приобретения (0008,0023) ?? (DA) [20220601] # 8,1 Дата содержания (0008,0030) ?? (TM) [17:21:20.384] # 12,1 Время обучения (0008,0031) ?? (TM) [174403] #6,1 Серия Время (0008,0032) ?? (TM) [174403] #6,1 Время сбора данных (0008,0033) ?? (TM) [174403] # 6,1 Время контента (0008,0050) ?? (SH) (нет значения) # 0,1 Номер доступа (0008,0060) ?? (CS) [MR] # 2,1 Модальность (0008,0090) ?? (PN) [y ] # 2,1 Имя направляющего врача (0008,009c) ?? (PN) [y ]#2,1-n Имя врача-консультанта (0008,1010) ?? (SH) [VGS-01] # 6,1 Название станции (0008,1030) ?? (LO) (нет значения) # 0,1 Описание исследования (0008,103e) ?? (LO) [_Head First ] # 12,1 Описание серии (0008,1040) ?? (LO) [Отдел 1] # 12,1 Название институционального отдела (0008,1050) ?? (PN) [y ] # 2,1-n Имя врача-исполнителя (0008,1070) ?? (PN)[tyi]#4,1-n Имя оператора (0008,1090) ?? (LO) [model_1 ] # 8,1 Название модели производителя (0010,0010) ?? (PN) [PoojaK] # 6,1 Имя пациента (0010,0020) ?? (LO) [108 ] # 4,1 Идентификатор пациента (0010,0030) ?? (DA) [15 июля 1992] # 10,1 Дата рождения пациента (0010,0032) ?? (TM) (нет значения) # 0,1 Время рождения пациента (0010,0040) ?? (CS) [O ] # 2,1 Пол пациента (0010,0200) ?? (CS) [Нет] № 2,1 Субъект контроля качества (0010,1010) ?? (AS) [29] № 2,1 Возраст пациента (0010,1020) ?? (DS) (нет значения) # 0,1 Размер пациента (0010,1030) ?? (ДС) [76] # 2,1 Вес пациента (0018,0010) ?? (LO) (нет значения) # 0,1 Контраст/Болюсный агент (0018,0015) ?? (CS) [HEAD] # 4,1 Осмотр части тела (0 (0028,0101) ?? (США) 16 # 2,1 бит сохранено (0028,0102) ?? (США) 15 # 2,1 Старший бит (0028,0103) ?? (США) Представление пикселей 0 # 2,1 (0028,0106) ?? (США или SS => США) 0 # 2,1 Наименьшее значение пикселя изображения (0028,0107) ?? (США или SS => США) 16384 # 2,1 Наибольшее значение пикселя изображения (0028,0108) ?? (США или SS => США) 0 # 2,1 Наименьшее значение пикселя в серии (0028,0109) ?? (США или СС => США) 16384 # 2,1 Наибольшее значение пикселя в серии (0028,1050) ?? (DS) [8061]#4,1-н Центр окна (0028,1051) ?? (DS) [10092 ] # 6,1-n Ширина окна (0028,1052) ?? (DS) [0 ] # 2,1 Перехват масштабирования (0028,1053) ?? (DS) [1 ] # 2,1 Изменить масштаб наклона (0028,2110) ?? (CS) [00] # 2,1 Сжатие изображения с потерями (300а,012с) ?? (DS) (нет значения) # 0,3 Положение изоцентра (7fe0,0010) ?? (OB или OW => OW) 13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\ 00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\ 13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00\13\00 #524288,1 Пиксельные данные # Формат-файла Dicom # Заголовок-мета-информации Dicom # Используемый синтаксис переноса: (0002,0000) UL 240 # 4,1 Длина группы метаинформации файла (0002,0001) OB 00\01 # 2,1 Версия метаинформации файла (0002,0002) UI [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса SOP хранилища носителей (0002,0003) UI [1.2.826.0.1.3680043.10.940.6124846486233564953824351180022446594] # 64,1 UID экземпляра SOP хранилища носителей (0002,0010) UI [1.2.840.10008.1.2] # 18,1 Передача синтаксиса UID (0002,0012) UI [1.2.826.0.1.3680043.10.940.7793821961413241559492252192301648016] # 64,1 UID класса реализации (0002,0013) SH [PYDICOM 2.2.0] # 14,1 Имя версии реализации # Набор данных Dicom # Используемый синтаксис TransferSyntax: 1.2.840.10008.1.2 (0008,0008) ?? (CS) (нет значения) # 0,2-n Тип изображения (0008,0016) ?? (UI) [1.2.840.10008.5.1.4.1.1.4] # 26,1 UID класса СОП (0008,0018) ?? (UI) [1.2.826.0.1.3680043.10.940.6124846486233564953824351180022446594] # 64,1 UID экземпляра SOP (0008,0020) ?? (DA) [2022-06-01] # 10,1 Дата исследования (0008,0021) ?? (DA) [20220601] #8,1 Дата серии (0008,0022) ?? (DA) [20220601]#8,1 Дата приобретения (0008,0023) ?? (DA) [20220601] # 8,1 Дата содержания (0008,0030) ?? (TM) [17:21:20.384] # 12,1 Время обучения (0008,0031) ?? (ТМ) [174406] ============================================ =============================================== ====================================== 3. Затем я перешел к библиотеке dcmmtk и ее dcmmkdir для ее создания. Результаты безупречны с помощью команды: dcmmkdir +e --recurse * однако он не принимает более 8 символов, включая путь к папке и имя файла. После некоторых исследований я узнал, что это связано с ограничениями старых CD/DVD и больше не требуется для оптических дисков на основе UDF.
Примеры журналов ошибок для всех файлов:
E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\4326688929300096838936144 628784162469.dcm E: недопустимый символ(ы) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\5328757926486257676537973510518955 349.dcm Э: ^ E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\532875792648625767653797351051 8955349.dcm E: недопустимый символ(ы) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\6124846486233564953824351180022446 594.dcm Э: ^ E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\612484648623356495382435118002 2446594.dcm E: недопустимый символ(ы) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\7652333561139847401343034531526053 249.дкм Э: ^ E: слишком большой компонент (максимум 8 символов) в имени файла: 1234567890123456789012345678901234567\8403235102833142464628749395321307121\765233356113984740134303453152 6053249.dcm E: нет хороших файлов: DICOMDIR не создан ============================================ =============================================== ==================================
Наконец, я нашел компромисс с помощью скрипта Python, который переименовывает все файлы и каталоги с помощью короткого случайного числа, чтобы этот скрипт работал успешно. Однако я действительно не хочу терять имена папок и файлов и поэтому прошу использовать альтернативные инструменты или решения.
Я также пытался собрать код DCMTK из исходного кода, но даже несмотря на то, что я собрал все как библиотеку для последующего включения в другой проект, я не смог изменить необходимое 8-символьное условие и создать новый exe. Любые рекомендации в этом аспекте также высоко ценятся.
Мобильная версия