一种将dicompyler的图像读取到C++图像类的方法与流程

文档序号:12463123阅读:1283来源:国知局

本发明属于计算机应用程序开发的领域,特别涉及一种将dicompyler的图像读取到C++图像类的方法。



背景技术:

目前,dicompyler是一个基于DICOM标准的可扩展的开源放射治疗研究开发工具包,同时它也是一个跨平台的DICOM RT阅读器。dicompyler是用Python开发的,其中使用了PIL(Python Imaging Library,Python图像库)来存储、显示DICOM RT的医学图像。

PIL提供了广泛的文件格式支持,高效的内部数据表示和相当强大的图像处理能力,再加上Python是一门语言简易、开发简单、跨平台性良好以及公用库多的编程语言,更重要的是Python的开发效率高,综合上述两个优势,dicompyler深受广大医学图像研究者的热爱。

但是,由于Python是一门解释型的语言,也就是说Python开发的功能模块没有经过编译的过程,各功能模块依赖于Python解释器而运行,所以Python功能模块的执行效率不高。为了提高程序的执行效率,可以选择将Python的功能模块嵌入到C++应用程序中,而这就延伸到了如何利用C++调用dicompyler功能模块,更进一步的是利用C++调用Python的PIL功能模块。

因此,需要提供一种将dicompyler的图像读取到C++图像类的方法,既提高了程序的开发效率,也保证了程序的执行效率,同时也缩短了应用程序的开发周期。



技术实现要素:

本发明的目的在于克服现有技术的缺点与不足,提供一种将dicompyler的图像读取到C++图像类的方法,其具有方法灵活、内存管理安全的优点。

为此,本发明采用如下方案:

一种将dicompyler的图像读取到C++图像类的方法,其包括以下步骤:

a、初始化连接器的连接参数;

b、初始化Python解释器,并加载精简后的dicompyler功能模块;

c、获取dicompyler功能模块的图像对象,并获取图像尺寸以及图像模式;

d、利用Python提供的C-API间接触发数据转换函数,将图像数据转换为字符串的形式,并得到经过封装的字符串对象;

e、利用上一步得到的字符串对象以及Python提供的参数解析函数,提取字符串对象的字符串数据,并将字符串数据读入到C/C++的内存数组中;

f、将内存数组的图像数据复制到C++的图像类里面,根据获取的图像尺寸设置图像类的尺寸大小,必要时根据图像模式设置颜色表,最终完成DICOM RT数据的读取。

优选的,所述的步骤a中,所述的连接参数就是清单依赖项(manifestdependency)的参数,包括连接器的类型、名称、版本处理器架构以及公匙的标记。

优选的,所述的步骤b中,精简后的dicompyler功能模块包括dicomparser、dvhdoses和dvhcalc三个模块,而加载dicompyler功能模块的步骤如下:

b1、执行初始化函数用以初始化Python解释器;

b2、判断Python解释器是否成功初始化,如果初始化失败,退出程序;否则,继续下面的步骤;

b3、执行模块加载函数用以加载功能模块,并得到该模块对象。

优选的,所述的步骤c中,获取dicompyler功能模块的图像对象的步骤如下:

c1、利用步骤b3得到的模块对象,提取其中的字典对象;

c2、利用步骤c1得到的字典对象,寻找自定义类的入口,得到一个类接口对象;

c3、实例化步骤c2得到的类接口对象,得到类实例对象;

c4、类实例对象执行图像获取函数即可得到图像对象。

优选的,所述的步骤d中,将图像数据转换为字符串的形式是通过步骤c4所得到的图像对象的tostring()函数实现的,该函数将数据封装到一个字符串对象中。tostring()函数内部实现步骤如下:

d1、根据字符串对象的数据成员以及图像数据的大小,申请一段大小足够的内存块;

d2、将数据复制到申请的内存块的数据区域。

优选的,所述的步骤e中,将字符串数据读入到C/C++的内存数组的步骤如下;

e1、声明一个指向字符类型的指针;

e2、结合步骤d所得到的字符串对象以及参数解析函数,解析字符串对象,解析完毕之后,步骤e1声明的指针就指向字符串对象的数据内存;

e3、申请一段大小足够的内存空间,将步骤e1声明的指针所指向的数据复制到该内存空间。

优选的,所述的步骤f中,所述的C++的图像类可以选用CImage、CBitmap或者QImage,设置深度值、颜色表等相关参数,以完成DICOM RT的数据读取。

本发明与现有技术相比,具有如下优点和有益效果:

本发明提出了一种利用C++读取dicompyler的图像对象的图像数据的方法,实现了利用dicompyler读取的DICOM RT医学图像与C++可执行程序在图像提取以及图像处理方面的交互,充分发挥了dicompyler对DICOM RT医学图像的充分支持,使得在程序开发过程中,既提高了程序的开发效率,也保证了程序的执行效率,同时也缩短了应用程序的开发周期。具有极大的实用性,适用于各种软件,尤其是医学图像处理软件开发的设备。

附图说明

图1是本发明的实现流程图。

具体实施方式

下面结合附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。

dicompyler除了包含DICOM RT数据读取模块外,还包含了其他辅助的用户界面功能模块,为了简化开发过程,必须对整个dicompyler功能模块进行简化,而简化的方式就是利用Python支持的面向对象的编程方式,构建出自定义模块,具体步骤如下:

1、保留dicompyler的三个核心模块,分别是DICOM RT解析模块dicomparser、剂量体积直方图模块dvhdoses以及剂量体积直方图计算模块dvhcalc;

2、在上述三个模块的基础上自定义名为Patient.pyc的功能模块,该模块里面自定义了名为Patient的类,该类就是图像数据转化的核心类,其中定义了获取图像、图像大小、图像模式等操作。

由于dicompyler功能模块使用了VS2008编译,为了能够成功加载dicompyler功能模块,必须在加载前设置清单依赖项(manifestdependency)的参数,具体参数为type='win32',name='Microsoft.VC90.CRT',version='9.0.21022.8',processorArchitecture='x86',publicKeyToken='1fc8b3b9a1e18e3b'。

为了利用C++加载自定义的功能模块,必须先调用Py_Initialize()函数初始化Python解释器,然后调用Py_IsInitialized()函数判断Python解释器是否成功初始化,如果初始化失败,则直接退出程序,否则,继续下面的步骤。

Python解释器成功初始化后,就要加载Patient.pyc功能模块和获取模块里面的图像对象实例,具体的步骤如下:

1、以"Patient"为参数调用PyImport_ImportModule()函数加载Patient.pyc模块,该函数返回对应的模块对象;

2、以步骤1得到的模块对象为参数调用PyModule_GetDict()函数,该函数返回描述模块对象内部包含的属性以及功能的字典对象;

3、以步骤2得到的字典对象和自定义的类名Patient为参数调用PyDict_GetItemString()函数,该函数返回类接口对象,该类接口对象是Patient.pyc功能模块自定义的类;

4、以步骤3得到的类接口对象和NULL为参数调用PyObject_CallObject()函数,该函数返回类实例对象;

5、以步骤4得到的类实例对象、"GetImage"字符串、"(i)"和0为参数调用PyObject_CallMethod()函数,该函数返回图像对象,其中的"GetImage"字符串就是自定义类内部的图像获取函数。

成功获取了图像对象后,首先要获取图像对象的尺寸以及模式以便设置C++图像类的参数,步骤如下:

1、利用图像对象和PyObject_GetAttrString()函数获取图像对象的尺寸属性,该尺寸属性是一个字符串对象,然后执行PyArg_Parse()函数解析字符串对象,即可获取图像对象的宽和高,利用获取的宽和高创建C++图像类实例;

2、利用图像对象和PyObject_GetAttrString()函数获取图像对象的模式属性,该模式属性是一个字符串对象,然后执行PyArg_Parse()函数解析字符串对象,即可获取图像对象的模式,如果模式为L,表明图像是单通道8bit的灰度图像,如果模式为RGB,表明图像是3通道24bit的图像;

接下来是关键的数据提取部分,以图像对象以及"tostring"字符串为参数调用PyObject_CallMethod()函数,该步骤的作用是间接触发图像对象的tostring()函数,也就是将数据图像转换为字符串的形式,从而得到字符串对象,因为图像数据以及字符串数据在计算机内存里面的取值范围都是[0,255],所以这种转换是可行的,更重要的是Python本身提供与C/C++交互的字符串处理函数。tostring()函数内部实现步骤如下:

1、根据字符串对象的数据成员以及图像数据的大小,申请一段大小足够的内存块;

2、将数据复制到申请的内存块的数据区域。

由于所得到的字符串对象是经过封装后的数据结构,将字符串对象中的字符串数据提取并读入到C/C++的内存数组的步骤如下;

1、声明一个指向字符类型的指针;

2、结合上述所得到的字符串对象以及参数解析函数,解析字符串对象,解析完毕之后,上述步骤声明的指针就指向字符串对象的数据内存;

3、申请一段大小足够的内存空间,将上述步骤声明的指针所指向的数据复制到该内存空间。

将图像数据读入到C/C++的内存后,C/C++应用程序即可操作这些数据,为了能够将最终的DICOM RT数据显示出来,可以选用CImage、CBitmap或者QImage等相关的图像类,并把上述读取出来的图像数据复制到图像类的数据空间。

以上所述,仅为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1