文章目录
医学影像学Medical Imaging,是研究借助于某种介质(如X射线、电磁场、超声波等)与人体相互作用,把人体内部组织器官结构、密度以影像方式表现出来,供诊断医师根据影像提供的信息进行判断,从而对人体健康状况进行评价的一门科学,包括医学成像系统和医学图像处理两方面相对独立的研究方向。
仪器主要包括X光成像仪器、CT(普通CT、螺旋CT)、正子扫描(PET)、超声(分B超、彩色多普勒超声、心脏彩超、三维彩超)、核磁共振成像(MRI)、心电图仪器、脑电图仪器等。
DICOM(Digital Imaging and Communications in Medicine) 即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。所有患者的医学图像都以 DICOM 文件格式进行存储。这个格式包含关于患者的PHI(protected health information)信息,例如姓名,性别,年龄,以及其他图像相关信息比如捕获并生成图像的设备信息,医疗的一些上下文相关信息等。医学图像设备生成 DICOM 文件,医生使用 DICOM 阅读器(能够显示 DICOM 图像的计算机软件)阅读并对图像中发现的问题进行诊断。
目前采用的标准是DICOM3.0,每一张图像中都携带着大量的信息,这些信息具体可以分为以下四类:(a)Patient(b)Study(c)Series(d)Image。每一个DICOM Tag都是由两个十六进制数的组合来确定的,分别为Group和Element。如(0010,0010)这个Tag表示的是Patient’s Name,它存储着这张DICOM图像的患者姓名。
基于C++的DCMTK、基于Java的dcm4che以及基于python的pydicom,都是非常优秀的解释DICOM标准的第三方库,通过在工程中引入它们可以避免软件开发人员去进行底层的解析工作,可为项目开发提高效率。
目前例如CT,核磁共振,超声等利用精确准直的X线束、γ射线、超声波等,与灵敏度极高的探测器一同围绕人体的某一部位作一个接一个的断面扫描,所以扫描后得到的图像是多层的图像,而我们把一层层的图像在z轴上堆叠起来就可以形成三维图像(这就涉及到三维重建的问题),这时,每一层的图像我们都可以存在dicom文件中(当然,dicom文件不是单纯的像素信息,它还有很多的数据头部信息),如下图,我们的目的就是要把在这些数据头部信息和像素信息从一系列dicom文件中读取出来。

DICOM文件是指按照DICOM标准而存储的医学文件,一般由一个DICOM文件头和一个DICOM数据集合组成,结构图如下图:

