当前位置: 首页 > news >正文

基于支持向量机的医疗图像分类研究与实现

目 录
摘 要 I
ABSTRACT II
1 绪论 1
1.1 基于深度学习的医疗图像预分类平台 1
1.2 研究意义 1
1.3 论文结构 2
2 医疗图像预分类平台需求分析 3
2.1 医疗图像预分类平台的需求分析 3
2.2 医疗图像预分类平台的可行性分析 3
2.1.1 经济可行性 4
2.1.2 技术可行性 4
2.1.3 运行可行性 4
2.1.4 操作可行性 4
2.3 小结 4
3 医疗图像预分类中支持向量机的应用 5
3.1 支持向量机的介绍 5
3.2 医疗图像标准dicom协议简介 7
3.3 python中处理图像模块简介 7
3.1.1 pydicom模块简介 8
3.1.2 opencv模块说明 8
3.1.3 libsvm模块说明 9
3.4 小结 10
4 医疗图像预分类平台开发的设计 11
4.1 模块结构图 11
4.2 流程关系图 12
4.3 功能设计及分析 13
4.3.1 读取dicom格式文件并使用opencv去噪 14
4.3.2 读取隐私信息 18
4.3.3 读取训练数据 19
4.3.4 归一化图片 21
4.3.5 使用opencv对图像进行处理 22
4.3.6 使用libsvm进行训练并进行预测分类 24
4.3.7 保存新图像 25
4.4 医疗图像预分类平台开发方法 26
4.5 定义规范 26
4.5.1 代码注释规范 26
4.5.2 代码命名规范 28
4.6 小结 28
5 医疗图像预分类平台开发测试与调试 29
5.1 程序调试 29
5.2 工具的测试 29
5.2.1 测试的意义及目的 29
5.2.2 测试步骤 29
5.3 测试数据 29
5.4 小结 30
6 结论 31
致 谢 32
参 考 文 献 33
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的形式展现运行过程及运行结果,将结果保存在固定位置,以显示器未输出,用户不需要关心运行过程,本文转载自http://www.biyezuopin.vip/onews.asp?id=14559只看运行结果以及保存后的新图像文件,简单易使用。所以,该程序在操作上具有可行性。
2.3 小结
本章对医疗图像预分类平台分析需求,并从经济、技术、运行、操作等方面说明了该平台的可行性。
3 医疗图像预分类中支持向量机的应用
医疗图像预分类平台核心是分类器,而分类器算法为支持向量机算法,配合python读取dicom格式图像文件及opencv模块实现图像的去噪,形成医疗图像预分类平台。本章旨在说明支持向量机算法应用及配套应用。
3.1 支持向量机的介绍
基于深度学习的医疗图像预分类平台的核心是分类器,分类器的核心算法是支持向量机算法。通俗来讲,它是一种二类分类模型,基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终转化为凸二次规划问题的求解。
对于线性分类问题,线性分类支持向量机是一种非常有效的方法。但是,大多数情况下分类问题是非线性的,这是可以使用非线性支持向量机,主要特点是引入了核技巧。非线性问题往往不好求解,如果用解线性分类的问题的方法来解决,就比较容易了。事实上,确实是这样的,进行非线性变换时分为两步:首先使用一个变化将原空间中的数据映射到新的空间;然后在新空间中用线性分类学习方法从训练数据中学习分类模型。这就是核技巧。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 28 16:33:04 2017

