2015-10-13 62 views
5

我正在使用DCMTK(3.6.0)库来获取(0020,0013)标记的值,该标记是图像编号(即图像序号的切片编号)。DICOM字段具有比预期的更多的值

我使用批处理脚本

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,直到正确的数字?

默认情况下,我上面引用的命令行采用最后一个字段......我想。

回答

6

最有可能的,额外的实例号标签的一部分一个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 

那么它应该只是验证完全是一个无论哪个实例号你真的想(可能是全球之一)

在一个批处理文件中,您可能需要执行findstr来挑选该行。您可能想尝试:

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

拉出“全局”InstanceNumber标记。那么你应该能够解析令牌。

+0

它给了我类似的东西。我仍然有3个实例编号等于0,4和0.显然,我想要4,这是在中间。这个标签是(0020,0013)。我做'('@echo。^ | c:\ Libs \ dcmtk-3.6.0 \ bin \ dcmdump + p + P“0020,0013”%% i')'但仍然有最后一个值0。 .. 如何进行 ? – Raccoon

1
  • 添加环内的比较:

    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