DCM医学影像文件的格式与读取方法分享
来源:互联网 发布:java互相纸牌源代码 编辑:程序博客网 时间:2024/06/04 20:07
医学影像DCM是个类似PNG的分块格式,内涵丰富医疗信息,由于应用领域较窄,OpenCV没有提供对其加载支持,一般采用dcmtk库进行加载。
博主本着研究探索的精神写了这段代码,并分享出来,提供了解析DCM的DIB数据、宽高、窗宽窗位、像素间距的功能,支持反色DCM。
将来可以参考spec文档进行扩充,可以在大框架中加入块的处理,从而抽取更多感兴趣的信息,也可以加入压缩DCM的支持。
// 输入:文件名// 输出:宽高 窗宽窗位 像素间距 dibunsigned short* dcmLoadImage(char* fn, int& width, int& height, int& windowWidth, int& windowLevel, double& pixelSpacing){// 读取整个文件到内存FILE* f = fopen(fn, "rb");fseek(f, 0, SEEK_END);int dcmSize = ftell(f);fseek(f, 0, SEEK_SET);unsigned char* dcm = new unsigned char[dcmSize];fread(dcm, dcmSize, 1, f);fclose(f);// 解析width = -1;height = -1;windowWidth = -1;windowLevel = -1;pixelSpacing = 0.0;bool invert = false;unsigned short* dib = NULL;int dibSize = -1;int p = 132;while( p<dcmSize ){short group = *(short*)(dcm+p);p+=2;short element = *(short*)(dcm+p);p+=2;//cout<<setfill('0')<<hex<<setw(4)<<group<<","<<setw(4)<<element<<setfill('\0')<<dec<<endl;if(group==0x0002){if(element==0x0001)// 2,1{p+=10;}else// 2,*{char vr[3];vr[0] = dcm[p++];vr[1] = dcm[p++];vr[2] = '\0';short size = *(short*)(dcm+p);p+=2;p+=size;}}else// *{int size = *(int*)(dcm+p);p+=4;if(size==-1)size=0;if(group==0x0028&&element==0x0010)height = *(short*)(dcm+p);if(group==0x0028&&element==0x0030)pixelSpacing = atof((char*)dcm+p);if(group==0x0028&&element==0x0004)invert = !strncmp((char*)dcm+p, "MONOCHROME1", 11);else if(group==0x0028&&element==0x0011)width = *(short*)(dcm+p);else if(group==0x0028&&element==0x1050)windowLevel = atoi((char*)dcm+p);else if(group==0x0028&&element==0x1051)windowWidth = atoi((char*)dcm+p);else if(group==0x7FE0&&element==0x0010){dibSize = size;dib = new unsigned short[dibSize];memcpy(dib, dcm+p, dibSize);}p+=size;}}assert(p==dcmSize);assert(width!=-1);assert(height!=-1);assert(windowLevel!=-1);assert(windowWidth!=-1);assert(dib!=NULL);assert(dibSize==width*height*2);// 反图做修正if(invert){for(int i=0; i<width*height; i++)dib[i] ^= 0xFFFF;windowLevel = 65535-windowLevel;}delete[] dcm;return dib;}void dcmReleaseImage(unsigned short* dib){delete[] dib;}
0 0
- DCM医学影像文件的格式与读取方法分享
- DCM医学影像文件的格式与读取方法分享
- 分享:Perl打开与读取文件的方法
- 多帧Dcm图片的读取与拆分存储
- 分享pdf文件转换成txt格式的方法
- verilog读取的二进制与十六进制文件的格式问题
- DCMTK:带有多张图片的dcm文件转成多张QImage与多张图片添加到一个dcm文件
- INI文件的创建与读取方法
- 读取pbxproj格式的文件
- 读取其他格式的文件
- 4 安装gdcm(用于读取压缩的dcm数据)
- 查看医学影像文件软件
- 文件读取的方法
- 基于CUDA的医学影像数据处理工作站的配置方法
- dcm文件编程
- 分享pdf转换jpg格式的方法
- 分享】读取properties配置文件的方法汇总
- 详解:智能医学影像分析的前沿与挑战
- c#中的可空类型
- ManyToMany
- c#中的volatile关键字
- PC电商平台的主要消费群体以女性为主体
- 原生js获取table的第一个td值
- DCM医学影像文件的格式与读取方法分享
- 技术博客网站
- 外部表 alert.log (unix格式转换)
- 控液晶屏似电脑车 高科技爆发
- Struts2的REST插件
- sqlserver2008连接字符串
- 贝叶斯定理
- java的System.getProperty()方法可以获取的值
- C#正则表达式去除汉字