@author: pandas
"""

import Image  
import numpy as np   
import glob  
import os  
from svmutil import *
import dicom
from WriteReadFile import WriteReadTxt
from getAllInfo import GetInfomation
from dicomToData import DicomTo2Data
 
def resize(picArray,size):  
    '''调整图片大小,先归一化图片,并把原图片放在中间,返回的数据格式 [[],[],.....]'''
    picNew = []  
    for i in range(len(picArray)):  
        imgPIL = Image.fromarray(picArray[i])  
        h,w = imgPIL.size  
        newH = w//2 - h//2    #把图片放在中间  
        imgEmpty = Image.new('L',(w,w),0)   #创建一张背景为黑色的图片  
        imgEmpty.paste(imgPIL,(newH,0))          
        imgResize = imgEmpty.resize(size,Image.ANTIALIAS)  
        imgResize0255 = imgResize.point(lambda x: 255 if x > 10 else 0)   #0是黑,255是白,黑白加强  
        imgResizeArray = np.array(imgResize0255).flatten().tolist()    #转换为一维  
        imgResizeArraySmaller = [float(x)/255 for x in imgResizeArray]    #把0-255转成0-1  
        picNew.append(imgResizeArraySmaller)  
        #imgResize0255.show()  
        #imgResize0255.save('//home//pandas//workspace//gradution//' + str(i) + '.jpg')  
    return picNew  
    
def traindata_dicom(path_s, suffix):  
    train_images = []  
    train_labels = []  
    path_list = []
    path_list_dcm_test = []
    path_list_dcm = []
    dt2d = DicomTo2Data()
    while os.path.isdir(path_s):
        for pa in os.listdir(path_s):
            if os.path.isdir(path_s+'/'+pa):
                path_list.append(path_s+'/'+pa)
                path_list_dcm_test.append(path_s+'/'+pa)
        if len(path_list) != 0:
            path_s = path_list[0]
            del path_list[0]
        else:
            path_s = ''
            
    for p in path_list_dcm_test:
        for info in os.listdir(p):
            if info[-4:] == '.dcm' or info[-4:] == '.DIC':
                path_list_dcm.append(p)
                break
    
    for path in path_list_dcm:
        for files in glob.glob(path + '/*.' + suffix):  
            filepath,filename = os.path.split(files) 
            if filename[-6:-4] != '-1':
                train_labels.append(1)
            else:
                train_labels.append(-1)
            pic = dt2d.picSplitResize(filepath + '/' + filename)  
            picNew = resize(pic,(30,30))  
            train_images.append(picNew[0])  
    return train_images,train_labels 
    
def traindata(path_s):
    train_images = []  
    train_labels = []  
    path_list = []
    dt2d = DicomTo2Data()
    for pa in os.listdir(path_s):
        path_list.append(path_s+'/'+pa)
            
    for path in path_list:
        for files in glob.glob(path + '/*'):  
            filepath,filename = os.path.split(files) 
            if path.split('/')[-1] == 'negative':
                train_labels.append(-1)
            elif path.split('/')[-1] == 'positive':
                train_labels.append(1)
            elif path.split('/')[-1] == 'us_images':
                train_labels.append(2)
            pic = dt2d.picSplitResize(filepath + '/' + filename)  
            picNew = resize(pic,(30,30))  
            train_images.append(picNew[0])  
    return train_images,train_labels 
   
def predictPIC(train_images, train_labels, picdata):  
    '''创建LibSVM分类器,返回值为识别出的内容''' 
    prob = svm_problem(train_labels,train_images)  
    param = svm_parameter('-s 0 -t 2 -c 1.2 -g 2.8')  
    prob = svm_train(prob,param)  
    print '--->',len(picdata)
    labels = [0] * len(picdata)  
    flag = svm_predict(labels,picdata,prob)  
    return flag
            
def main(dicom_file, train_images, train_labels):
    #info = loadFileInformation(dicom_file)
    dt2d = DicomTo2Data()
    pic = dt2d.picSplitResize(dicom_file)
    picdata = resize(pic,(30,30)) 
    result = predictPIC(train_images, train_labels, picdata)  

    if result[0][0] == 1.0 or result[0][0] == 2.0:
        image = dt2d.picSplitResize_dicom(dicom_file)
        dt2d.makePNG(image, dicom_file)

if __name__ == '__main__':    
    dicom_file = '/home/pandas/workspace/python/graduation/DICOM_IMAGE/Image3.dcm/ARTERY_TRANSVERSAL/Ultrasonix_test/img/14-50-11 01.png'
    train_dir = '/home/pandas/workspace/python/graduation/DICOM_IMAGE/Image3.dcm/ARTERY_TRANSVERSAL/Ultrasonix_train/train'
    #dicom_file = '/home/pandas/workspace/python/graduation/DICOM_IMAGE/DOI/TCGA-34-2605/0/1/000000.dcm'
    #dicom_data = dicom.read_file(dicom_file) 
    #gim = GetInfomation()
    #info = gim.loadFileInformation(dicom_data)
    train_images,train_labels = traindata(train_dir) 
    #wrt = WriteReadTxt()
    #train_images = wrt.readTrainImages('/home/pandas/workspace/python/graduation/code/train_images.txt')
    #train_labels = wrt.readTrainLabels('/home/pandas/workspace/python/graduation/code/train_labels.txt')
    re = main(dicom_file, train_images, train_labels)

 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • SpringBoot+Vue项目求职招聘网站
  • 9-6 Oracle 管理索引
  • Spring基本使用及核心技术
  • 2022研究生电子设计竞赛总结(东北赛区一等奖、国家二等奖)
  • 秋招面试- - -Java体系最新面试题(8)
  • Spring5详解
  • 基于PLC四层电梯模型控制系统
  • 编译原理笔记
  • vue中如何监听localStorage值的变化
  • Acwing算法基础课总结
  • Libgdx游戏开发(1)——环境配置及demo运行
  • ESB产品调用场景分析
  • 【微机原理】微处理器与总线
  • 【youcans 的图像处理学习课】11. 形态学图像处理(下)
  • Day19NAT
  • ARMv9新特性:虚拟内存系统架构 (VMSA) 的增强功能
  • 大数据入门之 Hadoop,HDFS,Hbase,Hive
  • 令人头秃的js隐式转换面试题,你能做对吗
  • 信号(软件中断)编程
  • django基于python的酒店预订管理系统--宾馆管理系统-计算机毕业设计