我正在尝试从C++中的西门子扫描仪读取多切片(Mosaic(DICOM图像,使用DCMTK读取nibel页面上的标签和信息。
据我所知,Mosaic图像有一个CSA标头,在8字节(CSA1(或16字节(CSA2(之后,包含结构
<TAG level>
tag name [64x uchar]
vm vr dt it mm [ 5x 4 bytes]
vm: [1x int32]: number of values
vr: [4x uchar]: 'value representation' string
dt: [1x int32]: 'Syngo DT' Siemens version of vr
it: [1x int32]: number of items
mm: [1x int32]: 77 (ascii value for 'M' I guess, or 205 [+128])
<ITEM level>
a b c d [ 4x 4 bytes]
a: [1x int32]: in CSA1: size Nitem in bytes + 'it' of first tag(?!)
b: [1x int32]: in CSA2: size Nitem in bytes
c: [1x int32]: 77 or 205 again, see above
d: [1x int32]: not used by nibabel
val [Nitem bytes]: item value
padding [nextw bytes]: start of next 4-byte word
它很特别。但可行。在CSA2中,编号a
、b
和d
将是相同的。
现在我已经找到了包含JSON结构的标签MrPhoenixProtocol
。这不是问题(解析器很多(。上面描述的5个值是vm
=1,vr
='UN',dt
=0,it
=6,mm
=77。it
的值6很奇怪,但也出现在其他标签中(1个项目后面跟着5个空项目(。然后,对于第一个项目,a
、b
和d
为192,c
为77,因此所有符号都表示项目大小为192字节。但这几乎没有达到JSON中的第一个参数,字段要大得多。因此,192字节只是项目/标签的一小部分,之后的检查显示值77或205没有被读取到它应该读取的位置。
在读取标记值之前,需要知道其数据的大小。但在这个MrPhoenixProtocol
标签的情况下,如果它不在这些数字中(所以不是值192(,它可以用另一种方式计算吗?
编辑
函数csareader.py
正确显示MrPhoenixProtocol
标签。我添加了行
`print('{0} values: 1:{1}, 2:{2}, 3:{3}, 4:{4}, item_len: {5}'.format(name,x0,x1,x2,x3,item_len));
就在从缓冲区读取项目并打开我的DICOM图像之前。项目长度显示为139200个项目(在上面的示例中,a
、b
和d
将具有该值(,725乘以192(我读取的值(。完全困惑。
如果您还没有找到,您可以使用检查一个DICOM文件的CSA结构
$ gdcmdump --csa input.dcm
你应该得到这样的东西:
- http://gdcm.sourceforge.net/wiki/index.php/SIEMENS_CSA_Header
可以在以下位置检查代码:
- https://github.com/malaterre/GDCM/blob/v3.0.10/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.cxx#L948
如果您只对"MrProtocol"小节感兴趣,可以使用:
$ gdcmdump --mrprotocol input.dcm