ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:127.19KB ,
资源ID:6556456      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6556456.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(dicom读取方法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

dicom读取方法.docx

1、dicom读取方法Dicom格式文件解析器学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码流处理。只不过确实比较繁琐。分析整体结构先是128字节所谓的导言部分,说俗点就是没啥意义的破数据 跳过就是了,然后是dataElement依次排列的方式 就是一个dataElement接一个dataElement的方式排到文件结尾 通俗的讲dataElement就是指tag 就是破Dicom标准里定义的数据字典。tag是4个字节表示的 前两字节是组号后两字节是偏移号 比如0008,0018。所有dataElement在

2、文件中都是按tag排序的 比如0002,0001 0002,0002 0003,0011文件整体结构如下:又把论文里的这图贴上来 总结的很好。单个dataElement的结构如下:显示VR:VR为OBOWOFUTSQUN的元素结构组号元素号VR预留值长度数据元素值2222(0x00,0x00)4由数据长度决定显示VR:VR为普通类型时元素结构(少了预留那一行)组号元素号VR值长度数据元素值2224由数据长度决定隐式VR时元素结构组号元素号值长度数据元素值224由数据长度决定要问VR是啥东东 ,值表示法 啥叫值表示法啊 俺不懂 int string short ushort 懂不 就是这个意思,

3、Dicom标准真坑爹 非要整个怪怪的概念。VR总共27个 跟c#值类型对应关系我都写好了: 1 string getVF(string VR, byte VF) 2 3 string VFStr = ; 4 switch (VR) 5 6 case SS: 7 VFStr = (VF, 0).ToString(); 8 break; 9 case US:10 VFStr = (VF, 0).ToString();1112 break;13 case SL:14 VFStr = (VF, 0).ToString();1516 break;17 case UL:18 VFStr = (VF, 0)

4、.ToString();1920 break;21 case AT:22 VFStr = (VF, 0).ToString();2324 break;25 case FL:26 VFStr = (VF, 0).ToString();2728 break;29 case FD:30 VFStr = (VF, 0).ToString();3132 break;33 case OB:34 VFStr = (VF, 0);35 break;36 case OW:37 VFStr = (VF, 0);38 break;39 case SQ:40 VFStr = (VF, 0);41 break;42 c

5、ase OF:43 VFStr = (VF, 0);44 break;45 case UT:46 VFStr = (VF, 0);47 break;48 case UN:49 VFStr = break;51 default:52 VFStr = break;54 55 return VFStr;56 找个dicom文件在十六进制编辑器下瞧瞧 给你整明白:所有dataElement从前到后按tag又可简单分段:文件元dataElement不受传输语法影响 总是以显示VR方式表示 因为它里面就定义了传输语法普通dataElement受传输语法影响 显示VR表示方式还是隐式VR表示方式像素数据da

6、taElement最重要也是最大的一个数据项 其实存储的就是图像数据几个特殊的tag很重要 前面说过了tag就是dicom里定义的字典。文件元dataElement 和跟像素数据相关的dataElement 都很重要,其他的很多 如果全部照顾完的话估计得写上千行switch语句吧,所以没有必要一般我们一般只关键的tag。并且在隐式语法下要确定VR也必须根据字典来确定关键的tag如下: 1 string getVR(string tag) 2 3 switch (tag) 4 5 case 0002,0000:) 59 60 case .jpg: 61 (filename, 62 break;

7、63 case .bmp: 64 (filename, 65 break; 66 case .png: 67 (filename, 68 break; 69 default: 70 break; 71 72 73 public bool getImg( )ubstring(5); 82 cols = (tags0028,0011.Substring(5); 83 84 colors = (tags0028,0002.Substring(5); 85 dataLen = (tags0028,0100.Substring(5); 86 validLen = (tags0028,0101.Subst

8、ring(5); 87 88 gdiImg = new Bitmap(cols, rows); 89 90 BinaryReader dicomFile = new BinaryReader(fileName); 91 92 ; 93 94 long reads = 0; 95 for (int i = 0; i ; i+) 96 97 for (int j = 0; j = pixDatalen)100 break;101 byte pixData = (dataLen / 8 * colors);102 reads += ;103104 Color c = ;105 if (colors

9、= 1)106 107 int grayGDI;108109 double gray = (pixData, 0);110 oString(x4) + , +152 ().ToString(x4);153154 string VR = ;155 UInt32 Len = 0;156 /读取VR跟Len157 /对OB OW SQ 要做特殊处理 先置两个字节0 然后4字节值长度158 /-这些都是在读取VR一步被阻断的情况159 if (0, 4) = 0002)/文件头 特殊情况160 161 VR = new string(2);162163 if (VR = OB | VR = OW |

10、VR = SQ | VR = OF | VR = UT | VR = UN)164 165 ;166 Len = ();167 168 else169 Len = ();170 171 else if (tag = fffe,e000 | tag = fffe,e00d | tag = fffe,e0dd)/文件夹标签172 173 VR = *;174 Len = ();175 176 else if (isExplicitVR = true)/有无VR的情况177 178 VR = new string(2);179180 if (VR = OB | VR = OW | VR = SQ |

11、 VR = OF | VR = UT | VR = UN)181 182 ;183 Len = ();184 185 else186 Len = ();187 188 else if (isExplicitVR = false)189 190 VR = getVR(tag);/无显示VR时根据tag一个一个去找 真烦啊。191 Len = ();192 193 /判断是否应该读取VF 以何种方式读取VF194 /-这些都是在读取VF一步被阻断的情况195 byte VF = 0x00 ;196197 if (tag = 7fe0,0010)/图像数据开始了198 199 pixDatalen

12、= Len;200 pixDataOffset = ;202 VR = UL;203 VF = (Len);204 205 else if (VR = SQ & Len = | (tag = fffe,e000 & Len = )/靠 遇到文件夹开始标签了206 207 if (enDir = false)208 209 enDir = true;210 (0, ;211 folderTag = tag;212 213 else214 215 leve+;/VF不赋值216 217 218 else if (tag = fffe,e00d & Len = | (tag = fffe,e0dd

13、& Len = )/文件夹结束标签219 220 if (enDir = true)221 222 enDir = false;223 224 else225 226 leve-;227 228 229 else230 VF = (int)Len);231232 string VFStr;233234 VFStr = getVF(VR, VF);235236 /-针对特殊的tag的值的处理237 /特别针对文件头信息处理238 if (tag = 0002,0000)239 240 fileHeadLen = Len;241 fileHeadOffset = 243 else if (tag

14、= 0002,0010)/传输语法 关系到后面的数据读取244 245 switch (VFStr)246 247 case 0:/显示little248 isLitteEndian = true;249 isExplicitVR = true;250 break;251 case 0:/显示big252 isLitteEndian = false;253 isExplicitVR = true;254 break;255 case :/隐式little256 isLitteEndian = true;257 isExplicitVR = false;258 break;259 default

15、:260 break;261 262 263 for (int i = 1; i 0)/文件夹标签代码267 268 (tag + ( + VR + ): + VFStr);269 270 else if (tag = fffe,e00d & Len = | (tag = fffe,e0dd & Len = ) & leve = 0)/文件夹结束标签271 272 (tag + ( + VR + ): + VFStr);273 (folderTag + SQ, ();274 275 else276 (tag, ( + VR + ): + VFStr);277 278 279 好了收工。测试下成

16、果 1 if () != 2 return; 3 4 string fileName = ; 5 6 handler = new DicomHandler(fileName); 7 8 (textBox1); 910 = DicomViewer- + ;111213 ();这里处理gdi位图的时候直接用的setPix 处理速度比较慢所以用了backgroundWorker,实际应用中请使用内存缓冲跟指针的方式否则效率低了是得不到客户的认可的哦,gdi位图操作可使用lockBits加指针的方式 ,12位的灰度像素数据可以第一次读取后缓存到内存中 以方便后面调窗的快速读取这点代码也不难哈 对指针什么的熟点就行了,前几章都有。这是ezDicom 经过公认测试的软件 我们来跟他对比一下,打开 调窗测试,我们注意到两个东西 在没有窗宽窗位时 默认窗宽是2047+1即2048 窗位是2048/2即1024直观的感受是调窗宽像在调图像对比度 ,调窗位像在调图像亮度。窗宽为255的时候图像是最瑞丽的 因为255其实就是8位图像的默认窗宽。注意窗位那里有小小区别,ez窗位显示的是根据1024那里为0开始偏移 而我的程序是根据窗宽中间值没有偏移没有偏移的情况稍微符合逻辑点吧。但是可以看到原理是一样的 结果是一样的。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1