DICOM 领域的价值超出预期
DICOM field have more value than expected
我正在使用 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 直到数字正确?
默认情况下,我上面引用的命令行采用最后一个字段...我想。
在循环内添加比较:
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
)
或用find
过滤掉[0]
:
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
很可能,额外的 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
拉出"global" InstanceNumber标签。然后你应该能够像你一样解析令牌。
我正在使用 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 直到数字正确?
默认情况下,我上面引用的命令行采用最后一个字段...我想。
在循环内添加比较:
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 )
或用
find
过滤掉[0]
: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
很可能,额外的 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
拉出"global" InstanceNumber标签。然后你应该能够像你一样解析令牌。