引言

  随着Ul(超声成像)、CT(计算机断层成像)、MRI(核磁共振成像)、CR(计算机X线成像)、电子内窥镜、盯(正电子发射断层成像)和MI(分子影像)等医学影像设备不断涌现,利用计算机对医学影像设备采集到的图像进行后处理的医学图像处理与分析技术也越来越成为放射科医生和临床医生进行疾病诊断的重要辅助手段。在医学图像的处理过程中医生经常需要频繁地变换窗宽、窗位来对感兴趣的病灶部位进行细致的研究,但传统的医学图像的显示方法不能达到实时显示图像的目的,图像的显示具有明显的迟滞现象,致使医生很多的时间浪费在等待影像的显示中,工作效率比较低,为此开发新的医学图像的显示算法来满足实际医生操作的需要有着重要的实际意义。本文从讨论DICOM格式的图像显示过程人手,分析了显示过程中的关键问题,提出了统一LUT的解决方法,并对的生成算法进行了改进。
  医学影像显示过程分析是美国放射学会和美国电器制造商协会组织指定的用于医学图像存储和传输的标准。目前几乎大部分的医学设备产生的医学图像都是采用这种格式。作为一种特殊的图像编码格式,通用图像浏览软件并不能直接显示,要显示DICOM格式的医学图像必须将原始图像数据经过一系列的转换才能得到可直接在显示设备上显示的数据(称之为P—Values)。DICOM医学图像显示转换过程如图1所示,需要经过Modality LUT、VOI LUT、Presentation LUT三个转换过程,最终输出的P Values才是可以直接显示的图像数据。
  Modality LUT转换(数据规范化转换通常不同生产厂商的设备很难保证在一种设备上生成的图像和其他生产厂商的同类型设备上生成的图像在度量上是一致的,为此就需要将不同设备厂家产生的图像的原始数据转换到一个标准的度量空间,转换就是完成这个功能的。医疗设备的生产厂商都会在自己的图像中采用DICOM标准规定的格式说明如何将自己的数据转换为标准图像数据,中规定可以使用通过查找表(Look Up Table,简称LUn查找和通过斜率/截距(RescaIe/转换两种方法中的一种。
  查找表方法(Modality LUT)是一种非线性变换算法。一个查找表由很多数据项组成,每一个数据项为相应原始数值转换后的数据值,同时还会提供一个被转换为查找表第一个数据项的原始数据的数据值。在进行数据转换时只要知道被转换为查找表第一项的原始数据,比原始数据大1的数据则转换为查找表第二项的值,比原始数据大2的数据转换后的数据则为查找表的第三项的值,依次类推直到查找表的最后一项。
  大于查找表能转换的最大的原始数据则转换为查找表的最后一项的值,小于查找表能转换的最小的原始数据则转换为查找表的第一项的值。用公式表示为:其中:M:规范化后的标准图像像素值,Fp:原始像素值,Fpmin:被转换为查找表第一项的原始数据,:LUT中的第一个数据项的值,Mp—pmin:
  中第Fp—Fpmin个数据项的值,Ecount:查找表的数据项个数。斜率/截足E(Rescale/Intercept)变换是一种线性变换,使用的公式是:标准图像像素值=原始图像像素值X斜率+截距,斜率和截距在DICOM文件中可以读取。通过这一步转换后图像像素就从设备有关变成设备无关了。
  VOl(Value Of Interest)LUT转换(感兴趣区转换由于医学图像数据动态范围大(像素深度通常不低于4096个灰度级),因此一般显示器很难提供如此高的动态范围一次显示整幅图像的全部信息细节,在图像的处理中一般都是先选择一个操作者感兴趣的区域,然后将该区域的图像信息映射到显示器能显示的整个数据范围,这样就增加了该区域的图像信息的对比度。这个过程DICOM标准中称之为感兴趣区简称VOI)LUT(Look Up Table)转换。临床医生感兴趣的窗宽、窗位调节功能就是VOI LUT转换的一种算法实现。VOI LUT转换可以使用设置窗宽、窗位的线性转换算法和通过查找查找表(LUT)转换的非线性算法两种算法中的一种且只能使用其中的一种,具体使用哪种算法在DICOM文件中有专门的标记来设置。
  窗宽、窗位线性转换算法是根据预知的窗宽和窗位值获得需要显示的窗口大小(窗宽)和中心位置(窗位),从而将窗口区域的图像数据线性地转换到显示器的最大范围内,高于或低于窗口上、下限的图像数据则分别设置为最高或最暗的显示值。用公式表示为:其中V:图像数据,G:显示器显示值,gm:显示器的最大显示值,W:窗宽,C:窗位。在这里窗宽是指需要显示图像的范围,调节窗宽主要影响对比度,窗宽越大图像灰度层次多,组织对比度减少,细节显示差,而窗位也称窗中心,表示显示区域的中心位置,例如骨骼的窗位(C)、窗宽(W)分别为C=400,,那么就可以利用调窗处理将窗宽调节到骨骼窗宽,窗位调节到骨骼的窗位,然后利用上面的公式将图像V换算成显示器显示值,最终得到的结果是只显示窗口范围内的图像,也就是骨骼。
  是一种查找表算法,算法处理过程同。
  Presentation LUT转换是对图像像素要做的最后一个变换,它用于特定图像的显示。这一模块转换完成后的输出值为P—Values,P-Values是独立于任何显示设备的特性曲线,与人的视觉反应近似相关的值,可直接作为已经校正的软拷贝设备或硬拷贝的输入。
  转换也有两种转换方法,一种是通过Presentation LUT进行转换的非线性转换方法,一种是通过Presentation Shape的转换方法,这两种转换方法只能使用一种。Presentation LUT转换的过程基本同上面介绍的两种LUT算法。
  算法使用INDENTITY和LIN OD两者中的一个。INDENTITY表示经过VOI LUT转换得来的数据值即P-Values值,不需要转换,一般图像的软拷贝使用这个值;LIN OD是实现图像的硬拷贝时使用的,在软件的开发中没有使用到就不讨论了。
  算法改进在图像后处理软件的开发过程中我们发现一幅图像从调入,到显示需要的时间比较长,而且医生在利用医学图像进行疾病诊断的过程中需要频繁地变换图像的窗宽、窗位来对感兴趣的区域进行仔细的研究,每次调窗处理后图像的显示具有明显的迟滞现象,达不到医生的临床诊断要求,为了能动态、实时地对图像进行调窗必须改进图像处理算法,缩短每次图像调窗处理时间。
  1使用统一的LUT算法通过分析图像显示过程,我们发现医学图像从原始数据到P—Val ues要经过Modality LUT、VOI LUT、三个处理步骤,而ModaliW LUT、又有线性变换和非线性变换两种算法,其中非线性变换算法是采用查找表的方法,这种方法相比线性变换算法来说的优点是变换效率高,而内存的占用会大些:而线性变换算法的优点是内存占用少,但算法效率不高,例以S12×512的一幅医学图像来说,每一次VOI LUT变换需要进行51 2×51 2次的浮点数乘除法运算,对实时性要求比较高的医学图像处理来说性能上是难以接受的,为此借鉴LUT的非线性处理方法考虑将线性处理算法改造成LUT算法,同时找出医生实际操作时频繁需要的调窗操作对应的窗宽、窗位提取出来,在图像装入的时候创建其相应的LUT,这样在医生进行调窗处理的时候不需要重新生成,直接从对应的LUT表中查表就可以了,这样可以大大提高图像的调窗处理时间,达到实时调窗的性能要求。在和医生沟通后我们发现这个想法是可行的,因为在进行疾病诊断中医生一般会根据医学图像的类型和检查的身体部位不同去查看几种典型的窗宽、窗位。例如在CT图像中医生频繁使用的是骨骼,W=2000),胸腔(C=50,W=350),肺部一600,W=1 500),腹部(C=45,W=250)等。而考虑到图像操作时只使用一次,可以将从原始像素规范化后的数据值保存在一个矩阵中,每次VOU LUT时只要直接使用这个矩阵中的值就可以了,不需要进行算法改造了;Presentation LUT的线性处理算法在软拷贝中只使用中的INDENTITY值也不需要算法改造:所以只需要改造VOI LUT的线性算法就可以了。
  分析Modality LUT、VOI LUT和发现DICOM标准的LUT是由多个数据项组成,第一个数据项保存的是第一个被转换的原始数据在查找表的对应值,第二个数据项为第一个被转换的数据项+1的原始数据项在查找表中的对应值,依次类推,其数学表示方法为:Y[O]=F(X0),Y[1-F(×O+1),,其中i的取值范围为【0一LUT数据项个数I,×0表示第一个被转换的原始数据。结合我们要实现的算法,要将线性算法改造成LUT算法首先必须计算出第一个被映射的原始数据的值,被映射的原始数据的个数(决定了要构造的LUT中数据项的个数),然后是构造LUT。考虑到经过VOI LUT转换后的灰度值最小为0,最大为2S5,灰度间隔为1,因此第一个被映射的原始数据的值为X0=C一0.5一(W一1)/2,数据项的个数为W,其中C为窗位,W为窗宽。
  LUT生成算法优化最简单的LUT生成算法是将取值范围在C—W/—C+W/2之间的的整数(DICOM中图像图像为整数使用VOI LUT转换中的线性算法公式进行计算后保存到LUT中。分析发现这个线性算法需要进行大量的浮点数的乘法和除法运算,是比较耗时间的,如果能对这个线性算法进行改进将能提高图像的处理效率。再看线性转换的公式:
  画直线的过程是一样的,因此可以使用计算机图形学中的直线扫描转换算法来对线性算法进行优化。直线扫描转换算法可以将大量的浮点数乘法、除法运算转换成加法和减法运算,提高运算效率。常用的直线扫描转换算法有数值微分(Digital differential analyzer,算、中点画线算法[sl、算法16~,其中以Bresenham算法效率最高,因此考虑使用Bresenham算法来生成LUT。
  改造后算法在系统设计时我们使用一个全局的链表来保存当前系统中设置了哪些窗宽、窗位的信息,链表中的每个结点保存的数据类型是—个结构体,结构体的定义如下:
  结语本文在分析DICOM医学图像显示过程的基础上,使用LUT来统一DICOM医学图像的处理过程,并对的生成算法进行了改进,并给出了具体的代码实现。实验证明改进效果明显,具有很好的实用价值。

DICOM医学图像显示算法改进与实现——LUT的更多相关文章

  1. DICOM医学图像窗口变换的加速算法

    详见:http://pan.baidu.com/s/1gfFLbJ9 DICOM医学图像窗口变换的加速算法* 张尤赛 ,陈福民 ( 同济大学计算中心, 上海 200092 ) (华东船舶工业学院电子与 ...

  2. Oracle 升级的必要性

    一.Oracle 历史 Oracle database 作为Oracle 公司的商业产品,凭借其稳定性和运行高效占据了全球三成以上的市场.并且主要是金融.政府等领域. Oracle 数据库拥有近40年 ...

  3. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    版权声明:本文为博主原创文章,转载请注明CSDN博客源地址! 共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/26404733   ...

  4. Oracle数据库的发展历程

    前言 1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Codd) 在 Communications of ACM 上发表了那篇著名的<大型共享数据库数据的关系模型& ...

  5. Oracle的发展历程

    我们学习的是ORACLE(甲骨文)公司(就是收购Sun公司的甲骨文公司)的Oracle数据库(Oracle Database).Oracle数据库是关系型数据库中的大型数据库,存储量大,而且也非常安全 ...

  6. 医学图像之DICOM格式解析

    最近导师给安排了新任务,由于刚进入实验室,对于医学图像这一块还一知半解,所以就想分享一下有关医学常见影像的学习(尤其是dicom后缀的图像文件),欢迎大家一起交流. 目录 1.医学影像学的介绍 2.D ...

  7. C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色

    在医生阅片确诊的过程中,当发线疑似病灶时在灰度显示下有时并不清晰,这时候就需要色彩增强效果来使灰度图像变为彩色图像. LUT可以简单的理解为0-255的颜色映射值,例如:彩虹编码,将其打包成LUT格式 ...

  8. DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

    背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...

  9. C#处理医学图像(一):基于Hessian矩阵的血管肺纹理骨骼增强对比

    在医院实际环境中,经常遇到有问题的患者,对于一些特殊的场景,比如骨折,肺结节,心脑血管问题 需要图像对比增强来更为清晰的显示病灶助于医生确诊,先看效果: 肺纹理增强: 肺结节增强: 血管对比增强: 骨 ...

随机推荐

  1. MySQL开启日志跟踪

    在开发过程中有时候会遇到sql相关的问题,但是有时候代码中不会直接看到真实的sql,想要看到mysql中实际执行的是什么sql,可以通过开启日志跟踪方式查看. 1 开启日志跟踪 SET GLOBAL ...

  2. a标签中javascript和void

    <body> <a href="javascript:;">点了无反应</a> <a href="javascript:void ...

  3. js 字符串加密

    加密: 1.获得要加密的字符串:var str=input.value; 2.转化: for(var i=0;i<str.length;i++){ str+=String.fromCharCod ...

  4. (转)ios 代码规范

    转自http://blog.csdn.net/pjk1129/article/details/45146955 引子 在看下面之前,大家自我检测一下自己写的代码是否规范,代码风格是否过于迥异阅读困难? ...

  5. include/autoconfig.mk

    把autoconfig.mk和/include/configs/ $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/commo ...

  6. cf886d Restoration of string

    明确几点 假设有串 ab,那么 a 后头必须是 b,b 前头必须是 a,否则就不是最频繁的了. 不可成环,aba是非法的. #include <iostream> #include < ...

  7. 【java基础 5】树形结构数据加载的思考

    前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...

  8. 机器学习实战之kNN算法

    机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.1 ...

  9. 怎么样给CentOS6.5增加swap分区

    再给服务器添加zabbix监控的时候,发现服务器有个报错“Lack of free swap space on localhost”,通过查找得知,在安装服务器的时候忘了划分swap分区.为了减少报错 ...

  10. 刷题总结——疫情控制(NOIP2012提高组)

    题目: 题目背景 NOIP2012 提高组 DAY2 试题. 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都 ...