DICOM文件头包含了标识数据集合的相关信息,每个DICOM文件都必须包括一个文件头:
DICOM数据集是DICOM文件的主要组成部分,其由DICOM数据元素按照指定的顺序排列。数据元素最基本的数据单元是数据元,按照TAG从小到大顺序排列,即一个数据元表示一个TAG。数据元主要由4个部分组成:
其中数据元信息可以根据信息的不同,分为4类:-Patient-Study-Series-Image-。可以理解为一个患者(patient)可以做多次检查(study),一次检查包含多个检查部位(series),而每个检查部位都有一张或多张相应的影像图像(image)。
| Group | Element | Tag Description | 中文解释 | 数据类型(VR) |
|---|---|---|---|---|
| 0010 | 0010 | Patient’s Name | 患者姓名 | PN |
| 0010 | 0020 | Patient ID | 患者ID | LO |
| 0010 | 0030 | Patient’s Birth Date | 患者出生日期 | DA |
| 0010 | 0032 | Patient’s Birth Time | 患者出生时间 | TM |
| 0010 | 0040 | Patient’s Sex | 患者性别 | CS |
| 0010 | 1030 | Patient’s Weight | 患者体重 | DS |
| 0010 | 21C0 | Pregnancy Status | 怀孕状态 | US |
| Group | Element |
|
| 数据类型(VR) |
|---|---|---|---|---|
| 0008 | 0050 | Accession Number: A RIS generated number that identifies order for the Study. | 检查号: RIS的生成序号,用以标识做检查的次序 | SH |
| 0020 | 0010 | Study ID | 检查ID | SH |
| 0020 | 000D | Study Instance UID: Unique identifier for the Study. | 检查实例号: 不同检查的唯一标识号 | UI |
| 0008 | 0020 | Study Date: Date the Study started. | 检查日期: 检查开始的日期 | DA |
| 0008 | 0030 | Study Time: Time the Study started. | 检查时间: 检查开始的时间 | TM |
| 0008 | 0061 | Modalities in Study | 一个检查中含有的不同检查类型 | CS |
| 0008 | 0015 | Body Part Examined | 检查的部位 | CS |
| 0008 | 1030 | Study Description | 检查的描述 | LO |
| 0010 | 1010 | Patient’s Age | 做检查时刻的患者年龄,而不是此刻患者的真实年龄 | AS |
| Group | Element |
|
| 数据类型(VR) |
|---|---|---|---|---|
| 0020 | 0011 | Series Number: A number that identifies this Series. | 序列号: 识别不同检查的号码 | IS |
| 0020 | 000E | Series Instance UID: Unique identifier for the Series. | 序列实例号: 不同序列的唯一标识号 | UI |
| 0008 | 0060 | Modality | 检查模态(MRI/CT/CR/DR) | CS |
| 0008 | 103E | Series Description | 检查描述和说明 | LO |
| 0008 | 0021 | Series Date | 检查日期 | DA |
| 0008 | 0031 | Series Time | 检查时间 | TM |
| 0020 | 0032 | Image Position (Patient): The x,y and z coordinates of the upper left hand corner of the image,in mm. | 图像位置: 图像的左上角在空间坐标系中的x.y.z坐标,单位是毫米。如果在检查中,则指该序列中第一张影像左上角的坐标。 | DS |
| 0020 | 0037 | Image Orientation (Patient): The direction cosines of the first row and the first column with respect to the patient. | 图像方位 | DS |
| 0018 | 0050 | Slice Thickness: Nominal slice thickness,in mm. | 层厚 | DS |
| 0018 | 0088 | Spacing Between Slices | 层与层之间的间距,单位为mm | DS |
| 0020 | 1041 | Slice Location: Relative position of exposure expressed in mm. | 实际的相对位置,单位为mm | DS |
| 0018 | 0023 | MR Acquisition | CS | |
| 0018 | 0015 | Body Part Examined | 身体部位 | CS |
| Group | Element |
|
| 数据类型(VR) |
|---|---|---|---|---|
| 0008 | 0008 | Image Type: Image identification characteristics. | CS | |
| 0008 | 0018 | SOP Instance UID | SOP实例UID | |
| 0008 | 0023 | Content Date: The date the image pixel data creation started. | 影像拍摄日期 | DA |
| 0008 | 0033 | Content Time | 影像拍摄时间 | TM |
| 0020 | 0013 | Image/Instance Number: A number that identifies this image. | 图像码: 识别图像的号码 | IS |
| 0028 | 0002 | Samples Per Pixel: Number of samples (planes) in this image. | 图像采样率 | US |
| 0028 | 0004 | Photometric Interpretation: Specifies the intended interpretation of the pixel data. | 光度计解释: 对于CT图像,用两个枚举值MONOCHROME1,MONOCHROME2 用来判断图像是否是彩色的; MONOCHROME 1/2是灰度图,RGB则是真彩色图 | CS |
| 0028 | 0010 | Rows : Number of rows in the image. | 图像的总行数,行分辨率 | US |
| 0028 | 0011 | Columns : Number of columns in the image. | 图像的总列数,列分辨率 | US |
| 0028 | 0030 | Pixel Spacing: Physical distance in the patient between the center of each pixel. | 像素间距: 像素中心之间的物理间距 | DS |
| 0028 | 0100 | Bits Allocated: Number of bits allocated for each pixel sample.Each sample shall have the same number of bits allocated. | 分配的位数: 存储每一个像素值时分配的位数,每一个样本该值相同 | US |
| 0028 | 0101 | Bits Stored: Number of bits stored for each pixel sample.Each sample shall have the same number of bits stored. | 存储的位数:有12到16列举值 存储每一个像素用的位数,每一个样本该值相同 | US |
| 0028 | 0102 | High Bit: Most significant bit for pixel sample data. Each sample shall have the same high bit. | 高位 | US |
| 0028 | 0103 | Pixel Representation: Data representation of the pixel samples. Each sample shall have the same pixel representation. Enum:0000H=unsigned integer,0001H=2’ s complement. | 像素数据的表现类型: 一个枚举值,分别为十六进制数0000和0001. 0000H = 无符号整型, 0001H = 2的补码 | US |
| 0028 | 1050 | Window Center | 窗位 | DS |
| 0028 | 1051 | Window Width | 窗宽 | DS |
| 0028 | 1052 | Rescale Intercept: The value b in relationship between stored values(SV) and the output units. Output units = m*SV + b. Required if Modality LUT Sequence(0028, 0030) is not present. | 截距: 如果表明不同模态的LUT颜色对应表不存在时,则使用方程: Units = m*SV + b,计算真实的像素值到呈现像素值,其中截距为表达式中的b | DS |
| 0028 | 1053 | Rescale Slope: m in the equation specified by Rescale Intercept(0028, 1052). Required if Rescale Intercept is present. | 斜率: 该值为表达式中的m | DS |
| 0028 | 1054 | Rescale Type: Specifies the output units of Rescale Slope (0028,1053) and Rescale Intercept (0028,1052). Enum: US=Unspecified Requried if Photometric Interpretation is MONOCHROME2, and Bits Stored is greater than 1. This specifies an identity Modality LUT transformation. | 输出值的单位: 该值是一个枚举值 | LO |
VR是DICOM标准中用来描述数据类型的,总共有27个值。
|
|
| 允许字符 | 数据长度 |
|---|---|---|---|
| CS - Code String 代码字符串 | 开头结尾可以有没有意义的空格的字符串,比如 “CD123_4" | 大写字母,0-9,空格以及下划线字符 | 最多16个字符 |
| SH - Short String 短字符串 | 短字符串,比如:电话号码, ID 等 | 最多16个字符 | |
| LO - Long String 长字符串 | 一个字符串,可能在开头、结尾填有空格。比如 “Introduction to DICOM” | 最多64个字符 | |
| ST - Short Text 短文本 | 可能包含一个或多个段落的字符串 | 最多1024个字符 | |
| LT - Long Text 长文本 | 可能包含一个或多个段落的字符串,与 LO 相同,但可以更长 | 最多10240个字符 | |
| UT - Unlimited Text 无限制文本 | 包含一个或多个段落的字符串,与 LT 类似 | 最多(232 -2)个字符 | |
| AE - Application Entity 应用实体 | 标识一个设备的名称的字符串,开头和结尾可以有无意义的字符。比如 “MyPCO 1” | 最多16个字符 | |
| PN - Person Name 病人姓名 | 有插入符号 (^) 作为姓名分隔符的病人姓名。比如 “SMITH^JOHN” “Morrison Jones Susan^^^Ph.D,Chief Executive Officer” | 最多64个字符 | |
| UI - Unique Identifier(UID) 唯一标识符 | 一个用作唯一标识各类项目的包含UID的字符串。比如 “1.2.840.10008.1.1” | 0-9和半角句号 (.) | 最多64个字符 |
| DA - Date 日期 | 格式为 YYYYMMDD 的字符串;YYYY 代表年;MM 代表月;DD 代表日。比如 “20050822” 表示 2005 年 8 月 22 日 | 0-9 | 8个字符 |
| TM - Time 时间 | 格式为 HHMMSS.FRAC 的字符串。 HH 表示小时(范围"00"-“23”); MM 表示分钟 (范围"00"-“59”); 而 FRAC 包含秒的小数部分,即百万分之一秒, 比如 “183200.00” 表示下午 6:32 | 0-9和半角句号 (.) | 最多16个字符 |
| DT - Date Time 日期时间 | 格式为 YYYYMMDDHHMMSS.FFFFFF,串联的日期时间字符串。 字符串的各部分从左至右是:年-YYYY;月-MM;日-DD;小时-HH;分钟-MM;秒-SS;秒的小数-FFFFFF。 比如 “20050812183000.00” 表示 2005 年 8 月 12 日 下午 18 点 30 分 00 秒 | 0-9,加号,减号和半角句号 | 最多26个字符 |
| AS - Age String 年龄字符串 | 符合以下格式的字符串:nnnD,nnnW,nnnM,nnnY;其中 nnn 对于 D 来说表示天数,对于 W 来说表示周数,对于 M 来说表示月数,对于 Y 来说表示岁数。比如 “018M” 表示他的年龄是 18 个月 | 0-9,D,W,M,Y | 4个字符 |
| IS - Integer String 整型字符串 | 表示一个整型数字的字符串,比如 “-1234567” | 0-9,加号 (+),减号 (-) | 最多12个字符 |
| DS - Decimal String 小数字符串 | 表示定点小数和浮点小数,比如 “12345.67”, “-5.0e3” | 0-9, 加号 (+), 减号 (-), 最多16个字符 E, e 和半角句号(.) | 最多16个字符 |
| SS - Signed Short 有符号短型 | 符号型二进制整数,长度 16 bits | 2个字符 | |
| US - Unsigned Short 无符号短型 | 无符号二进制整数,长度 16 bits | 2个字符 | |
| SL - Signed Long 有符号长型 | 有符号二进制整数 | 4个字符 | |
| UL - Unsigned Long 无符号长型 | 无符号二进制长整数,长度 32 bits | 4个字符 | |
| AT - Attribute Tag 属性标签 | 16 bits 无符号整数的有序对,数据元素的标签 | 4个字符 | |
| FL - Floating Single 单精度浮点型 | 单精度二进制浮点数 | 4个字符 | |
| FD - Floating Point Double 双精度二进制浮点型 | 双精度二进制浮点数 | 8个字符 | |
| OB - Other Byte String 其它字节字符串 | 字节的字符串("其它"表示没有在VR中定义的内容) | ||
| OW - Other Word String 其它单词字符串 | 16 bits(2字节) 单词字符串 | ||
| OF - Other Float String 其它浮点字符串 | 32 bits(4个字节) 浮点单词字符串 | ||
| SQ - Sequence Items 条目序列 | 条目的序列 | ||
| UN - Unknown 未知 | 字节的字符串,其中内容的编码方式是未知的 |
参考:
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta