基于深度学习的医疗图像预分类平台开发与实现

Jonesy

发布日期: 2018-10-03 22:33:13 浏览量: 507
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

摘 要

本文课题设计是基于深度学习中支持向量机算法的医疗图像预分类平台的开发与实现。现阶段,医疗图像中病情的确认都由医生进行判定,从效率方面来讲,人工判断的效率远远小于使用机器学习判断医疗图像中病情的效率,因此,本文课题设计旨在设计实现算法将医疗图像进行分类,产生新的符合机器进行判断的医疗图像。配合使用深度学习中的卷积神经网络经过训练对医疗图像进行一定程度的解读,用来辅助或代替医生诊断病情。使用机器进行病情的判断可以辅助医生判断病情,大大减少医生的工作量,解放生产力。

在实现分类医疗图像的算法过程中,核心是机器学习中的支持向量机算法,开发环境是python环境。由于dicom格式是医疗图像标准格式,因此实现算法的第一步是对dicom格式医疗图像文件进行读取解析,使用python中的第三方模块pydicom模块进行读取解析。读取文件之后需要将数据进行一系列操作转换成可用于分类器分类的格式,本文课题设计中使用opencv模块对数据进行处理,首先进行图像的截取,之后进行灰度化处理、二值化处理,将格式转化为可用于分类的格式。紧接着进行核心操作,即使用分类器进行分类,使用python第三方模块中的libsvm模块对训练集数据进行训练,训练出分类器模型,之后使用训练好的模型对数据进行预测,得出预测的结果。将图像数据分类后,需要进行判断,将正确的分类的图像数据保存到固定的位置,生成新的png格式图像以便于后续的再次使用,这将生产最后的结果,使用python第三方模块中的opencv模块。

本文课题设计的最终结果将会产生新的png格式的医疗图像,生成的新医疗图像是直接截取原始图像的病情部位,去除大量无用信息,实现原始dicom格式医疗图像的有用信息分类转化为易于操作的png格式图像,生成的新医疗图像将被应用到卷积神经网络解读医疗图像病情方面,最终实现病情解读判断效率的大幅度提升,解放生产力。最后会对对程序进行展开分析,展示了程序的设计思路、功能流程及其实现的逻辑,结合程序的源码部分展开描述。

关键词:深度学习,支持向量机,dicom,pydicom,libsvm

ABSTRACT

The design of this paper is based on the development and implementation of medical image pre-classification platform based on support vector machine algorithm in depth learning. At present, the confirmation of the condition in the medical image is determined by the doctor. In terms of efficiency, the efficiency of manual judgment is far less than that of using the machine to judge the condition of the medical image. Therefore, the purpose of this paper is to design and implement the algorithm. Medical images are classified, resulting in new medical images that meet the machine’s judgment. Conjugate the use of deep learning in the convolution of the neural network through training to conduct a certain degree of interpretation of medical images to assist or replace the doctor to diagnose the condition. The use of the machine to determine the condition can help the doctor to determine the condition, greatly reducing the work load of doctors, the liberation of productivity.

In the process of implementing the classification of medical images, the core is the support vector machine algorithm in machine learning, and the development environment is python environment. Since the dicom format is the standard format for medical images, the first step in implementing the algorithm is to read the dicom format medical image file and use the third-party module pydicom module in python for reading and parsing. After reading the file, you need to convert the data into a series of operations that can be used in the classification of the classifier. In this paper, the opencv module is used to process the data. The image is taken first, then the gray scale is processed and binarized , The format into a format can be used for classification.Followed by the core operation, that is, using the classifier to classify, use the libsvm module in the python third party module to train the training set data, train the classifier model, and then use the trained model to predict the data, result. After sorting the image data, it is necessary to make a judgment,save the correct sorted image data to a fixed location, generate a new png format image for subsequent re-use, which will produce the final result using python in the third party module Opencv module.

The final result of the design of this topic will produce a new png-style medical image, the new medical image generated is a direct removal of the original image of the disease site, remove a large number of useless information to achieve the original dicom format medical image useful information into easy to operate The png format image, the generated new medical image will be applied to the convolution of the neural network to read the medical image of the disease, the ultimate realization of disease interpretation to determine the efficiency of a substantial increase in the liberation of productivity.Finally, the program will be carried out on the analysis, showing the program design ideas, functional processes and the realization of the logic, combined with the source part of the program to start description.

Key words:deep learning, support vector machine, dicom, pydicom, libsvm

1 绪论

本章旨在说明基于深度学习的医疗图像预分类平台的研究目的、研究背景,以及发展现状和对该平台的研究意义。

1.1 基于深度学习的医疗图像预分类平台

未来的时代是人工智能的时代。人工智能的核心是机器学习,更确切的说,深度学习是人工智能的灵魂。所以研究深度学习和机器学习是有意义的。在互联网时代与大数据时代,机器学习是一门难以避开的学科,任何通过数据进行训练的学习型算法研究都属于机器学习。机器学习涉及许多学科,如概率论、统计学等。机器学习研究的是机器怎样模拟人类,并实现人类的学习行为。机器学习是人工智能的核心,计算机的智能化确切来说离不开机器学习方面的内容。机器学习算法种类较多,适用于不同的场景,例如线性回归、K均值(K-means,基于原型的目标函数聚类方法)、决策树、随机森林、支持向量机(SVM)以及人工神经网络(ANN)等一些算法。

本次课题设计是开发基于深度学习的医疗图像预分类平台。医疗图像病情的解读从技术角度来讲是可以用机器识别辅助或者代替人工识别,现阶段深度学习中的卷积神经网络技术可以很好的完成这一点,而使用卷积神经网络进行识别需要对图像数据进行一定的格式转化、分类及去噪处理。医疗图像预分类平台就是基于该信息点出发,对原始医疗图像进行去噪处理、分类器分类,产生新的医疗图像。而DICOM标准是医疗图像的规范,因此首先是对dicom格式医疗图像进行读取解析,该平台的核心点在于分类器的分类,由于支持向量机算法较为符合该平台对于分类的要求,因此分类器使用的是机器学习中的支持向量机算法作为分类器进行图像分类。

1.2 研究意义

本文课题设计是研究基于深度学习的医疗图像预分类平台,首先来分析医疗图像预分类的好处。自1985年DICOM(医学数字成像和通信)标准发布以来,被广泛用于放射医疗,心血管成像以及放射诊疗诊断设备,在我国DICOM是唯一被接受的医疗影响国际规范。而解读医疗图像在诊断时期很重要,病变基本都发生在体内,现阶段只能通过X射线、CT、核磁共振、超声等方式获取的扫描图像来判断病情。

现阶段,医学图像都由医生来进行解译,这需要医生具有一定的经验才能进行。使用计算机读取DICOM格式[6]图片数据,可以将图片进行截取等操作,并对截取后的图像数据通过机器学习中的支持向量机算法处理,由于医疗图片是属于线性不可分的,所以使用支持向量机的方法。支持向量机遇到线性不可分问题时,通过一个非线性映射p,将样本空间映射到一个高维乃至无穷维的特征空间中,也就是Hilber空间,使得原本的样本空间中的非线性可分的问题转化为特征空间的线性可分的问题。一般情况下,升维会增加计算的复杂性,甚至会引起“维数灾难”[2],支持向量机应用核函数[9]的展开定理,引入松弛变量[8],就不需要知道非线性映射的显式表达式,使得不增加计算的复杂性,在某种程度上避免了“维数灾难”。使用支持向量机算法作为分类器对截取后的图像进行分类,对正确分类的图像进行保存,产生新的png格式医疗图像,从而适用于深度学习进行处理。深度学习中的卷积神经网络经过训练可以对新生成的医疗图像进行一定程度的解读,用来辅助或代替医生诊断病情。

深度学习的方法在处理医学影像数据方面发展迅速,在可见的将来,随着万物互联而来的海量医疗数据甚至可以让深度学习中的卷积神经网络代替医生进行诊断。另外,本次课题设计的研究能够提高自己的学习能力,在发现问题、分析问题和解决问题方面能够有一定深层次的了解。同时,对现今仍然火热的机器学习的知识了解的更进一步,对模型的建立、算法的实现方面有了更深的掌握。

1.3 论文结构

在本篇基于深度学习的医疗图像预分类平台的论文中,第一章说明了医疗图像预分类平台是什么以及研究意义,第二章对图像预分类平台分析需求和可行性,第三章说明了医疗图像预分类平台中支持向量机的应用,第四章说明了医疗图像预分类平台开发的设计,第五章介绍了医疗图像预分类平台开发测试和调试。

2 医疗图像预分类平台需求分析

本章旨在说明开发医疗图像预分类平台的需求,并从经济、技术、运行、操作方面进行可行性分析。

2.1 医疗图像预分类平台的需求分析

本文课题设计是基于深度学习的医疗图像预分类平台和实现,该平台是对医疗图像进行预分类,而dicom格式在我国是唯一被接受的医疗国际规范,研究的基础数据就是dicom格式医疗图像,因此首先要做的就是对dicom格式医疗图像文件的读取。在功能、性能及系统环境方面有一定的要求:

功能需求:在上述内容中,首先要有批量导入和读取DICOM格式的图片信息功能,在这方面需要使用python中的pydicom第三方模块对dicom格式图像进行读取分析。之后需要有对图片进行截取,截取后返回新的图片,然后需要有将图片处理成libsvm输入格式的功能,在这方面opencv模块中的函数较为符合该需求。紧接着需要对图片使用libsvm进行分类,最后对有用的图片进行保存功能。

性能需求:由于程序使用python中的libsvm库,需要大量的数据进行训练,同样需要大量数据进行预测分类,还需要对图像进行截取、灰度转化、二值化等操作,因此需要对数据进行处理时考虑到速度因素。

环境需求:硬件需要一台笔记本电脑,系统环境需要Ubuntu,开发环境需要python,python中需要有libsvm、pydicom、opencv等第三方模块,spyder较为符合作为开发工具。

现阶段,病人的医疗图像基本都是由医生进行诊断,使得医生的工作量过大,另外,其效率也并不是很高。而通过计算机将病人的医疗图像批量导入,深度学习中的卷积神经网络经过训练可以批量对医疗图像进行一定程度的解读,用来辅助或代替医生诊断病情。在使用深度学习中的卷积神经网络过程中,如果直接使用医疗设备拍出的医疗图像,由于图像中的噪音过大,无用信息过多,因此需要进行预分类处理。本文课题设计中,主要是对颈动脉血管进行分析处理,因此除颈动脉血管的横截面和纵截面外的其他图像都是属于无用的医疗图像,因此需要首先对批量导入的进行分类,分为有用图像的横截面、纵截面和无用图像,然后将有用的图像中的噪音切除,最后保存的图像中噪音大大减少。

2.2 医疗图像预分类平台的可行性分析

医疗图像处理是现代医学的重要手段之一,DICOM是部署最为广泛的医疗图像信息标准之一,医疗图像预分类平台将DICOM格式的医疗图像读取,并进行截取、分类操作后保存成新的图像。深度学习中的卷积神经网络对新的图像读取,之后运行在训练好的模型中并得出结果,对结果进行判断就可以了解图像中的部分是否发生病变。下文中,本文主要从经济可行性、技术可行性、运行可行性、和操作可行性等方面对医疗图像预分类平台进行分析。

2.1.1 经济可行性

开发医疗图像预分类平台所需要的相关资料可以通过互联网进行查询,也可以通过文献资料进行查询。开发该平台所需要的ubuntu系统可以从网上免费下载,python2.7环境以及libsvm、pydicom、opencv模块都是开源的资源,硬件只需要一台普通笔记本电脑,都易于获取,所需要的开发工具spyder也可以免费下载,无需其他特殊付费软件,开发成本低,简单易实现,从经济角度来看开发该程序经济具有可行性。

2.1.2 技术可行性

在医疗图像预分类平台中,医疗DICOM格式标准图像,在python中有对应的pydicom模块能够对其进行读取、分析、写入,可以对隐私信息进行读取,简单易使用;而opencv模块安装之后,使用简单,读取普通图片,只需要简单的调用函数就可以实现功能,较难的部分也已封装,简单的调用即可;台湾林智仁教授开发的libsvm第三方模块相比于普通的SVM来说,大大减少了难度,操作性强。因此,从技术角度来说,开发医疗图像预分类平台是具有可行性的。

2.1.3 运行可行性

运行性是整体组织结构产生的结果。该程序分为四个文件,但只需要在主函数中调用main函数,并输入相应的路径就可以与运行,只需安装好python2.7的开发环境,并将pydicom、opencv和libsvm模块安装在python中即可。因此,从运行角度来看,开发医疗图像预分类平台是可行的。

2.1.4 操作可行性

开发所采用的工具是spyder,开发出的程序可以在任何配置好环境了的计算机上运行,以console的形式展现运行过程及运行结果,将结果保存在固定位置,以显示器未输出,用户不需要关心运行过程,只看运行结果以及保存后的新图像文件,简单易使用。所以,该程序在操作上具有可行性。

2.3 小结

本章对医疗图像预分类平台分析需求,并从经济、技术、运行、操作等方面说明了该平台的可行性。

3 医疗图像预分类中支持向量机的应用

医疗图像预分类平台核心是分类器,而分类器算法为支持向量机算法,配合python读取dicom格式图像文件及opencv模块实现图像的去噪,形成医疗图像预分类平台。本章旨在说明支持向量机算法应用及配套应用。

3.1 支持向量机的介绍

基于深度学习的医疗图像预分类平台的核心是分类器,分类器的核心算法是支持向量机算法。通俗来讲,它是一种二类分类模型,基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终转化为凸二次规划问题的求解。

对于线性分类问题,线性分类支持向量机是一种非常有效的方法。但是,大多数情况下分类问题是非线性的,这是可以使用非线性支持向量机,主要特点是引入了核技巧。非线性问题往往不好求解,如果用解线性分类的问题的方法来解决,就比较容易了。事实上,确实是这样的,进行非线性变换时分为两步:首先使用一个变化将原空间中的数据映射到新的空间;然后在新空间中用线性分类学习方法从训练数据中学习分类模型。这就是核技巧。

核技巧的想法是在学习与预测中只定义核函数K(x, z),而不显示的定义映射函数。常用的核函数有多项式核函数、高斯核函数、字符串核函数等,适用于不同的场景。

支持向量机原理图如图3-1,支持向量机工作流程图如图3-2。


3.2 医疗图像标准dicom协议简介

基于深度学习的医疗图像预分类平台的基础数据保存在DICOM格式医疗图像文件中,因此首先需要对DICOM格式医疗图像文件进行读取解析。医学数字成像和通信,缩写为DICOM,是医学图像和相关信息的国际标准。它定义了质量能满足临床需要的可用于数据交换的医学图像格式,被广泛用于放射医疗。DICOM标准的推出与实现,推动了远程放射学系统、图像管理与通信系统的研究与发展。在我国,DICOM是唯一被接受的医疗影像国际规范。
在DICOM中,使用了对应的资料结构信息进行详述,定义了Patient,Study,Series,Image等4层来存储信息。DICOM将每个影像文件包裹成一个物件IOD,而一个IOD可以被分为像素数据和影像资料,前者通过描述图像中的每个点的值来组合一个医学图像,后者则是包含了病人资料信息。DICOM存储格式如图3-3。

DICOM3.0支持在网络环境中使用标准的网络协议的操作,如OSI和TCP/IP。DICOM是定义在ISO/OSI七层结构中的最高三层,底层部分同样符合TCP/IP结构。

3.3 python中处理图像模块简介

基于深度学习的医疗图像预分类平台首先需要获取DICOM格式图像数据,之后需要对图像数据进行去噪截取、灰度转化、二值化处理、格式转化、分类器分类等过程,最后生成新的医疗图像。使用的python开发语言环境容易安装,python是比较好用和强大的语言,python的强大之处主要体现在它的第三方模块的多样性,在处理图像方面,有多个模块可以支持。在处理DICOM格式医疗图像方面,本文课题设计主要使用pydicom模块;在处理图像方面,本文主要采用了opencv模块;在图像分类方面,本文主要采用了libsvm模块。下文中,将展开对这几个模块的详细说明。

3.1.1 pydicom模块简介

pydicom是一个处理DICOM文件的python软件包,它可以通过非常容易的“Pythonic”方式对DICOM格式进行提取和修改,修改后的数据还可以生成新的DICOM文件。Pydicom是一个纯python语言的包,只要安装了Numpy模块,就可以在Python解释器下任何平台上运行。但是pydicom有其局限性,局限性在于无法处理压缩像素图像以及无法处理分帧动画图像。虽然pydicom有着一些局限性,但依然是非常有用的python模块。

Python中的pydicom模块在操作性方面非常简单。首先需要导入pydicom模块,由于pydicom0.9.9之前都是dicom,1.0之后为pydicom,而这里所用的是dicom。dicom读取文件后的格式如图3-4。

pydicom模块与其他一些图像显示模块配合起来,将会达到更好的展示效果,诸如matplotlib、PIL、pylab等一些模块。有时候还需要将修改后的dicom数据保存成新的文件,或者写入新的文件,从操作性方面来说,不具有难度,简单易使用。

总体来说,纯python编写的pydicom模块大大减少了开发者的时间和精力,除了其局限性,在其余方面,pydicom是一个处理dicom格式文件的一个非常不错的模块。

3.1.2 opencv模块说明

opencv如今已经发布到了3.2的版本,但由于本文课题设计使用的是python2.7,网上的opencv2的资料相对多一些,因此,这里使用的是opencv2的版本。Opencv是英特尔开源计算机视觉库,由一系列C语言的函数和少量的C++的类构成,实现了图像处理的计算机视觉方面的很多通用的算法,拥有包括300多个C函数的跨平台的中、高层API,而且opencv不依赖于外部库,这就意味着,安装简单,不用考虑依赖关系。Opencv支持性较好,支持C++、C、python和java等语言,在操作系统方面,支持windows、linux、Mac OS、iOS和Android。

opencv目前只支持bmp、jpg、png、tiff等常用格式的读取,首先读取图像,创建一个窗口,在此窗口中显示图像,最后释放窗口。对于保存图像,操作非常简单,直接使用cv2.imwrite即可。

过滤是图像处理中的基本任务,可以移除噪音、提取感兴趣的可视特征、允许图像重采样等等。由于课题设计中要处理图像的噪音,这里介绍初级滤波操作,可以使用低通滤波器、高斯模糊、中值滤波等。低通滤波目标在于降低图像的变化率,是线性的;高斯模糊通过分配权重来重新计算周围点的值;中值滤波是非线性过滤器,在处理椒盐现象有比较大的作用。代码展示如下:

  1. result = cv2.blur(img, (5,5)) # 低通滤波
  2. gaussianResult = cv2.GaussianBlur(img, (5,5), 1.5) # 高斯模糊
  3. medianResult = cv2.medianBlur(img, 5) # 中值滤波

Sobel算子也是一种过滤器,优势在于它是带有方向的,使用的原理是极值处就是边缘。图像处理中轮廓检测业务也经常用到,使用cv2.findContours()函数可以很好的获得图像的轮廓。

3.1.3 libsvm模块说明

libsvm是台湾林智仁教授与2001年开发的支持向量机库,对数据进行分类或者回归非常方便,支持java、python、C、C++等开发语言。在python中使用,需要首先导入libsvm的库:

  1. from svmutil import *
  2. y, x = svm_read_problem(’train1.txt’) # 读入训练数据
  3. yt, xt = svm_read_problem(’test1.txt’) # 训练测试数据
  4. m = svm_train(y, x) # 训练
  5. svm_predict(yt, xt, m) # 测试

上述代码中同样给出了libsvm的基本操作,包括读取训练数据、训练测试数据、训练操作以及测试操作,这些操作基本都是直接调用libsvm的接口。

在libsvm的使用中,参数的选择依然非常重要,在训练和预测过程中,需要一系列参数来调整控制。

对于libsvm运行后的结果,同样要进行分析。#iter为迭代次数, nu 与前面的操作参数-n nu相同, obj为SVM文件转换为的二次规划求解得到的最小值, rho 为判决函数的常数项b, nSV 为支持向量个数, nBSV为边界上的支持向量个数,Total nSV为支持向量总个数。Libsvm运行后结果格式如图3-5。

总体来说,libsvm用法简单,操作方便,只需要调用接口就可以使用,对参数的调整是libsvm模块的重中之重,相比于原来的SVM,大大减少了其复杂度。

3.4 小结

本章对支持向量机进行了说明,并对医疗图像标准dicom协议以及python处理图像的一些模块进行了说明,主要对pydicom模块、opencv模块以及libsvm模块进行了说明。

4 医疗图像预分类平台开发的设计

本章旨在说明医疗图像预分类平台开发过程中的设计,以及各功能模块的说明及代码展示。

4.1 模块结构图

本医疗图像预分类平台是属于非桌面软件,是属于后台程序,直接将数据存储在文件夹中。在设计程序时,安装从前到后的顺序将数据进行传输。首先进行设计的是dicom格式医疗图像的读取,将数据读取之后转化成可用格式数据,再将图像二值化后截取有用部分,去除噪音,之后将数据转化成libsvm的输入格式进行分类,最后判断分类后的图像是否是可用图像,如果是,则将分类后的图像保存成PNG格式图像,否则将其舍弃。流程图如图4-1。

4.2 流程关系图

本次课题设计中程序的流程总体来说是非常简单的,基本上是两条线性结构,训练数据线性结构与预测数据线性结构形成一个十字交叉型的结构,不用考虑太多内容,需要考虑的是性能问题。本程序中的核心是libsvm的分类器对图像进行分类。

基本的流程是,首先将用于训练模型的dicom格式文件循环读取完毕,然后对数据进行格式转换,转换成libsvm分类器可用的格式,然后进行分类器的训练,将训练后的模型保存在文件中,这是第一条线性结构。然后读取用于预测的dicom格式文件循环读取,对图像进行去噪、截取等操作,将返回的数据进行转换,转化成libsvm分类器所用格式,直接调用保存好的模型,输入测试数据进行分类,最后判断分类后的图片是否是有用图片,如果是则保存图片,否则舍弃。

上述为主要的两条流程,是一个十字形的结构,按照先训练后预测的思路运行程序,在进行去噪过程中是先进行灰度转化,然后进行二值化处理,最后截取图像形成一个新的图像。

由于处理dicom格式的文件,在进行去噪处理和格式转化的过程中需要花费一定的时间,因此训练一次将花费大量时间,因此,本程序设计中编写了几个工具函数,存储训练后的模型至文件中以及从文件中读取模型等。流程关系图如图4-2。

4.3 功能设计及分析

由于本平台是对dicom医疗图像进行预分类的平台,处理的数据的基础是dicom格式文件,本平台主要是对颈动脉血管图像进行截取、处理、分类操作,由于使用的图像数据中既有颈动脉血管的横截面类型,也有纵截面类型,因此在分类器分类的类型中分类的颈动脉血管的横截面和纵截面类型都属于正确分类,下面将展示颈动脉血管图像,如图4-3。

4.3.1 读取dicom格式文件并使用opencv去噪

医疗图像预分类平台是基于深度学习的对dicom格式医疗图像进行分类的平台,由于医疗图像的格式文件基本上是存储成dicom格式的文件,因此本程序中需要有读取dicom格式文件数据的功能。本段程序中根据传入的文件路径,使用python中的pydicom第三方模块对dicom格式图像文件进行读取。本段代码中的读取dicom格式图像文件部分调用的是pydicom模块中的read_file函数接口,获取到一定格式的数据并存在dicom_data变量中。

将获取到的数据通过DicomtoRGB函数转化成RGB图像数据并存入image变量中,与此同时调用loadFileInformation函数获取隐私信息,之后调用opencv模块中的cvtColor函数将image进行灰度转化,即将图像RGB图像转化为灰度图。

将灰度图数据经过带有方向的Sobel算子过滤器过滤,之后转回uint8,再使用低通滤波将图像平滑化处理,处理后的结果保存在blurred变量中。将blurred变量调用opencv中的threshold函数进行二值化处理,调用opencv中的getStructuringElement函数定义矩形结构元素,调用opencv中的morphologyEx函数设定闭运算,然后进行形态学上的腐蚀操作和膨胀操作对图像进行处理,按照先腐蚀后膨胀的顺序进行操作最终检测图像中所需部分的轮廓,将轮廓进行绘制,之后进行截取,形成新的图像数据并返回。

本段代码功能的实现总共分为三个函数,分别是DicomtoRGB函数、yaxpb函数以及picSplitResize_dicom函数,yaxpb函数的作用是实现线性变换,DicomtoRGB函数的作用是将dicom格式转化为RGB格式,picSplitResize_dicom函数的作用是对图像进行去噪截取转化处理。

本段代码主要的作用就是对dicom格式图像进行读取、隐私信息提取和去噪截取操作,会返回截取后的图像数据。结果对比图如图4-4。

关键代码:

  1. def DicomtoRGB(self, dicomfile, bt, wt):
  2. '''将dicom图片文件转换成RGB'''
  3. #创建一个黑色空白图片
  4. image = np.zeros((dicomfile.Rows, dicomfile.Columns, 3), np.uint8)
  5. #获取图片的宽度和高度
  6. i=0
  7. j=0
  8. while i<dicomfile.Rows:
  9. j=0
  10. while j<dicomfile.Columns:
  11. #线性变换
  12. color = self.yaxpb(dicomfile.pixel_array[i][j],bt,wt)
  13. #同样的R,G,B的值获取灰度标度
  14. image[i][j] = (color,color,color)
  15. j=j+1
  16. i=i+1
  17. return image
  18. def yaxpb(self, pxvalue, bt, wt):
  19. '''线性变换'''
  20. if pxvalue < bt:
  21. y=0
  22. elif pxvalue > wt:
  23. y=255
  24. else:
  25. y=pxvalue*255/(wt-bt)-255*bt/(wt-bt)
  26. return y
  27. def picSplitResize_dicom(self, path):
  28. '''截取图片'''
  29. #image = cv2.imread(path)
  30. dicom_data = dicom.read_file(path)
  31. image=self.DicomtoRGB(dicom_data,bt=0,wt=2048)
  32. gim = GetInfomation()
  33. info = gim.loadFileInformation(dicom_data) #获取隐私信息
  34. gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #灰度转化
  35. #cv2.imshow('0', gray)
  36. #带有方向的过滤器
  37. gradX = cv2.Sobel(gray, ddepth=cv2.cv.CV_32F, dx=1, dy=0, ksize=-1)
  38. gradY = cv2.Sobel(gray, ddepth=cv2.cv.CV_32F, dx=0, dy=1, ksize=-1)
  39. gradient = cv2.subtract(gradX, gradY)
  40. gradient = cv2.convertScaleAbs(gradient) #转回uint8
  41. blurred = cv2.blur(gradient,(225,30)) #用低通滤波来平滑图像
  42. (_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY)#二值化
  43. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,77)) #OpenCV定义的结构元素
  44. closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) #闭运算
  45. closed = cv2.erode(closed, None, iterations=4) #腐蚀图像
  46. closed = cv2.dilate(closed, None, iterations=4) #膨胀图像
  47. (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #检测物体轮廓
  48. c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
  49. rect = cv2.minAreaRect(c)
  50. box = np.int0(cv2.cv.BoxPoints(rect))
  51. cv2.drawContours(image, [box], -1, (0, 255, 0), 3) #绘制轮廓
  52. Xs = [i[0] for i in box]
  53. Ys = [i[1] for i in box]
  54. Xs.remove(min(Xs))
  55. Xs.remove(max(Xs))
  56. Ys.remove(min(Ys))
  57. Ys.remove(max(Ys))
  58. x1 = min(Xs)
  59. x2 = max(Xs)
  60. y1 = min(Ys)
  61. y2 = max(Ys)
  62. hight = y2 - y1
  63. width = x2 - x1
  64. cropImg = image[y1:y1+hight, x1:x1+width]
  65. #cv2.imshow('test', cropImg)
  66. #cv2.waitKey(0)
  67. return cropImg

下面将展示上述代码运行前后的结果对比图如图4-4所示,左边图像为原始图像,即直接从dicom格式文件中读取到的图像,右边图像为去噪后图像,运行本段代码进行灰度转化、二值化处理并进行截取后的图像。

4.3.2 读取隐私信息

医疗图像预分类平台是对dicom格式医疗图像的读取解析以及获得正确分类的平台,由于诊断病情需要病人信息,而病人信息在dicom格式医疗图像中存储,因此解读dicom格式文件获取病人隐私信息。

在这段代码中,主要功能是获取病人隐私信息并存储在字典中返回。由于医疗图像是以dicom格式进行存储的,并且医疗图像中必须要存储病人的隐私信息和病情信息,因此在进行读取dicom格式文件时,需要同时将隐私信息读取进入程序,之后根据需求将病人隐私信息进行相应的操作。在本段代码中使用python的pydicom第三方模块读取dicom格式文件,主要使用read_file函数,并将数据存储在变量中。声明GetInfomation的对象,将数据传入对象中,并调用loadFileInformation函数。在该函数中,将dicom格式图像数据的PatientID、PatientName、PatientBirthDate、PatientSex、StudyID、StudyData、StudyTime、InstitutionName、Manufacturer及NumberOfFrames属性中的数据保存在information字典中,并返回字典值。

总体来讲,本段代码实现了读取病人隐私信息的功能,主要获取病人号(PatientID)、病人姓名(PatientName)、病人出生日期(PatientBirthDate)、病人性别(PatientSex)、StudyID、StudyDate、InstitutionName、Manufacturer、NumberOfFrames等方面。

关键代码:

  1. class GetInfomation():
  2. def loadFileInformation(ds):
  3. '''获取隐私信息'''
  4. information = {}
  5. information['PatientID'] = ds.PatientID
  6. information['PatientName'] = ds.PatientName
  7. information['PatientBirthDate'] = ds.PatientBirthDate
  8. information['PatientSex'] = ds.PatientSex
  9. information['StudyID'] = ds.StudyID
  10. information['StudyDate'] = ds.StudyDate
  11. information['StudyTime'] = ds.StudyTime
  12. information['InstitutionName'] = ds.InstitutionName
  13. information['Manufacturer'] = ds.Manufacturer
  14. information['NumberOfFrames'] = ds.NumberOfFrames
  15. return information

4.3.3 读取训练数据

医疗图像预分类平台本质上来讲,是机器学习的具体应用,是将医疗图像进行预分类的平台,获得正确分类的图像,而在机器学习中需要读取数据后进行后续操作,并且需要大量的数据以用于训练模型。

本次课题设计中使用的是机器学习中支持向量机的有监督学习算法,因此需要首先将所有训练数据读入内存中,机器学习进行训练时需要成百上千的数据,有甚者,需要几十万条数据才能进行训练,如果训练数据太少容易造成欠拟合现象,造成分类器不能正确分类的现象。

由于本次实验测试时使用的是png和jpg格式的图像,因此本程序设计中设计有两个函数分别是对dicom格式图像文件训练数据的读取和对普通格式图像文件的读取,首先将展示对dicom格式图像文件的读取代码。

在读取dicom格式图像文件的函数中,需要传入dicom格式图像文件所在的文件夹路径以及文件后缀名,将文件夹中所有文件的绝对路径存储在path_list_dcm_test列表中,然后将dicom文件路径存储在path_list_dcm列表中,最终调用picSplitResize函数以及resize函数将数据转化为可用于分类的格式,将每张图像的类型标记及图像数据分别存在train_labels和train_images列表中,并将值返回。

关键代码:

  1. def traindata_dicom(path_s, suffix):
  2. train_images = []
  3. train_labels = []
  4. path_list = []
  5. path_list_dcm_test = []
  6. path_list_dcm = []
  7. dt2d = DicomTo2Data()
  8. while os.path.isdir(path_s):
  9. for pa in os.listdir(path_s):
  10. if os.path.isdir(path_s+'/'+pa):
  11. path_list.append(path_s+'/'+pa)
  12. path_list_dcm_test.append(path_s+'/'+pa)
  13. if len(path_list) != 0:
  14. path_s = path_list[0]
  15. del path_list[0]
  16. else:
  17. path_s = ''
  18. for p in path_list_dcm_test:
  19. for info in os.listdir(p):
  20. if info[-4:] == '.dcm' or info[-4:] == '.DIC':
  21. path_list_dcm.append(p)
  22. break
  23. for path in path_list_dcm:
  24. for files in glob.glob(path + '/*.' + suffix):
  25. filepath,filename = os.path.split(files)
  26. if filename[-6:-4] != '-1':
  27. train_labels.append(1)
  28. else:
  29. train_labels.append(-1)
  30. pic = dt2d.picSplitResize(filepath + '/' + filename)
  31. picNew = resize(pic,(30,30))
  32. train_images.append(picNew[0])
  33. return train_images,train_labels

上述代码是对dicom格式图像文件训练数据的循环读取,并将训练数据调用picSplitResize函数进行灰度转化、二值化处理和格式转化,之后调用resize函数将转化后的数据进行归一化处理,最后返回正确格式的训练数据以及训练数据标签。由于在测试过程中的输入数据用png或jpg格式进行代替,能减少运行时间,下面将展示对普通png和jpg格式图像文件训练数据的读取。

对于png或jpg图像文件的的读取函数,只需要传入文件夹路径,由于传入的文件夹路径下存在三个文件夹,分别是错误的分类、颈动脉血管横截面及颈动脉血管纵截面,标记分别为-1、1、2。同样调用picSplitResize函数以及resize函数,最终将图像数据和图像标记存入train_images和train_labels列表中并返回值。

关键代码:

  1. def traindata(path_s):
  2. train_images = []
  3. train_labels = []
  4. path_list = []
  5. dt2d = DicomTo2Data()
  6. for pa in os.listdir(path_s):
  7. path_list.append(path_s+'/'+pa)
  8. for path in path_list:
  9. for files in glob.glob(path + '/*'):
  10. filepath,filename = os.path.split(files)
  11. if path.split('/')[-1] == 'negative':
  12. train_labels.append(-1)
  13. elif path.split('/')[-1] == 'positive':
  14. train_labels.append(1)
  15. elif path.split('/')[-1] == 'us_images':
  16. train_labels.append(2)
  17. pic = dt2d.picSplitResize(filepath + '/' + filename)
  18. picNew = resize(pic,(30,30))
  19. train_images.append(picNew[0])
  20. return train_images,train_labels

上述两段代码都有两个返回值,分别是train_images和train_labels列表,所代表的内容分别是训练图像数据和训练图像数据标签。

4.3.4 归一化图片

医疗图像预分类平台是首先对医疗图像进行一系列操作后,最终进行分类的平台。在对图像使用支持向量机分类器进行分类时,数据量较大,抵抗几何变换的攻击较弱,因此使用归一化处理,使图像能抵抗几何变换的攻击,同样可以找出图像中的那些不变量,将图像归为一个系列。

在本段程序中,循环对图像数组中的数据转化,首先调用Image模块中的fromarray函数将图像转化为Image对象,之后通过调用size接口获取到Image的大小,将图像放置在中间位置。通过调用Image模块中的new函数创建一张背景为黑色的图片,之后通过调用point函数加强黑白色彩,调用numpy模块中的array函数将数据转化为一维化,通过[float(x)/255 for x in imgResizeArray]代码将0-255之间的色彩数值转化为0-1之间的数值,最终图像数据被添加到picNew列表中并返回。

这段程序主要实现的是将图像进行归一化处理的功能,方便在后续的分类器中对图像进行分类操作。

关键代码:

  1. def resize(picArray,size):
  2. '''调整图片大小,先归一化图片,并把原图片放在中间,返回的数据格式 [[],[],.....]'''
  3. picNew = []
  4. for i in range(len(picArray)):
  5. imgPIL = Image.fromarray(picArray[i])
  6. h,w = imgPIL.size
  7. newH = w//2 - h//2 #把图片放在中间
  8. imgEmpty = Image.new('L',(w,w),0) #创建一张背景为黑色的图片
  9. imgEmpty.paste(imgPIL,(newH,0))
  10. imgResize = imgEmpty.resize(size,Image.ANTIALIAS)
  11. imgResize0255 = imgResize.point(lambda x: 255 if x > 10 else 0) #0是黑,255是白,黑白加强
  12. imgResizeArray = np.array(imgResize0255).flatten().tolist() #转换为一维
  13. imgResizeArraySmaller = [float(x)/255 for x in imgResizeArray] #把0-255转成0-1
  14. picNew.append(imgResizeArraySmaller)
  15. #imgResize0255.show()
  16. #imgResize0255.save('//home//pandas//workspace//gradution//' + str(i) + '.jpg')
  17. return picNew

4.3.5 使用opencv对图像进行处理

医疗图像预分类平台是对dicom格式图像进行读取解析分类的一个平台,核心是使用支持向量机算法对图像进行分类,使用python中的libsvm 第三方模块,由于libsvm输入格式有一定的要求,因此需要将图像数据转化为可输入的格式。

本段程序将图像数据转化为可用于分类器分类的数据输入格式,picSplitResize函数传入参数为image图像数据,首先调用opencv模块中的cvtColor函数进行灰度转化,将转化后的结果存储在gray变量中,之后调用opencv模块中的dilate和erode函数先膨胀后腐蚀,再进行腐蚀后膨胀,处理后的数据存储在dilated变量中。将dilated变量通过opencv中的medianBlur函数进行细化,然后调用opencv模块的findContours函数进行二值化处理并查找图像数据的轮廓。最后通过调用一个循环将数据转化为可用于分类器分类的输入格式,在循环中首先通过opencv中的formarray函数将array转化成cvmat,然后通过opencv中的GetImage函数将cvmat转化为iplimage,最终将iplimage转换成cvmat,再将cvmat转换成数组。

这段程序的主要功能在于格式转化,主要使用python中的opencv模块处理医疗图像,下面将本段程序的代码展示出来。

关键代码:

  1. def picSplitResize(self, image):
  2. '''分割影片尺寸大小'''
  3. #image = cv2.imread(path)
  4. #dicom_data = dicom.read_file(path)
  5. #image=self.DicomtoRGB(dicom_data,bt=0,wt=2048)
  6. #灰度转化
  7. gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
  8. #ret , bin = cv2.threshold(gray, 100,255, cv2.THRESH_BINARY)
  9. #cv2.imshow('2',gray)
  10. #膨胀后腐蚀
  11. dilated = cv2.dilate(gray, cv2.getStructuringElement(cv2.MORPH_RECT,(2, 2)))
  12. eroded = cv2.erode(dilated, cv2.getStructuringElement(cv2.MORPH_RECT,(2, 2)))
  13. #腐蚀后膨胀
  14. eroded = cv2.erode(eroded, cv2.getStructuringElement(cv2.MORPH_RECT,(2, 2)))
  15. dilated = cv2.dilate(eroded, cv2.getStructuringElement(cv2.MORPH_RECT,(2, 2)))
  16. #细化
  17. median = cv2.medianBlur(dilated, 3)
  18. median1 = cv2.medianBlur(dilated, 3)
  19. #轮廓查找,查找前必须转换成黑底白字
  20. contours, heirs = cv2.findContours(median1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
  21. #i = 0
  22. pic = []
  23. dictPic = {}
  24. for tours in contours:
  25. #rc[0] 表示图像左上角的纵坐标,rc[1] 表示图像左上角的横坐标,rc[2] 表示图像的宽度,rc[3] 表示图像的高度,
  26. rc = cv2.boundingRect(tours)
  27. #array转换成cvmat
  28. image1M = cv.fromarray(median)
  29. #cvmat转换成iplimage
  30. image1Ip = cv.GetImage(image1M)
  31. cv.SetImageROI(image1Ip,rc)
  32. imageCopy = cv.CreateImage((rc[2], rc[3]),cv2.IPL_DEPTH_8U, 1)
  33. cv.Copy(image1Ip,imageCopy)
  34. cv.ResetImageROI(image1Ip)
  35. #将iplimage转换成cvmat,然后将cvmat转换成数组,将图像左上角的纵坐标和图像的数组元素放到字典里
  36. dictPic[rc[0]] = np.asarray(cv.GetMat(imageCopy))
  37. pic.append(np.asarray(cv.GetMat(imageCopy)))
  38. #i = i+1
  39. sortedNum = sorted(dictPic.keys())
  40. for i in range(len(sortedNum)):
  41. pic[i] = dictPic[sortedNum[i]]
  42. #cv2.waitKey(0)
  43. return pic

4.3.6 使用libsvm进行训练并进行预测分类

医疗图像预分类平台是将dicom格式医疗图像读取解析之后,再通过机器学习中的支持向量机将医疗图像进行分类,而该平台中最核心的部分就是支持向量机算法分类器分类部分。

下面这段程序是所有代码程序中最重要、最核心的部分,其余部分代码都是这段代码的辅助。本次课题设计的核心其实就是分类,找出正确的医疗图像并进行去噪处理,在这段代码中,主要使用了libsvm的模块来实现支持向量机的分类操作。首先将训练数据、训练标签以及参数确定下来,通过libsvm函数中的svm_problem函数将训练标签和训练数据读入分类器,通过svm_parameter函数将参数确定,之后通过调用libsvm模块中的svm_train函数训练模型。之后先确定预测数据的标签,然后调用svm_predict函数对未知的图像数据进行预测,并将预测结果值返回

在这段函数代码中,参数需要训练数据、训练数据标签以及预测数据,首先要进行训练,训练出模型,然后使用训练好的模型对未知图像数据进行预测分类,代码如下。

关键代码:

  1. def predictPIC(train_images, train_labels, picdata):
  2. '''创建LibSVM分类器,返回值为识别出的内容'''
  3. prob = svm_problem(train_labels,train_images)
  4. param = svm_parameter('-s 0 -t 2 -c 1.2 -g 2.8')
  5. prob = svm_train(prob,param)
  6. labels = [1] * len(picdata)
  7. flag = svm_predict(labels,picdata,prob)
  8. return flag

下面将展示运行本段代码之后的结果图,本段代码是libsvm分类器对图像进行分类的的最后结果图,运行一个测试数据的分类结果图。#iter为迭代次数, nu 与前面的操作参数-n nu
相同,obj为SVM文件转换为的二次规划求解得到的最小值, rho 为判决函数的常数项b, nSV 为支持向量个数, nBSV为边界上的支持向量个数, Total nSV为支持向量总个数分类器分类结果图如图4-5。

4.3.7 保存新图像

医疗图像预分类平台最终的结果需要生成经过去噪处理的新医疗图像。

使用支持向量机分类器对预测图像进行分类后,还需要对图像进行最后一步操作,即将数据保存成png格式图像以便于后续操作。主要调用opencv模块的imwrite函数将最终分类的图像数据保存成png格式的图像文件,生成的新图像文件命名与原始图像文件命名相同,但保存在固定的文件位置。现将代码展示如下。

关键代码:

  1. def makePNG(self, image_info, file_name):
  2. res = cv2.resize(image_info, (255,255),interpolation = cv2.INTER_LINEAR)
  3. name = file_name.split('/')[-1][:-4]
  4. cv2.imwrite("/home/pandas/workspace/python/graduation/DICOM_IMAGE/error/"+name+'.png', res, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

4.4 医疗图像预分类平台开发方法

医疗图像预分类平台开发使用的是面向对象和结构化开发混合的开发方法,本次开发由于没有使用可视化开发技术,因此下面将不会对可视化开发技术进行介绍。

面向对象开发的方式是将真实的问题转化映射,映射到抽象对象空间,实际上,它是将现实世界中的事物进行模拟,主要是以大量的数据为中心,因而,面向对象开发方式较为稳定,程序中代码的重用性和可维护性比较好。

对于结构化开发方式来说,主要是按照功能进行开发,将功能进行分解开发,从上而下,最终实现需求的功能。以功能的划分为开发基础。总共分为以下几个阶段:划分功能范围、功能分析、功能设计、功能实现以及功能支持。

本程序中代码量相对比较少,因此主要是以类和函数混合的方式实现,从扩展性方面来讲,相对较好。

4.5 定义规范

作为一名开发者,需要有一定的开发规范,从而实习代码的可读性和简洁性。这不仅是了方便自己,更是为了培养出团队合作的基础,从此方面来讲,定义代码规范是非常重要的一点规则。

4.5.1 代码注释规范

1.函数注释

由于函数名的命名就是函数具体作用信息的英文单词组合,因此只有部分函数有注释信息,注释信息是使用’’’’’’的注释方式来注明函数的具体作用,如下:

  1. def makeOnePicture(file_name, train_images, train_labels):
  2. '''调用predictPIC函数进行预测并截取图片'''
  3. #info = loadFileInformation(dicom_file)
  4. dt2d = DicomTo2Data()
  5. image = dt2d.picSplitResize_dicom(file_name)
  6. pic = dt2d.picSplitResize(image)
  7. picdata = resize(pic,(30,30))
  8. result = predictPIC(train_images, train_labels, picdata)
  9. if result[0][0] == 1.0 or result[0][0] == 2.0:
  10. dt2d.makePNG(image, file_name)

2.类注释

类名的命名方式和函数名称命名的方式基本类似,因此也是部分类有注释信息,主要是说明类的作用信息,大部分类没有注释说明,主要是通过类中的属性函数进行注释。

3.语句注释

语句注释中有三种:第一种是对用于的测试语句的注释,在代码中可忽略不计;第二种是在代码的后面空四个空格然后使用“#”进行注释,用于说明该行代码中语句的作用;第三种是单独一行使用“#”进行注释,作用范围直至空行或下一个注释行之间,用于说明从注释行到空行之间所有代码的作用,示例如下:

  1. def resize(picArray,size):
  2. '''调整图片大小,先归一化图片,并把原图片放在中间,返回的数据格式 [[],[],.....]'''
  3. picNew = []
  4. for i in range(len(picArray)):
  5. imgPIL = Image.fromarray(picArray[i])
  6. h,w = imgPIL.size
  7. newH = w//2 - h//2 #把图片放在中间
  8. imgEmpty = Image.new('L',(w,w),0) #创建一张背景为黑色的图片
  9. imgEmpty.paste(imgPIL,(newH,0))
  10. imgResize = imgEmpty.resize(size,Image.ANTIALIAS)
  11. imgResize0255 = imgResize.point(lambda x: 255 if x > 10 else 0) #0是黑,255是白,黑白加强
  12. imgResizeArray = np.array(imgResize0255).flatten().tolist() #转换为一维
  13. imgResizeArraySmaller = [float(x)/255 for x in imgResizeArray] #把0-255转成0-1
  14. picNew.append(imgResizeArraySmaller)
  15. #imgResize0255.show()
  16. #imgResize0255.save('//home//pandas//workspace//gradution//' + str(i) + '.jpg')
  17. return picNew

4.5.2 代码命名规范

对于类名采用驼峰命名法,英文,有语义单词首字母全部需要大写,剩余有语义单词小写,从类作用方面命名,如:GetInfomation,意义是获取信息,即获取病人隐私信息。

对于函数命名采用驼峰命名法或者下划线命名法。驼峰命名法首个有语义单词首字母小写,其余有语义单词首字母大写,其余字母小写。命名法如:loadFileInformation、traindata_dicom。

对于变量,主要使用下划线命名法,从变量作用方面进行命名,如:train_images。

4.6 小结

本章主要对医疗图像预分类平台的设计进行了说明,首先展示了模块结构图和流程关系图,然后对代码中的每一块功能进行说明,之后说明了开发的方法,并说明了代码定义规范。

5 医疗图像预分类平台开发测试与调试

本章旨在说明医疗图像预分类平台开发中测试与调试过程,分别对程序调试和工具测试以及测试数据进行说明。

5.1 程序调试

在进行软件程序开发的过程中,难免会遇到各种各样的问题,不仅仅是常见的开发环境问题和语法问题,还有许多其它问题在实际开发过程中。在开发该程序中,采用模块化、结构化的开发方式,按照功能进行开发,同样按照功能进行测试,单独测试,便于检查出现问题时问题的来源。

在测试调试过程中,主要使用Spyder软件进行程序的开发和测试过程,使用该软件中的错误语法提示信息和单元测试运行后的结果以及打印语句对错误进行定位和显示。

5.2 工具的测试

5.2.1 测试的意义及目的

软件测试的目的,从本质上讲,是为了程序的有效可靠可运行性,比较软件最初的需求和在真实运行环境下的功能的差别,从而对差异之处进行一定程度的修正,以达到预期的功能和结果。

5.2.2 测试步骤

测试是有一定的方式、步骤以及技巧的。这段程序中不涉及与其他机器之间的操作,只是本机Ubuntu系统中的代码的运行,因此,在测试程序中只运用了手工测试、单元测试和系统测试的测试方法对系统的功能进行测试,以追求稳定可靠的程序。

首先要进行单元测试,对源代码中的每一个功能单元进行测试,基本要达到覆盖每一个类以及函数,最终组合起来,检查各个功能部分是否正确地实现了功能模块。

系统测试把经过确认的功能单元进行组合,纳入到实际运行的环境中,即Ubuntu系统中的python2.7开发环境中进行运行,将整个程序统一在系统中整体运行,查看结果的一种测试。

5.3 测试数据

在每一个功能单元完成后都会进行相应的分模块功能测试以确保该模块的正常运行,也同样是为了方便后续对功能进行整合。在对每一个功能单元进行测试时选择训练数据中的一部分进行测试,如在测试去噪功能、格式转化功能等,而对分类器进行测试时,需要使用的是所有训练数据以及部分预测数据等,在对dicom文件读取功能进行测试时,使用的是部分dicom数据。通过选择某些具有代表性的数据进行测试可以测试程序的健壮性,确保程序的良好运行。下面将本程序中选择主要功能所做的测试,并展示所出现的问题和解决方法,还有最终效果。

功能模块 测试方法 测试数据 测试出现过的问题 解决方法 结果
读取dicom文件、去噪 使用一个dicom文件作为输入数据, dicom文件 不能处理压缩过dicom文件 使用未压缩的dicom图像文件 可以读取并去噪
读取隐私信息 手动测试 dicom文件 有些隐私信息没有 读取关键隐私信息即可 正常
读取训练数据 输入路径循环读取数据 所有训练数据 正常
归一化图片 手动测试 一个图像数据 正常
opencv处理图像 对图像数据进行处理 图像数据 正常
libsvm训练预测分类 训练数据,预测数据 训练、预测数据 正常
保存新图像 分类后图像数据保存在固定位置 图像数据 正常

5.4 小结

本章主要说明了医疗图像预分类平台的测试和调试过程,主要从程序的调试、工具的测试以及测试数据方面进行了说明。

6 结论

医疗图像预分类平台采用python技术进行开发,使用了pydicom模块读取dicom格式图像文件,opencv模块对图像进行去噪和格式转换以及libsvm模块进行图像分类处理,最后保存成新图像,使用企业级规范开发。本程序代码已推送到github上,但是并未书写说明文档,仅仅是在代码中有注释。

本次基于深度学习的医疗图像预分类平台的输入数据是DICOM格式医疗图像文件,该平台对DICOM格式医疗图像读取后,进行去噪处理并进行截取,形成新的图像文件,然后将新的医疗图像文件进行格式转化,转化成可用于支持向量机输入的格式,之后将新格式的医疗图像数据通过支持向量机分类器进行分类,主要调用libsvm模块。最后对分类正确的图像数据进行保存操作,保存成PNG格式图像。以上就是该医疗图像预分类平台的功能作用。

参考文献

[1] Andrew Ng.Machine Learning[OL].2017.3 https://www.coursera.org/learn/machine-learning

[2] 李航.统计学习方法[M]. 北京:清华大学出版社, 2012.3

[3] TOBY SEGARAN.集体智慧编程[M]. 北京:电子工业出版社,2009.1

[4] [美]\ 哈林顿著 李锐等 译.机器学习实战[M]. 北京:人民邮电出版社,2013.6

[5] 林意,廖琴枝.基于无损水印的DICOM文件头信息篡改检测[J].计算机工程,2016:151-155,162.

[6] 龙华飞,唐月华,陈泓伶.PACS系统中DICOM医学图像格式解析[J].中国数字医学,2014: 29-31.

[7] 梁卫星,陈平平,张戈,徐洋洋.DICOM文件剖析及读取设计[J].现代计算机:普及版,2014:72-75.

[8] 王云英,阎满富.C-支持向量机及其改进[J].唐山师范学院学报,2012.

[9] 张立,王渊民.基于核函数的非线性支持向量机[J].科技展望,2017.

[10] LAROBINA M,MURINO L.Medical image file format FAQ[J].J Digit Imaging, 2014:200-206.

[11] Richard Curran,Nel Wognum,Milton Borsato,Josip Stjepandi&cacute, Wim J. C. Verhagen, Rodrigo Meira de Andrade,Anderson Luis Szejka,Osiris Canciglieri Junior.A Gingival Mucosa Geometric Modelling to Support Dental Pros thesis Design[M].IOS Press:2015.

[12] William Cheng-Chung Chu,Han-Chieh Chao, Stephen Jenn-Hwa Yang, Yu-Ann Chen,Pau-Choo Chung.Enhanced Local Support Vector Machine With Fast Cross-Validation Capability[M].IOS Press:2015.

[13] KhazendarS, Sayasneh A,Alassam H,et al.Automated characterisation of ultrasound images of ovarian tumours: the diagnostic accuracy of a support vector machine and image processing with a local binary pattern operator[J].2015:7-15.

[14] Ma Y,Wang L,Li L.A Parallel and Convergent Support Vector Machine Based on Map Reduce[M]//Computer Engineering and Networking.Springer International Publishing,2014:585-592.

[15] Sharifi M A, Souri A H.A hybrid LS-HE and LS-SVM model to predict time series of precipitable water vapor derived from GPS measurements[J].Arabian Journal of Geosciences,2015:7257-7272.

上传的附件 cloud_download 图像预分类平台-毕业设计.7z ( 1.32mb, 23次下载 )
error_outline 下载需要14点积分

keyboard_arrow_left上一篇 : 基于WIN32汇编实现的仿Windows计算器 基于Python与Node.js实现的医疗图像库在线存储与检索平台网站 : 下一篇keyboard_arrow_right



Jonesy
2018-10-03 22:34:07
在实现分类医疗图像的算法过程中,核心是机器学习中的支持向量机算法,开发环境是python环境

发送私信

如果这世界上真有奇迹,那只是努力的另一个名字

10
文章数
7
评论数
最近文章
eject