Поле DICOM имеет большее значение, чем ожидалось

Я использую библиотеку DCMTK (3.6.0), чтобы получить значение тега (0020,0013), который представляет собой номер изображения, также известный как номер фрагмента серии.

Я использую следующее в пакетном сценарии

for /f "tokens=2 delims=[]"  %%a in ('@echo. ^|c:\Libs\dcmtk-3.6.0\bin\dcmdump +P "0020,0013" %%i') do (set img_no=%%a)

Обычно все идет хорошо, но иногда это значение всегда устанавливается равным «0» для всей серии.

Я попытался сбросить это с помощью этой команды

C:\Libs\dcmtk-3.6.0\bin>dcmdump +P "0020,0013" PathToInvalideDICOM\img.dcm
(0020,0013) IS [0]                                      #   2, 1 InstanceNumber
(0020,0013) IS [4]                                      #   2, 1 InstanceNumber
(0020,0013) IS [0]                                      #   2, 1 InstanceNumber

C:\Libs\dcmtk-3.6.0\bin>dcmdump +P "0020,0013" PathToCorrectDICOM\img.dcm
(0020,0013) IS [0]                                      #   2, 1 InstanceNumber
(0020,0013) IS [5]                                      #   2, 1 InstanceNumber

Как мы видим, иногда значение, которое нужно получить (которое не является «0»), является последним. В этом случае все хорошо. Но в некоторых частных случаях правильное значение сохраняется между двумя «0».

Я также пробовал использовать другой дампер (DCM4CHE 2.0.23), и он дал мне тот же результат.

Я хочу знать, почему это происходит. И более того, как получить правильное значение?

Есть ли способ в пакетном файле исключить 0 до правильного числа?

По умолчанию моя командная строка, приведенная выше, занимает последнее поле... Я думаю.


person Atnaize    schedule 13.10.2015    source источник


Ответы (2)


Скорее всего, дополнительные теги InstanceNumber являются частью последовательности dicom и могут быть не теми, которые вам нужны.

Если вы запустите dcmdump следующим образом:

dcmdump +p +P "0020,0013" PathToInvalideDICOM\img.dcm

Вы должны получить полностью ограниченный вывод, например:

(0008,1111).(0020,0013) IS [0]                                      #   2, 1 InstanceNumber
(0020,0013) IS [1]                                      #   2, 1 InstanceNumber
(5200,9230).(2005,140f).(0020,0013) IS [1]                                      #   2, 1 InstanceNumber

Тогда нужно просто проверить, какой InstanceNumber вам действительно нужен (возможно, глобальный)

В пакетном файле вы, вероятно, захотите использовать findstr для выбора строки. Вы можете попробовать:

dcmdump +p +P "0020,0013" PathToInvalideDICOM\img.dcm | findstr /b (0020

Чтобы вытащить «глобальный» тег InstanceNumber. Затем вы сможете разобрать токены, как у вас есть.

person rkh    schedule 13.10.2015
comment
Это дает мне что-то подобное. У меня все еще есть 3 номера экземпляра, равные 0,4 и 0. Очевидно, я хочу 4, который находится посередине. Это тег (0020,0013). И я делаю ('@echo. ^|c:\Libs\dcmtk-3.6.0\bin\dcmdump +p +P "0020,0013" %%i'), но все еще имею последнее значение, 0... Как поступить? - person Atnaize; 14.10.2015

  • Добавьте сравнение внутри цикла:

    for /f "tokens=2 delims=[]"  %%a in ('
        @echo. ^|c:\Libs\dcmtk-3.6.0\bin\dcmdump +P "0020,0013" %%i
    ') do (
        if not "%%a"=="0" set img_no=%%a
    )
    
  • или отфильтровать [0] с помощью find:

    for /f "tokens=2 delims=[]"  %%a in ('
        @echo. ^|c:\Libs\dcmtk-3.6.0\bin\dcmdump +P "0020,0013" %%i ^|find /v "[0]"
    ') do set img_no=%%a
    
person wOxxOm    schedule 13.10.2015