当前位置:文档之家› dicom读取方法

dicom读取方法

Dicom格式文件解析器学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的无非就是字节码数据流处理。

只不过确实比较繁琐。

分析整体结构先是128字节所谓的导言部分,说俗点就是没啥意义的破数据跳过就是了,然后是dataElement依次排列的方式就是一个dataElement接一个dataElement的方式排到文件结尾通俗的讲dataElement就是指tag 就是破Dicom标准里定义的数据字典。

tag是4个字节表示的前两字节是组号后两字节是偏移号比如0008,0018。

所有dataElement在文件中都是按tag排序的比如0002,0001 0002,0002 0003,0011文件整体结构如下:又把论文里的这图贴上来总结的很好。

单个dataElement的结构如下:显示VR:VR为OB OW OF UT SQ UN的元素结构显示VR:VR为普通类型时元素结构(少了预留那一行)隐式VR 时元素结构要问VR是啥东东,值表示法啥叫值表示法啊俺不懂 int string short ushort 懂不就是这个意思,Dicom标准真坑爹非要整个怪怪的概念。

VR总共27个跟c#值类型对应关系我都写好了:1string getVF(string VR, byte[] VF)2 {3string VFStr = string.Empty;4switch (VR)5 {6case"SS":7 VFStr = BitConverter.ToInt16(VF, 0).ToString();8break;9case"US":10 VFStr = BitConverter.ToUInt16(VF, 0).ToString(); 1112break;13case"SL":14 VFStr = BitConverter.ToInt32(VF, 0).ToString();1516break;17case"UL":18 VFStr = BitConverter.ToUInt32(VF, 0).ToString(); 1920break;21case"AT":22 VFStr = BitConverter.ToUInt16(VF, 0).ToString(); 2324break;25case"FL":26 VFStr = BitConverter.ToSingle(VF, 0).ToString(); 2728break;29case"FD":30 VFStr = BitConverter.ToDouble(VF, 0).ToString(); 3132break;33case"OB":34 VFStr = BitConverter.ToString(VF, 0);35break;36case"OW":37 VFStr = BitConverter.ToString(VF, 0);38break;39case"SQ":40 VFStr = BitConverter.ToString(VF, 0); 41break;42case"OF":43 VFStr = BitConverter.ToString(VF, 0); 44break;45case"UT":46 VFStr = BitConverter.ToString(VF, 0); 47break;48case"UN":49 VFStr = Encoding.Default.GetString(VF); 50break;51default:52 VFStr = Encoding.Default.GetString(VF); 53break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧给你整明白:所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。

文件元dataElement 和跟像素数据相关的dataElement 都很重要,其他的很多如果全部照顾完的话估计得写上千行switch语句吧,所以没有必要一般我们一般只抓取关键的tag。

并且在隐式语法下要确定VR也必须根据字典来确定关键的tag如下:1string getVR(string tag)2 {3switch (tag)4 {5case"0002,0000"://文件元信息长度6return"UL";7break;8case"0002,0010"://传输语法9return"UI";10break;11case"0002,0013"://文件生成程序的标题12return"SH";13break;14case"0008,0005"://文本编码15return"CS";16break;17case"0008,0008":18return"CS";19break;20case"0008,1032"://成像时间21return"SQ";22break;23case"0008,1111":24return"SQ";25break;26case"0008,0020"://检查日期27return"DA";28break;29case"0008,0060"://成像仪器30return"CS";31break;32case"0008,0070"://成像仪厂商33return"LO";34break;35case"0008,0080":36return"LO";37break;38case"0010,0010"://病人姓名39return"PN";40break;41case"0010,0020"://病人id42return"LO";43break;44case"0010,0030"://病人生日45return"DA";46break;47case"0018,0060"://电压48return"DS";49break;50case"0018,1030"://协议名51return"LO";52break;53case"0018,1151":54return"IS";55break;56case"0020,0010"://检查ID57return"SH";58break;59case"0020,0011"://序列60return"IS";61break;62case"0020,0012"://成像编号63return"IS";64break;65case"0020,0013"://影像编号66return"IS";67break;68case"0028,0002"://像素采样1为灰度3为彩色 69return"US";70break;71case"0028,0004"://图像模式MONOCHROME2为灰度 72return"CS";73break;74case"0028,0010"://row高75return"US";76break;77case"0028,0011"://col宽78return"US";79break;80case"0028,0100"://单个采样数据长度 81return"US";82break;83case"0028,0101"://实际长度84return"US";85break;86case"0028,0102"://采样最大值87return"US";88break;89case"0028,1050"://窗位90return"DS";91break;92case"0028,1051"://窗宽93return"DS";94break;95case"0028,1052":96return"DS";97break;98case"0028,1053":99return"DS";100break;101case"0040,0008"://文件夹标签102return"SQ";103break;104case"0040,0260"://文件夹标签105return"SQ";106break;107case"0040,0275"://文件夹标签108return"SQ";109break;110case"7fe0,0010"://像素数据开始处111return"OW";112break;113default:114return"UN";115break;116 }117 }最关键的两个tag:0002,0010普通tag的读取方式 little字节序还是big字节序隐式VR还是显示VR。

相关主题