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 = ;4switch (VR)5 {6case"SS":7 VFStr = (VF, 0).ToString();8break;9case"US":10 VFStr = (VF, 0).ToString();1112break;13case"SL":14 VFStr = (VF, 0).ToString();1516break;17case"UL":18 VFStr = (VF, 0).ToString();1920break;21case"AT":22 VFStr = (VF, 0).ToString();2324break;25case"FL":26 VFStr = (VF, 0).ToString();2728break;29case"FD":30 VFStr = (VF, 0).ToString();3132break;33case"OB":34 VFStr = (VF, 0);35break;36case"OW":37 VFStr = (VF, 0);38break;39case"SQ":40 VFStr = (VF, 0);41break;42case"OF":43 VFStr = (VF, 0);44break;45case"UT":46 VFStr = (VF, 0);47break;48case"UN":49 VFStr = break;51default:52 VFStr = break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧给你整明白:所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。
递归读取DICOM嵌套数据集的方法及实现
递归读取DICOM嵌套数据集的方法及实现
递归读取DICOM嵌套数据集的方法及实现
唐占红; 刘瑞玲
【期刊名称】《《微计算机信息》》
【年(卷),期】2011(027)003
【摘要】DICOM 3.0是医学图像的标准,如何正确读取DICOM格式文件是医学图像处理的首要步骤。
对DICOM格式文件的处理重点在于如何读取嵌套数据集。
本文分析了DICOM嵌套数据集的格式,针对其格式特点采用了递归的方法的方法进行读取。
实验证明该算法实现简单,可实现目前所见的DICOM格式文件的显示。
为医学图像的进一步处理奠定了基础。
【总页数】3页(P.36-37,8)
【关键词】DICOM; 递归; 嵌套数据集; 医学图像
【作者】唐占红; 刘瑞玲
【作者单位】
【正文语种】中文
【中图分类】TP391
【相关文献】
1.递归读取DICOM嵌套数据集的方法及实现 [J], 唐占红; 刘瑞玲
2.多传感器物联网嵌套数据集的管理与优化模型研究[C], 华红艳; 赵成
3.美国国家健康研究院拓展了关于哮喘病的遗传和临床数据开放获取数据集——创建了最大的哮喘病临床和遗传数据公共获取数据集[J], 吴思竹
4.构建你的第一个多维数据集进入多维数据集的数据世界,更加轻松地获取你的商务智能数据 [J], Derek Comingore; 徐瑾(译者)。
Windows平台下多层DICOM图像读取_显示和压缩的改进方法
中国医学影像技术 2008 年第 24 卷增刊 Chin J Med Imaging Technol ,2008 ,Vol 24 ,Suppl
·213 ·
影像技术学
An improved method of reading , displaying and compressing multi2slice DICOM images under Windows
比度突出关键部分甚至会损失应突出的部分 ,本文又提出了 非线性的指数加窗显示技术来弥补线性加窗显示技术的不
足。
11 31 1 线性的加窗显示技术 加窗显示是指通过一个窗口 ,将 窗口区域的图像线性地转换到显示器的最大显示范围内 ,高 于或低于窗口上下限的图像数据则分别设置为最高或最低的
显示值 。通过动态调节窗口的窗宽 (图像数据的范围) 和窗位
11 2 利用 VC + + 61 0 读取多层 DICOM 文件的实现 DI2 COM 数据集包含的信息很多 ,有些信息很少用到或者与具体 的医疗情况不符 ,因此去除冗余信息 、保留主要信息是很有必 要的 。采用面向对象的思想 ,我们设计了简化的 DICOM 图 像类结构 。类定义如下 :
Class DICOM : / / DICOM 图像类
医学数字成像和传输 ( digital imaging and communica2 tio ns in medicine , DICOM) [1] 为不同的医学影像设备提供了 一个一致性的接口 。目前大多数的 DICOM 图像浏览软件都 存在一些不足 : 首先 , 大部分 DICOM 图像浏览软件都基于 UN IX 平台下运行 ,而在科研和教学中常需要在 WINDOWS 环境下显示处理 DICOM 图像 。另外 ,这些软件仅能读取与 显示一幅图像而且图像显示的效果并不理想 , 而本文对在
基于OpenGL的DICOM医学图像读取和显示
第29卷2009年12月计算机应用JournalofComputerApplicationsV01.29Dec.2009文章编号:1001—9081(2009)S2-0126—02基于OpenGL的DICOM医学图像读取和显示王旭1.翟红英2(1.首都医科大学大兴医院信息科,北京102600;2.北京联合大学师范学院电气信息系,北京100011)(dthongyin#buu.edu.cn)摘要:DICOM3.0是医院各影像设备所遵循的标准,该标准的文件一般不被现有的图像处理软件所支持。
通过对医学数字成像和通信(DICOM)标准的研究,编写了DICOM文件的读取与显示程序,使得普通电脑也可以显示DICOM标准的医疗影像图片。
为医疗影像的三维重建、医生对病灶处的诊断以及模拟手术的实施提供了前期技术支持,有助于医学资源的共享。
关键词:医学数字成像和通信标准;医学图像;标准;读取;显示中图分类号:TP391.9文献标志码:AReadinganddisplayingDICOMmedicineimagebasedonOpenGLWANGXul.ZHAIHong—yingz(1.Departmem矿Information,n“妇HospitalofCapitalUnitErsityofMedical&切l棚,觇咖曙102600。
China;2.DepartmentofElectricalInformation,Teacher'sCollegeof觑咖曙Union踟矗ma弘&洳19100011,傩打Ⅺ)Abstract:DICOM3.0isstandardwhichhospitalimageequipmentsfoHowby,butthefliesofthisstandardarenotsupportedgenerallybymostimageryprocessingsoftware.ThroughstudyingDigitalIraagingandCommunicationsinMedidne(DICOM),theprogramwascompiledtoreadanddisplaytheDICOMfilesthatmaytheordinarycomputerdisplaymedicalimages.Thisprovidmoretechnicalassistanceinmedicalimages30reconstruction,focusdiagnosisofinfectionplaceandsimulationsurgeryimplementation,anditisalsohelpfultomedicineI'eSOUI懒sharing.Keywords:DigitalImagingandCommunicationsinMedicine(DICOM);medicineimage;standard;reading;displaying随着医疗服务水准的提升,医疗信息系统已经成为所有医院发展必不可少的一部分,特别是医疗影像系统(PACS)随着医学影像技术和计算机网络技术的发展,逐渐在我国的医院普及。
DICOM图像发送接收参数设置
1、放射设备和工作站电脑组成局域网
DICOM图像发送与接收一般使用固定IP地址,本工作站电脑的IP地址需要和在一起工作的设备如CT,DR,CT,胶片打印机的IP地址在同一个号段,保证其间物理连接正常。
IP地址的设置在操作系统中进行,在电脑桌面上右击网上邻居图标,如果桌面没有,可以在资源管理器中右击网上邻居。
在弹出的菜单中选择“属性”,打开网络设置对话框,右击本地连接,在弹出的菜单中选择属性。
打开本地连接属性对话框如下图。
选择Internet协议(TCP/IP),点击属性即可打开IP地址设置如下图:
DNS服务器地址可以忽略。
2、软件设置
在软件操作主界面按下设置按钮,在打开的界面输入系统参数设置密码进入系统设置界面,在该界面按下厂家设置,输入厂家设置密码136,进入厂家设置界面,打开DICOM参数设置对话框如下图
在这里输入AETitle和Port(端口号)。
DICOM参数设置结束需要重新启动软件。
3、设备设置
进入放射设备的设置菜单,找到DICOM图像发送项,输入工作站电脑的ip地址,AETitle和Port(端口号)。
有的公司产品不允许用户自己设置,比如西门子公司一般通过远程控制CT为客户设置。
如果用户不能自己设置CT,DR、MR
等设备的接收端参数,请和设备供应商联系,他们有义务帮助客户解决这一问题。
医学图像格式转换及读取与显示
医学图像格式转换及读取与显示1.医学图像格式转换通常从机器拷贝出来的医学图像数据为DICOM格式,如果是多种模态图像混合,则需要使用Dcm2AsiszImg.exe工具把多模态图像分类出来,软件如下图所示:Dcm2AsiszImg 是一个接收、发送DICOM 图像、把DICOM 图像进行分类、把DICOM 转化为安科Img 图像格式的软件工具。
用法:“输出目录”选择待转化的图像保存路径,“DICOM图像分类”选择要转化的原始图像目录,最后点击“DICOM图像分类”,输出图像分辨率为256*256。
常用的图像格式还有ANALYZE和NIFTI,ANALYZE格式的图像包括图像文件.img 和头文件.hdr,应用于SPM2。
NIFTI把图像文件和头文件合并为.nii文件,应用于SPM8、FSL、FreeSurfer等。
可以利用MRICron软件的dcm2niigui.exe插件把DICOM格式转化为ANALYAZE 和NIFTI格式。
在Help下的preference处可设置输出参数:2.读取与显示DICOM图像Matlab提供了dicominfo、dicomdict、dicomdisp、dicomread、dicomuid 、dicomwrite函数,可实现DICOM格式图像的读取、显示、保存等操作,以及查看扫描信息。
3.读取与显示NIFTI格式图像MRIcro软件可以显示NIFTI图像① NIfTI这个Matlab程序可以读取显示、保存、制作核磁共振图像。
具体如下:>> [hdr,filetype,fileprefix,machine] = load_nii_hdr('output.hdr');>> [img,hdr] = load_nii_img(hdr,filetype,fileprefix,machine);>> save_nii(nii, filename, [old_RGB]);②SPM方法:help spm_read_volsV = spm_vol_nifti('output.hdr')[Y,XYZ] = spm_read_vols(V);4.Freesurfer的mgh图像读取与显示Freesurfer安装目录下有一个matlab程序包,提供了load_mgh, save_mgh等函数实现该文件的读取与显示。
使用Python对Dicom文件进行读取与写入的实现
使⽤Python对Dicom⽂件进⾏读取与写⼊的实现Pydicom单张影像的读取使⽤ pydicom.dcmread() 函数进⾏单张影像的读取,返回⼀个pydicom.dataset.FileDataset对象.import osimport pydicom# 调⽤本地的 dicom filefolder_path = r"D:\Files\Data\Materials"file_name = "PA1_0001.dcm"file_path = os.path.join(folder_path,file_name)ds = pydicom.dcmread(file_path)在⼀些特殊情况下,⽐如直接读取从医院拿到的数据(未经任何处理)时,可能会发⽣以下报错:raise InvalidDicomError("File is missing DICOM File Meta Information "pydicom.errors.InvalidDicomError: File is missing DICOM File Meta Information header or the 'DICM' prefix ismissing from the header. Use force=True to force reading.可以看到,由于缺失⽂件元信息头,⽆法直接读取,只能强⾏读取.这种情况可以直接根据提⽰,调整命令为:ds = pydicom.dcmread(file_path,force=True)但后续还会碰到:AttributeError: 'Dataset' object has no attribute 'TransferSyntaxUID'在⽹上检索后发现,可以通过设置TransferSyntaxUID来解决问题:ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian这样就⼤功告成了(这⾥实际上就提前接触到了下⾯读取Dicom Tags的内容了)⼀些简单处理读取成功后,我们可以对 Dicom⽂件进⾏⼀些简单的处理读取并编辑Dicom Tags可以通过两种⽅法来读取Tag的值使⽤的Tag的Descriptionprint(ds.PatientID,ds.StudyDate,ds.Modality)使⽤ ds.get() 函数. 函数内参数采⽤的是Tag ID.⼏种简单的打开Dicom⽂件的软件(如RadiAnt DICOM Viewer)都可以直接看到.这⾥不再赘述.ds.get(0x00100020) # 这⾥得到的是PatientID读取到相应的Tag值后, 也可以将其他的值写⼊这些Tag.只要最后保存⼀下就可以了.借助Numpy与PIL.Image读取Dicom⽂件后,可以借助Numpy以及图像处理库(如PIL.Image)来进⾏简单的处理.借助Numpyimport numpy as npdata = np.array(ds.pixel_array)注意这⾥使⽤的是 np.array() ⽽不是 np.asarray(). 因为前者的更改并不会带来原pixel_array的改变.在转化为ndarray后可以直接进⾏简单的切割和连接,⽐如截取某⼀部分和将两张图像拼在⼀起等,之后再写⼊并保存下来即可.借助PIL.Imagefrom PIL import Imagedata_img = Image.fromarray(ds.pixel_array)data_img_rotated = data_img.rotate(angle=45,resample=Image.BICUBIC,fillcolor=data_img.getpixel((0,0)))这⾥展⽰的是旋转, 还有其他功能如resize等.需要注意的是,从Numpy的ndarray转化为Image时,⼀般会发⽣变化:print(data.dtype) # int16data_rotated = np.array(data_img_rotated)print(data_img) # int32只需要指定参数就可以解决了data_rotated = np.array(data_img_rotated,dtype = np.int16)可视化简单的可视化Pydicom没有直接的实现⽅法,我们可以通过上⾯借助Matplotlib以及Image模块来实现.但效果有限.借助 Matplotlib (Pydicom官⽅⽂档中使⽤的⽅法)from matplotlib import pyplotpyplot.imshow(ds.pixel_array,cmap=pyplot.cm.bone)pyplot.show()效果如图所⽰:但真实的图像是:显然颜⾊是有区别的.导致这种差别的原因是pyplot函数使⽤的cm也就是"color map" 是简单的"bone" 并不能满⾜医学图像的要求.借助Image模块data_img.show()⼀条指令即可,但是效果很差,如图所⽰:综合来看,两种⽅法都不是很好.单张影像的写⼊经过上⾯对Tag值的修改, 对图像的切割, 旋转等操作.最后需要重新写⼊该Dicom⽂件.ds.PixelData = data_rotated.tobytes()ds.Rows,ds.Columns = data_rotated.shapenew_name = "dicom_rotated.dcm"ds.save_as(os.path.join(folder_path,new_name))SimpleITKSimpleITK 是从基于C++的ITK迁移到Python的,所以很多⽅法的使⽤都跟C++很相似.import SimpleITK as sitk单张影像的读取有两种⽅法:sitk.ReadImage()这种⽅法直接返回image对象,简单易懂.但是⽆法读取Tag的值.img = sitk.ReadImage(file_path)print(type(img)) # <class 'SimpleITK.SimpleITK.Image'>sitk.ImageFileReader()这种⽅法⽐较像C++的操作风格,需要先初始化⼀个对象,然后设置⼀些参数,最后返回image.相对更复杂,但可以操作的点⽐较多file_reader = sitk.ImageFileReader()file_reader.SetFileName(file_path) #这⾥只显⽰了必需的,还有很多可以设置的参数data = file_reader.Execute()# 使⽤这种⽅法读取Dicom的Tag Valuefor key in file_reader.GetMetaDataKeys():print(key,file_reader.GetMetaData(key))以上两种⽅法返回的都是三维的对象,这与Pydicom有很⼤的不同.data_np = sitk.GetArrayFromImage(data)print(data_np.shape) # (1, 512, 512) = (Slice index, Rows, Columns)序列读取序列读取的⽅法与单张图像读取的第⼆种⽅法很相似.(暂且只发现了⼀种⽅法读取序列,如果还有其他⽅法,请在评论区予以补充,感谢!)series_reader = sitk.ImageSeriesReader()fileNames = series_reader.GetGDCMSeriesFileNames(folder_name)series_reader.SetFileNames(fileNames)images = series_reader.Execute()同样,返回的也是三维的对象.⼀些简单操作SimpleITK 包含很多图像处理如滤波的⼯具,这⾥简单介绍⼀个边缘检测⼯具和可视化⼯具边缘检测以Canny边缘检测算⼦为例,与读取单张图像类似,同样有两种⽅式:sitk.CannyEdgeDetection()由于滤波的对象必须是32位图像或者其他格式, 需要通过 sitk.Cast() 转换. 之后可以再转换回原格式.data_32 = sitk.Cast(data,sitk.sitkFloat32)data_edge_1 = sitk.CannyEdgeDetection(data_32,5,30,[5]*3,[0.8]*3)sitk.CannyEdgeDetectionImageFilter()这个操作相对⿇烦⼀些Canny = sitk.CannyEdgeDetectionImageFilter()Canny.SetLowerThreshold(5)Canny.SetUpperThreshold(30)Canny.SetVariance([5]*3)Canny.SetMaximumError([0.5]*3)data_edge_2 = Canny.Execute(data_32)可视化可视化的⽅法⾮常简单只需要⼀条指令:sitk.Show()但需要先安装⼯具ImageJ,否则⽆法使⽤.具体的安装链接,可以参考这篇博⽂:同⼀张Dicom⽂件使⽤sitk.Show()得到的效果如下图:除此之外,ImageJ还有⼀个Tool Bar ⽀持对图像的进⼀步处理:可见,SimpleITK的可视化要⽐上⾯介绍的强⼤很多,不仅可以实现单张图像的可视化以及图像处理,还可以同时对整个序列的图像进⾏统⼀处理.单张影像的写⼊同样有两种⽅法sitk.WriteImage()new_name = "new_MR_2.dcm"sitk.WriteImage(img,os.path.join(folder_name,new_name))sitk.ImageFileWriter()file_writer = sitk.ImageFileWriter()file_writer.SetFileName(os.path.join(folder_name,new_name))file_writer.SetImageIO(imageio="GDCMImageIO")file_writer.Execute(img)使⽤这两种⽅法进⾏写⼊的时候,会发现,即便什么也没有做,但得到的新Dicom⽂件要⼩于原始的Dicom⽂件.这是因为新的Dicom⽂件中没有Private Creator信息(属于Dicom Tag的内容).当然如果原始Dicom⽂件中本就没有这种信息,⽂件⼤⼩是保持相同的.因为很多时候只是对图像进⾏处理,所以不再深究.到此这篇关于使⽤Python对Dicom⽂件进⾏读取与写⼊的实现的⽂章就介绍到这了,更多相关Python Dicom⽂件进⾏读取与写⼊内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
4.信恩正PACS 操作手册 第四章:DICOM操作
第四章:DICOM文件操作 第一节:打开DICOM CD盘第二节:DICOM 文件导入第三节:DICOM 文件导出第一节:打开DICOM CD盘1.打开 DICOM CD-R打开存储DICOMDIR格式的CD。
下图是运行DICOM CDR Open后读取的DICOM CDR。
在CD ROM Drive(光盘驱动器)里有DICOMDIR格式时,指定光驱后点击Find按纽,就会出现按DICOMDIR格式存储的目录。
2. 打开 DICOM 文件利用文件选择窗口,可以直接选择打开DICOM File (DICOM 文件),在MEDPAX Viewer中阅览。
打开DICOM File(DICOM 文件)。
※ 打开DICOMCDR时,因为是从CD-ROM打开的影像,所以不能直接存储。
若要存储,在打开影像的状态中点击鼠标右键,在菜单中运行Send To Folder(发送到文件夹),把影像发送到Local Folder(本地文件夹)或Conference Folder (Conference 文件夹)即可。
3.D ICOM 查询/检索(传送)1)Query/Retrieve 概要Query/Retrieve 是指SCU(Service Class User) 向SCP(Service Class Provider) 提出要求,获取结果。
MEDPAX Viewer本身具备Query/Retrieve SCU 功能,所以跟任何具备Query/Retrieve SCP第三方DICOM 工作站都可以通过Query 来存储影像。
MEDPAX Viewe 可以通过C-Find Command和C-Get command来做Query/Retrieve,可以通过C-Find Command来做Query,通过C-Move Command来Retrieve到其他Storage SCP。
2)DICOM Query 使用方法按纽就会被激活,点击按患者)项目中选择Patient(患者),就会在STUDY(检查)项目中输出8) 在PATIENT(患者)项目中选择Patient(患者,点击按钮,则选择的Patient(患者)的所有Study(检查)的Series(系列)中的所有Image(影像)都存到Retrieve Queue。
Pythonvtk读取并显示dicom文件示例
运行程序得到显示图:
DICOM图像显示是可以设置窗宽、窗位的,还在学习尝试中,效果好的话再更新。 以上这篇Python vtk读取并显示dicom文件示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多 支持。
这篇文章主要给大家介绍了关于利用python来实现阿姆斯特朗数的检查的相关资料文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值需要的朋友们下面随着小编来一起学习学习吧
Pythonvtk读取并显示 dicom文件示例
因为做项目的原因,所以接触到了医学图像dicom文件。vtk刚开始看
基于ITK、VTK的DICOM图像的显示及信息提取
Window魏vtkRenderWindowInteractor的对象,剡 pipeline的基本节点已建立。将DICOM文件的路径 名作为参数传给vtkDIcOMImageReader对象,设鬣 vtkDICOMImageReader对象的输出为vtkImageMap, per对象的输入,为vtkActor2D对象设置映射器为 vtkImageMapper对象,依次设置各位置节点的输入 霸输窭,隽绘裁嚣添麴演员、设置鹜景色,隽绘制窗 口添加绘制器、调熬绘制窗口大小,添加绘制窗口交 互器等,通过以上的流程即可读取并显示DICOM网 像。图6是矮这一方法显示入薅头部DICOM图像 的实例。
000
3
022 00000E 3
0000COE
0 0 00000
32 0IE 0000803 0D060l
000 00000 33 30 000000
DICHⅡ£ 7
曲
口I 1 2 840 tO
008 5 l‘l l 2
图2 二进制显示DICOM文件的文件头
Fig 2 The DICOM file header shown in binary
format. 【Key words】DICOM files;VTK;ITK;medical information
1 DICoM文件
随着医院管理信息系统(hospital management information system,HIS)和图片存档及通信系统 (picture archiving and communications system,PACS) 技术的发展,统一各种数字化影像设备的图像数据 格式和数据传输标准成为当务之急,为此,DICOM 标准诞生了。DICOM标准(digital imaging and corn- munications in medicine)是由美国放射学院(Ameri- can College of Radiology,ACR…)和国家电气制造商 协会(National Electrical Manufacturers Association, NEMA"1)共同制定的,它包括了医学的数字成像和 通信传输两个方面。由于DICOM文件中可以包含 大量有用的医疗相关信息,这是其他图像格式所不 具备的,因而DICOM格式成为了医学图像的专用存 储格式。随着HIS和PACS的发展普及和推广,编 程实现DICOM文件的读取(包括其完整信息的读 取和图像的显示)是开发与DICOM以及PACS相关
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 =50break;51default:52 VFStr =53break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧给你整明白:所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。
DICOM文件头信息读取及解析
DICOM文件头信息读取及解析尤超【摘要】DICOM as a medical image storage and transmission standard, covers the medical digital image collection, archiving, communication, display and query almost all information exchange protocol, and structured defines medical image equipment manufacturer compatibility statement. In this paper, through the analysis of DICOM file structure, to parse the DICOM file header of the composition and content, the realization of the DICOM file header information is read, and using the obtained inforraiison to read the DICOM file in the data set stored content. This method is to read the DICOM file basic analytic process, this paper reads DICOM file from the program developers integrated platform in the isolated, in combination with the image display program as an independent DICOM file to read the procedures used.%DICOM作为医学图像存储和传输的标准,涵盖了医学数字图像的采集、归档、通信、显示及查询等几乎所有信息交换的协议,并且结构化地定义了医疗图像设备制造厂商的兼容性申明.通过分析DICOM文件的构成,解析DICOM文件头的组成和内容,实现对DICOM 文件头的信息读取,并利用所获得的信息,进一步读取DICOM文件中的数据集存储内容,是读取DICOM文件的基本解析过程,可以将对DICOM文件的读取,从程序开发商的集成平台中分离出来,在结合图像显示程序之后,作为独立的DICOM文件读取程序使用.【期刊名称】《微型电脑应用》【年(卷),期】2012(028)009【总页数】4页(P39-41,44)【关键词】DICOM;DICOM文件;DICOM文件头【作者】尤超【作者单位】上海交通大学,上海,200030【正文语种】中文【中图分类】TP3110 引言DICOM是美国放射学会和美国电器制造商协会组织制定的,专门用于医学图像的存储和传输的标准,它涵盖了医学数字图像的采集、归档、通信、显示及查询等几乎所有信息交换的协议,结构化地定义了医疗图像设备制造厂商的兼容性声明。
DICOM医学序列图像数据读取及回放
DICOM 医学序列图像数据读取及回放赖瑞增,林 强(福州大学 福建福州 350002)摘 要:结合实际工程中读取DICOM 医学序列图像的要点难点,较详细介绍了DICOM 数据元素的基本定义,着重阐述了读取数据中一些需注意的细节。
针对DICO M 文件格式的十六进制字符存储方式,采用C ++语言的有关文件函数进行读取,具体说明了实现的算法流程。
针对序列图像的回放显示存在帧之间时间间隔的精确定时这一技术难点,本文着重对其进行了分析阐述。
关键词:DICO M ;标签;数据;序列;回放中图分类号:T P391 41 文献标识码:B 文章编号:1004373X (2007)0516003Implementation of Read in Medical Sequential Image of DIC OML A I Ruizeng ,L IN Q iang(Fuzhou U niversity ,Fuzho u,350002,Chi na)Abstract :T his art icle includes the essentia l of the r ead in medical sequential imag e of DI CO M ,also intro duces the funda mental definition of the data elements of D ICO M particularly.Discusses t he details in r ead data emphat ically.T he code of DI CO M file is in the fo rm o f HEX,which w e use the file functio n of C ++languag e to read.M eanwhile,illustr at es the flo w cha rt of algo rit hm in implementat ion.W e also ex plain t he difficulty that the timing o f the int er val betw een f rames in the repla y o f the sequential imag e accurately.Keywords :DICOM ;label;dat a;sequential;replay收稿日期:20060726基金项目:卫生部科学研究基金 福建省卫生教育联合攻关计划资助项目(WKJ 2005 2 010)DICO M (digital image and communication on medi cine)文件为医学影像的专用传输和存储格式,后缀为.dcm,在CT ,M R,医院PA CS 系统中应用广泛。
利用VTK的DICOM图像的显示与信息读取-精选文档
利用VTK的DICOM图像的显示与信息读取-精选文档利用VTK的DICOM图像的显示与信息读取Displaying the DICOM Image and Reading Information from DICOM Image by VTKZHANG Xiang1,2, CHEN Sheng-yong1(1puter Science and Technology Campus of Zhejiang University of Technology, Hangzhou 310014, China; 2rmation and Engineering Campus Jinhua College of Vocation and Technology, Jinhua 321017, China): DICOM file is special use for medical image. It's the element task to pick out data from DICOM file in image processing. VTK is strong in image processing, visualization and so on. There are more classes and functions for DICOM in the version after 5.0. It appears easy to read the information from DICOM file.DICOM标准(digital imaging and communications in medicine)由美国放射学院(American College of Radiology,ACR)和国家电气制造商协会(National Electrical Manufacturers Association,NEMA)共同制定,包含医学的数字成像和通信两方面,该标准的制定统一了各种数字化影像设备的图像数据格式,有效解决了不同成像设备间的数据传输中存在的障碍。
python对DICOM图像的读取方法详解
python对DICOM图像的读取⽅法详解DICOM介绍DICOM3.0图像,由医学影像设备产⽣标准医学影像图像,DICOM被⼴泛应⽤于放射医疗,⼼⾎管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和⽛科等其它医学领域得到越来越深⼊⼴泛的应⽤。
在数以万计的在⽤医学成像设备中,DICOM是部署最为⼴泛的医疗信息标准之⼀。
当前⼤约有百亿级符合DICOM标准的医学图像⽤于临床使⽤。
看似神秘的图像⽂件,究竟是如何读取呢?⽹上随便⼀搜,都有很多⽅法,但缺乏⽐较系统的使⽤⽅法,下⽂综合百度资料,结合python2.7,讲解如何读取及使⽤DICOM图像。
读取DICOM图像,需要以下⼏个库:pydicom、CV2、numpy、matplotlib。
pydicom专门处理dicom图像的python专⽤包,numpy⾼效处理科学计算的包,依据数据绘图的库。
安装:pip install matplotlibpip install opencv-python #opencv的安装,⼩度上基本都是要下载包,安装包后把包复制到某个⽂件夹下,#后来我在https:///pypi/opencv-python找到这种pip的安装⽅法,亲测可⽤pip install pydicompip install numpy如果没有记错,安装pydicom时,也会⾃动把numpy安装上。
安装好这些库后,就可以对dicom⽂件操作。
具体看下⾯代码:#-*-coding:utf-8-*-import cv2import numpyimport dicomfrom matplotlib import pyplot as pltdcm = dicom.read_file("AT0001_100225002.DCM")dcm.image = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleInterceptslices = []slices.append(dcm)img = slices[ int(len(slices)/2) ].image.copy()ret,img = cv2.threshold(img, 90,3071, cv2.THRESH_BINARY)img = numpy.uint8(img)im2, contours, _ = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)mask = numpy.zeros(img.shape, numpy.uint8)for contour in contours:cv2.fillPoly(mask, [contour], 255)img[(mask > 0)] = 255kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)img2 = slices[ int(len(slices)/2) ].image.copy()img2[(img == 0)] = -2000plt.figure(figsize=(12, 12))plt.subplot(131)plt.imshow(slices[int(len(slices) / 2)].image, 'gray')plt.title('Original')plt.subplot(132)plt.imshow(img, 'gray')plt.title('Mask')plt.subplot(133)plt.imshow(img2, 'gray')plt.title('Result')plt.show()在DICOM图像⾥,包含了患者的相关信息的字典,我们可以通过dir查看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里定义的字典。
常见数字设备的DICOM连接方法
-* GECT GEMR找到,,选择最后一项,弹出对话框,选择ADD增加我们的参数,Hostname 随意设置,写pacs即可Network为我们工作站或者服务器的ipPort为我们工作站或服务器的端口,默认为104 Ae 为我们工作站或服务器的AE默认是ANY-SCP 其他选项不要动,点击save 设置完毕。
西门子ct,mr找到选项,维修,本地维修,弹出对话框,输入密码,密码默认为箭头所指的6位密码,点击ok点击第一项configuration,在对话框中找dicom选项如果没有,请选择systemoptions选项,弹出对话框,选中此项,再返回上一页面,Editname,输入名字pacs esitae ANY-SCP 还有端口号,选中storage选项,打中这个勾,archive node 保存退出,提示从起设备,设置完毕!飞利浦ct输入用户名Philips_Service密码Service_only进入到管理界面,找到lanconfig--------------addby wizard-------------------lanconfig------------------network--------------ok---------------------addoter---------------addip------------------storge注意,高端飞利浦ct设备有可能有ebw工作站,设置几乎差不多,具体情况具体分析。
Agfa cr打开设置列表输入密码Set2adminpassw,设置参数,无图,有图后补。
柯达cr dr输入用户名admin 密码1234 登陆退出到桌面到c盘安装文件下找到service_cfg(找不到就点左下角开始—程序—找到cr或者dr的软件快捷方式,对这他们的快捷方式点属性,右键查找目标,就找到这个文件夹了)双击打开,输入密码ekhi2002,点login登陆,选择pacssetting,点新建按钮,输入ae名称,ip地址为工作站或服务器ip其他对照照片输入,输入完后保存,然后别忘点update,上传数据,然后保存退出,然后一定要记得从起计算机,。
DICOM文件头信息读取及解析
摘 要 :DIOM 作 为医学图像 存储和传输的标准 ,涵盖 了医学数字图像的采集、归档、通信、显示及查询等 几乎所有信息 C
交换 的协 议 , 并且 结构 化 地 定 义 了医 疗 图像 设 备 制 造 厂 商 的 兼 容性 申 明 。通 过 分 析 D C I OM 文件 的构 成 ,解 析 DI O 文 件 C M 头 的 组 成 和 内容 ,实 现 对 DI OM 文件 头 的信 息读 取 ,并 利 用 所 获得 的信 息 ,进 一 步 读 取 DI O 文 件 中的 数据 集存 储 内 容 , C C M 是 读 取 DI O 文件 的基 本解 析 过 程 ,可 以将 对 DI OM 文件 的读 取 ,从 程 序 开 发 商 的 集 成 平 台 中分 离 出来 ,在 结 合 图像 显 C M C 示程 序 之 后 ,作 为 独 立 的 DI O 文件 读 取 程 序 使 用 。 C M 关键 字 :DI M ;DI 0 文 件 ;D C M 文件 头 CO C M I0 中 图 分类 号 :T 3 1 P l 文 献 标 志 码 :A
f c u e o ai i t tt me t I h sp p r t r u h t e a ay i fDI a t r rc mp t l y s e n . n t i a e , h o g h n l sso COM l t cu e t a s e DI bi a i f e s u t r , o p re t COM l e d ro e r h i f e h a e f h t
A bsr t t ac :DI COM sa m e i a m a tr g d ta m ison sa da d o r he m e c ld g tli a e c l ci n,a c vi , a d c li ge so a e an r ns s i t n r ,c ve s t dia i ia m g ole to r hi ng c om m u c ton iply a uey l os l i f m ai n e h ng r oc l a tu t r d d in sm e c li a qu p e tm a — nia i ,d s a nd q r am ta l n or to xc a e p ot o , nd sr c u e ef e dia m gee i m n nn
Windows 平台下多层DICOM图像读取与显示的方法
数据域( VF ) 存 放真 正 的数 据。读 取 DICOM 文 件 时先 找到感兴趣数据元的标签, 再根据数 据长度和值 表示读取数 据域的内容。 112 影响 DICOM 文件读取的 因素分析 在读 取 DICOM 文 件时, 本文主要考虑两方面的影响因素: VR 和字节序。
中华现代影像学杂志 Journal of Chinese Modern Imaging 2008 年第 5 卷 第 1 期
表 2 BMP 文件结构示意图
BIT MA PFIL EH E AD E R
位图文件头
BI TMA PIN FOH E AD E R
位图信息头
Palet te
调色板
I ma geD a ta
若 VR 为显式, 我们可 以根 据 VR 的 类型 使 用 C + + 中 相应的数据类型存储值域 的内容。若 VR 为隐式, 则 在数据 元素中不包含该字段, 此时可以根据 该数据元素 的标签通过 检 索 数 据 字 典 找 到 对 应值 域 的 数 据 类 型 。
任何存储单位大于 1 字节的数据都存在字节排序的问 题。UNIX 系统通常 使用 大 端 字节 序 ( Big Endian byte orde2 ring) , 而 Windows 系 统 通 常 使 用 小 端 字 节 序 ( Little Endian byte ordering) 。VR 和 字节 序由 标 签为 ( 0020, 0010) 的 传输 语法决定。所以在读取数据前要先读传输 语法, 获得数据排 列的规则。由于本文研究 的是 DICOM 图像 在 Windows 操作 系统下的读取及显示方法, 所以若传输语法规定待读 DICOM 图像的字节序为大端序, 则可能需要进行字节交换。 113 利用 VC + + 6. 0 读取 多层 DICOM 文 件的 实现 DI2 COM 数据集包含 的 信息 很多, 有些 信息 很 少用 到或 者 与具 体的医疗情况不符, 因此 去除 冗余 信息、保留 主要 信息 是很 有必要的。采用面向对象的思想, 笔者设计了简化的 DICOM 图 像 类 结 构 。 类 定义 如 下 :
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。