首页 基于VB和MATLAB的医学图像处理系统设计

基于VB和MATLAB的医学图像处理系统设计

举报
开通vip

基于VB和MATLAB的医学图像处理系统设计基于VB和MATLAB的医学图像处理系统设计 河南科技大学毕业设计(论文) 基于VB和MATLAB的医学图像处理系统设计 摘 要 介绍了Visual Basic与MATLAB混合编程方法在可靠性与维修性仿真中的应用。此方法突破了以往利用单一语言实现系统可靠性与维修性仿真的限制,更广泛的利用了现有技术成果,降低了编程难度,加快了编程速度。探讨了利用VB6.0和MATLAB在医学图像处理领域中进行混合编程的方法。在分析了VB6.0和MATLAB7.0各自提供的程序接口的基础上,采用了一种通过ActiveX技术将...

基于VB和MATLAB的医学图像处理系统设计
基于VB和MATLAB的医学图像处理系统设计 河南科技大学 毕业设计 机械毕业设计下载球磨机的毕业设计下载关于网络爬虫的毕业设计下载关于网络爬虫的毕业设计下载河南城建学院毕业设计论文下载 (论文) 基于VB和MATLAB的医学图像处理系统设计 摘 要 介绍了Visual Basic与MATLAB混合编程方法在可靠性与维修性仿真中的应用。此方法突破了以往利用单一语言实现系统可靠性与维修性仿真的限制,更广泛的利用了现有技术成果,降低了编程难度,加快了编程速度。探讨了利用VB6.0和MATLAB在医学图像处理领域中进行混合编程的方法。在分析了VB6.0和MATLAB7.0各自提供的程序接口的基础上,采用了一种通过ActiveX技术将VB和MATLAB混合编程来实现图像处理的方法,并建立了一套在Windows环境下运行的图像处理软件,该软件可以对医学图像进行一些基本的图像预处理和图像增强方面的操作,尤其在图像的灰度变换、消除噪声和边缘检测方面具有良好的效果。通过本设计表明:通过VB和MATLAB进行混合编程可以减少设计的时间,降低了编程难度,同时兼顾了代码安全和界面友好,适合于开发一个在Windows工作环境下运行的、具有丰富的程序接口以及图像处理能力的应用软件,且大大提高了开发效率,对予解决工程问题具有较大的参考价值。 关键词:VB,MATLAB,混合编程,ActiveX,图像处理 I 河南科技大学毕业设计(论文) THE REALIZATION OF IMAGE PROCESSING SYSTEM BASED ON VB AND MATLAB ABSTRACT Application of system reliability and maintainability simulation based on Visual Basic and MATLAB mixed programming is introduced in this paper. This method breaks through the limitation of using single programming language in system reliability and maintainability simulation and can be reduced and extensive use of existing technical accomplishment. With this method, programming difficulty can be reduced and programming speed can be accelerated. Analysis of the VB6.0 and MATLAB7.0 each provide the method on the basis of interface, a data file by VB and MATLAB will be conducted jointly with the image processing methods. Through an example shows that the method of programming designed to reduce the time and reduce the difficulty of programming, taking into account the code security and user-friendly interface, It is suitable for the development of work in the Windows operating environment,has a rich interface and image processing capabilities of the application software f and greatly enhance development efficiency. It works to solve the engineering problem with the larger reference value. KEY WORDS: VB, MATLAB, mixed programming, ativeX, imageprocessing II 河南科技大学毕业设计(论文) 目 录 摘 要 ................................................. I 第1章 系统简介 ....................................... 3 ?1.1 综述 ......................................... 3 ?1.2 课题背景 ..................................... 4 ?1.2.1 Visual Basic6.0背景 .................... 4 ?1.2.2 MATLAB语言背景 ......................... 5 ?1.2.3 ActiveX控件背景 ....................... 6 ?1.3本文主要研究工作 .............................. 7 第2章 Visual Basic调用MATLAB程序的研究 .............. 8 ?2.1 Visual Basic调用MATLAB程序原理 .............. 8 ?2.1.1 VB调用MATLAB程序的几种实现方法 ........ 8 ?2.1.2 MATLAB语言与ActiveX 技术 .............. 10 第3章 系统实现 ...................................... 12 ?3.1 VB借助 ActiveX部件调用MATLAB程序简介 ...... 12 ?3.2 调用程序设计原理 ............................ 12 ?3.2.1 调用图 ................................. 12 ?3.2.2 创建和获取ActiveX自动化对象的过程 ..... 13 [8]?3.2.3 MATLAB对象的一些属性和方法 ........... 13 ?3.3 VB用户界面设计 .............................. 14 ?3.3.1 菜单栏设计 ............................. 14 ?3.3.2 工具栏设计 ............................. 14 ?3.3.3 图形显示界面设计 ....................... 15 ?3.4 VB读取显示图像的功能实现 .................... 16 ?3.4.1 VB读取图像的实现 ...................... 16 ?3.4.2 VB显示图像的实现 ...................... 17 ?3.5 调用MATLAB程序的实现 ....................... 17 ?3.5.1图片的缩放处理 ......................... 17 ?3.5.2 图片的旋转处理 ......................... 17 ?3.5.3 图像的负片效果 ......................... 18 III 河南科技大学毕业设计(论文) ?3.5.4 图像的剪切处理 ......................... 18 ?3.5.5 图像的灰度变换 ......................... 19 ?3.5.6 图像的对比度增强 ....................... 19 ?3.5.7 图像显示直方图 ......................... 20 ?3.5.8 图像直方图均衡化 ....................... 20 ?3.5.9 图像消噪 ............................... 22 ?3.5.10 图像边缘检测 .......................... 23 ?3.5.11 图像平滑处理 .......................... 24 ?3.5.12 图像锐化处理 .......................... 25 第四章 系统调试 ...................................... 27 ?4.1 软件设计说明 ................................ 27 ?4.2 软件使用说明 ................................ 27 ?4.3 软件测试分析 ................................ 28 ?4.3.1 图像旋转测试 ........................... 28 ?4.3.2 图像剪切测试 ........................... 29 ?4.3.3 图像负片效果测试 ....................... 29 ?4.3.4 灰度变换测试 ........................... 30 ?4.3.5 直方图均衡化测试 ....................... 31 ?4.3.6 锐化效果测试 ........................... 31 ?4.3.7 边缘检测效果测试 ....................... 32 结 论 ................................................ 34 参考文献 ............................................. 35 致 谢 ................................................ 37 附 录 ................................................ 38 IV 河南科技大学毕业设计(论文) 前 言 图像处理系统(Image Processing System),用计算机对图像进行分析,以达到所需效果的技术,又称影像处理。图像处理一般指数字图像处理,数字图像是指用数字摄像机、扫描仪等设备经过采样和数字化得到的一个大的二维数组,该数组的元素称为像素,其值为一整数,称为灰度值。 医学图像处理系统从根本上改变了医务人员进行诊断的传统方式。医学上的诊断很多时候需要借助对于医疗图像的判断来作为依据,比如CT、X光、B超等医学图像,但有的拍片没有达到标准要求的清晰度,往往造成重拍或诊断结果的不准确。实践证明,充分地利用这些技术可以提高诊断的正确性和准确性,提高诊断效率,降低医疗成本,可以更加充分地发挥各种医疗设备的功能。而且,随着数字化、智能化进程的深入,医学图像处理技术在医疗卫生领域将会有更加广阔的应用前景。 该课题拟使用VB与MATLAB调用的原理和方法,由于VB提供的计算和绘图函数有限,MATLAB创建图形用户界面的能力相对较弱,因此用VB编写界面,用MATLAB作为后台运行程序,使两者相得益彰。通过这种方法,可使VB的可视化界面和MATLAB强大的计算及绘图功能得以实现,从而提高编程的效率,缩短软件开发的周期。 随着计算机技术的快速发展,一些图像归档和传输系统(PACS)越来越受到医疗单位的重视。针对研究人员在研究医学图像处理算法中队获取和操作医学图像方便性的需求,以及医疗或相关单位对实现PACS系统对医学图像处理的需求,中国科学院软件研究所的王延华、洪飞、吴恩华设计了一套基于VTK库的医学图像处理子系统,该子系统能够很好地应用于各种医学图像处理中。在医学图像消噪和图像增强的应用方面,南京航空航天大学自动化学院的陶玲,王惠南,颜廷勇采用二维小波变换原理,在图像分解的基础上,分析了二维小波变换在医学图像消噪和图像增强中的应用,同时给出应用实例。结果表明,应用小波分析进行医学图像处理,能够有效地改善图像质量,有利于医生对病情的诊断和治疗。由于各地区医疗卫生发展不平衡,为缩小地区间医疗水平的差距,希腊克里特大学计算机基础研究室的Marios ZIKOS、Eleni KALDOUDI、Stelios C.ORPHANOU建立了一套基于医学图像 1 河南科技大学毕业设计(论文) 处理的远程医疗卫生保健信息学网络服务平台。它可以使不同国籍不同服务网络的多个医学专家通过这个平台实现实时交互,完成对各种疾病的初步诊断,制定治疗 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 等。医学图像处理技术发展至今,各个学科的交叉渗透已是发展的必然趋势,其中还有很多亟待解决的问题。有效地提高医学图像处理技术的水平与多学科理论的交叉融合,医务人员和理论技术人员之间的交流就显得越来越重要。总之,医学图像作为提升现代医疗诊断水平的有力依据,使实施风险低、创伤性小的化疗、手术方案成为可能,必将在医药信息研究领域受到更多的关注。 本课题采用了VB与MATLAB的混合编程方法,探讨了VB与MATLAB的混 [1]合编程方法的几种接口技术。并针对ActiveX自动化接口技术,详细论述了如何实现VB和MATLAB的混合编程,并设计了一套医学图像处理系统软件,该软件的主要功能包括:不同类型医学图像的读入与显示、图像的缩放与旋转、消除噪声、灰度变换、图像增强和边缘检测等。ActiveX自动化(OLE自动化)协议是一种允许一个应用程序(控制端)去控制另一个应用程序(服务器端)的协议。由于VB支持ActiveX自动化控制端协议,MATLAB支持ActiveX自动化服务器端协议,因此建立了一个VB应用程序和MATLAB之间的ActiveX自动化连接,那么在一个VB应用程序中就可以直接调用MATLAB的命令,利用MATLAB强大的图形处理工具箱函数,然后的将处理结果显示到VB界面上。用VB编写美观友好的用户界面,用MATLAB作为后台运行程序处理各种操作,使两者相得益彰。 2 河南科技大学毕业设计(论文) 第1章 系统简介 ?1.1 综述 MATLAB自1984年由美国MathWorks公司推向市场以来,已成为国际公认的最优秀的科技应用软件。它具有强大的数值运算能力,先进的资料视觉化功能,开放及可延伸的架构,丰富的程序工具箱,在控制系统,图像处理,信号处理,神经网络等方面都有广泛的应用。计算结果和编程可视化、语言简单,使其成为进行复杂的科学计算的标准软件。但MATLAB 的不足之处在于可视化界面功能过于简单,本身又是一个命令行式的交互系统,功能模块分散,要求使用者有较高的计算机基础,熟悉MATLAB编程和各种不同功能的工具箱函数。 Microsoft公司推出的Visual Basic(简称VB)是目前被广泛使用的,开发应用程序的可视化开发工具。由于其简单易学且功能丰富,能够迅速有效的编制友好的可视化界面,同时避开了VC++编程过程中的过分繁琐和抽象的特点,因而一经推出就成为Windows平台上的主力编程语言之一。然面VB语言的缺点在于运算速度慢,不适合进行大型的数值计算和图形处理,使其在一些专业领域方面不能得到充分的利用。 MATLAB也是支持ActiveX自动化技术的软件,能够被任何可作为ActiveX控件程序的Microsoft Programs所控制,利用这一特性,用户可以非常方便地在自已的程序中使用MATLAB,包括执行MATLAB命令,使用其功能丰富的工具箱(Toolbox),向MATLAB输入数据,获取结果(数据,图形)。这样既能用VB编出漂亮的Windows程序,又能同时获得MATLAB在工程辅助设计、仿真等方面的功能。 本文主要介绍在Visual Basic6.0中如何调用出MATLAB程序。 3 河南科技大学毕业设计(论文) ?1.2 课题背景 ?1.2.1 Visual Basic6.0背景 一、Visual Basic6.0概念 Visual Basic6.0是微软公司推出的主流编程语言之一,是一种新型的计算机编程语言。它与传统的程序设计语言相比,最突出的特点是可视化、事件驱动和交互式。Visual Basic经过微软公司长期不断的完善、第三方资源的大量加入以及广大爱好者的大力支持,Visual Basic6.0已经成长为功能强大,使用人数 众多的主流编程软件。它提供了向导自动生成代码,支持拖放技术、属性检查、实施与法检查等内置自动化技术,大大降低了编写代码的工作量,同时它还提供极丰富的控件,使得Visual Basic6.0成为最简捷、最有效开发windows应用程序工具。 二、Visual Basic具体包含以下内容: 对象:面向对象编程(OOP),虽然Visual Basic并不是完全的面向对象编程,但也利用了对象编程技术。对象简单地说就是大家经常看到的各种窗口、按钮、文本框甚至打印机等。 属性:如同电视有黑白、彩色之分一样,作为对象的Windows中的窗口也是有大有小,文本框的位置不可能完全一样,菜单要显示出不同的功能,这些都是由对象的属性决定的。属性一般决定了对象的位置、大小、显示等情况。 方法:就是对象能够做的事,如打印机对象就有打印(Print)方法、窗口对象支持隐藏(Hide)方法、很多对象支持移动(Move)方法等。 事件:就是对象对用户各种操作的反映情况。如用户用鼠标按一下按钮,就会触发按钮的“按”(Click)事件。 控件:控件就是Visual Basic提供的编程用的模块,与对象有直接的联系,如同积木的木块,使用这样的控件,就可以像拼图或堆积木一样“搭”、“拼”程序界面。Visual Basic中使用控件,简化了Windows中的窗口、按钮等对象的编程设计。每个控件都有各自的属性、事件及方法。只需修改这些特征就可以随心所欲地编程了。 4 河南科技大学毕业设计(论文) ?1.2.2 MATLAB语言背景 一、MATLAB语言概述 MATLAB是MathWorks公司开发的一种工程计算语言。它是一个交互系统,在MATLAB中的基本数据元素是一个不要求维数的复矩阵。用MATLAB可解决很多工程计算问题,特别是涉及到矩阵和矢量形式的问题。MATLAB是一个高度集成的语言环境,在它的界面下可以编写程序、运行程序并可进行跟踪调试。对于广大的工程技术人员和科学研究人员来说,MATLAB不失为一种很好的工具。MATLAB也有局限性,一般它不能脱离MATLAB集成环境工作;而且编写界面的功能比较弱。 一般来说,MATLAB系统包括以下几个主要的组成部分: 1、开发环境 这是一些可以有助于用户方便使用MATLAB的功能和文件的工具集。这些工具中有很多都有图形用户界面,如MATLAB工作台和命令窗口,命令历史记录,程序编辑器和调试器,帮助文件浏览器,工作环境、文件搜索路径的设置和管理工具等。 2、MATLAB数学函数库 这个函数库饮食大量的可以被调用的数值计算算法。其中既有基础算法,比如求和(sum)、正弦函数(sin)和复数运算等,也有一些复杂算法,比如矩阵求逆、矩阵的特征值、贝塞尔函数以及快速傅里叶变换等。 3、MATLAB编程语言 这是一种高级矩阵/数组编程语言。它包括程序流控制、函数、数据类型、输入/输出,以及支持面向对象编程技术等特点。人们既可以利用它来快速开发一些简单的测试程序,也可以用它来开发一引起大型、复杂的实际应用程序。 4、图形技术 MATLAB有非常强大的以图形化显示矩阵和数组的能力,同时也能给这些图形增加注释并且打印这些图形。MATLAB的图形技术既包括可以方便地产生二维、三维科技专业图形的高级绘图函数,也包括一些可以使用户灵活控制图形特点的低级绘图命令。另外,用户还可以利用MATLAB的句柄图形技术创建图形用户界面。 二、MATLAB 存在的一些问题 5 河南科技大学毕业设计(论文) 1、运行的速度慢。运行速度是工程设计尤其是控制领域的命脉所在,由于MATLAB程序占用内存空间资源较大,所以其运行速度不可避免地要下降。 2、无法脱离MATLAB环境运行。MATLAB6.x以上的版本对计算机的要求较高,且自身程序所占的空间较大,这就是得些配置较低的机器运行有困难。 ?1.2.3 ActiveX控件背景 一、ActiveX控件概念 ActiveX是一个Microsoft的术语,它指的是一组包括控件,DLL和ActiveX文档的组件,它通常是以动态链接库的形式存在,因此必须在一个叫容器的独立执行软件中运行。这样的容器包括Authorware、Delphi、Visual Basic、Visual C,,、Internet Explorer和Access等等。 ActiveX控件数据输入和函数功能执行都必须通过容器,因此ActiveX控件和容器都必须支持一些特定的接口协议。根据Microsoft 相应的规格标准,ActiveX控件应具备如下的性能机制。 属性和方法:ActiveX控件必须提供属性的名称、方法的名称及参数,通过这项机制容器可以存取和改变ActiveX控件的属性参数。 事件:ActiveX控件由这项机制通知容器在ActiveX控件中发生的事件,比如属性参数的改变,用户按下鼠标左键等。 二、VB的ActiveX控件 VB带了9个内置ActiveX控件:ImageList、ToolBar、StatusBar、TabStrip、 [2]Slider、ProgressBar、TreeView、ListView、CoolBar。 1、RichTextBox控件:RichTextBox控件是整个字处理的核心。它提供了文本框的所有功能,能够将不同字体、字号和属性混在一起编辑,能够精确地控制文本边界。在部件窗口选上Microsoft Rich TextBox Control6.0就可把控件引入工具箱。 2、ImageList控件:包含一组ImageList对象,要通过索引或键来引用,它作为放置其他图形控件的中央仓库。在程序运行时,可通过 Treeview1.imagelist=Imagelist1语句,将Treeview1控件与Imagelist1控件相 6 河南科技大学毕业设计(论文) 关联,Treeview1控件就可以使用Imagelist1控件中的图片。 3、TooBar 控件:包含一组Button对象,用于生成与程序相关的工具条。 这三个控件包含在Microsoft Windows Common Control6.0中,把它引入工具箱,并把这三个控件放入窗体。 ?1.3本文主要研究工作 MATLAB是集数值分析、矩阵运算、信号处理和图形显示于一体的高性能数学软件,将其强大的计算功能与VB在图形用户界面开发方面的优势结合起来,实现应用系统的无缝集成,对于有效缩短开发周期、优化系统性能是十分有意义的,那将大大地提高编程者的工作效率。本文介绍在VB6.0中利用ActiveX自动化技术使用和操作MATLAB的方法。它以VB作为自动化控制器。MATLAB作为自动化服务器,在使用VB进行Windows编程中,充分发挥MATLAB在图形图像处理等方面的优势。 7 河南科技大学毕业设计(论文) 第2章 Visual Basic调用MATLAB程序的研究 ?2.1 Visual Basic调用MATLAB程序原理 ?2.1.1 VB调用MATLAB程序的几种实现方法 [3]一、借助 ActiveX部件 Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。MATLAB实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将MATLAB作为Visual Basic语言的一个ActiveX部件调用。在Windows注册表中,MATLAB的ActiveX对象名为“MATLAB. Application”。在VB应用程序中创建ActiveX对象的具体步骤如下: Dim MATLAB as Object Dim Result as String Set MATLAB = CreateObject(“MATLAB(Application”) 在VB应用程序中创建了MATLAB的ActiveX对象以后就可以使用这个对象所包含的各种方法来实现对MATLAB的调用。MATLAB(Application对象含有3个方法,它们是Execute,GetFullMatrix,PutFullMatrix,利用这些方法在VB应用程序内可实现任何MATLAB功能。现简单介绍它们的用法: 1、BSTRExecute([in]BSTRCommand);执行Execute方法将调用MATLAB执行一条由Command字符串决定的MATLAB命令,同时返回一个输出字符串表示命令的执行情况,绘图命令生成的图形窗口将显示在屏幕上,为了在VB中获得MATLAB中产生的图像,可以使用以下两条命令先将MATLAB生成的图像以bitmap文件格式存人剪贴板中,然后再将图像从剪贴板中读出。 2、GetFullMatrix方法用来将MATLAB中的一个矩阵变量传送到VB程序中一个1维或2维数组中。其中Name指定了MATLAB中的矩阵变量名, 8 河南科技大学毕业设计(论文) Workspace指定了该矩阵所在的MATLAB工作区,pr是指VB程序中的实部 数组,pi是指VB程序中的虚部数组。 3、PutFullMatrix方法用来将VB程序中一个1维或2维数组传送到 MATLAB中的一个矩阵变量中。 二、通过M文件 MATLAB产生的M文件不能直接在VB中调用,可利用mcc将M文件直 [4]接编译成.EXE文件,然后在VB中声明下面三个API函数,最后使用Shell 命令即可实现VB与MATLAB的无缝集成。 1、用mcc生成独立的外部应用程序。可使用如下两种命令: mcc -p file.m 或 mcc -m file.m 2、在VB中声明调用的三个API函数: Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long 3、示例代码: Dim lTask As Long, lret As Long, lHandle As Long ?执行file.exe文件 lTask = Shell(“file.exe”, vbNormalFocus) lHandle = OpenProcess(SYNCHRONIZE, False, lTask) ?等待进程执行完毕 lret = WaitForSingleObject(lHandle, INFINITE) lret = CloseHandle(lHandle) ? file.exe文件执行完毕后,继续执行应用程序 通过以上编码,应用程序可以在执行过程中调用.EXE完成特定的计算或 图形功能后,再继续其执行过程,从而实现MATLAB的调用。 [5]三、采用MATLAB的COM组件技术 MATLAB COMBuilder是MATLAB Compiler的扩展,安装Mat1ab6(5 时至少需要选择MATLAB、MATLAB Compiler和MATLAB COMBuilder等 9 河南科技大学毕业设计(论文) 选项。在使用COMBuilder创建COM组件之前还需要对MATLAB Compiler进行必要的配置,方法为:在MATLAB命令窗口键入mbuild—setup,将出现选择编译器的提问,所列出的编译器包括计算机中已安装的各种C,C++编译器,例如MATLAB自带的c,C++编译器、BoflandC++Builder 、Microsoft VisualStudio6.0等,用户可根据需要自行选择其中一种并确认即可。安装和配置完成之后,就可在MATLAB中创建COM组件,具体过程如下: (1)编写M函数文件; (2)在MATLAB指令窗口键入comtool,调出创建COM组件所需的可视化编辑环境MATLABComBuilder主窗口; (3)选择File,New aroject,这时会出现新工程设置对话框,键入组件名(Component Name)和类名(ClassName)。 (4)单击“AddFile”按钮,添加已经在MATLAB环境下编译通过的M函数文件; (5)单击“Build”按钮。待编译完成、生成DLL文件后,选择菜单“Component,Package Component”,得到distrib文件夹,它包含表l所示的几个文件。至此,用户编写的M函数文件已转换为COM组件对象。 ?2.1.2 MATLAB语言与ActiveX技术 Visual basic ActiveX部件是Microsoft公司提供的一种用于模块继承的新协议,它是工具箱的扩充部分。在程序中加入ActiveX部件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。ActiveX部件保留了一些普通vb控件的属性、事件和方法。ActiveX部件特有的方法和属性大大增强了程序设计者的能力和灵活性。 虽然MATLAB是一个安全独立的编程和数据运算的集成环境,使他可以方便的做很多工作。但是,很多时候仅仅靠MATLAB环境还不能很好的完成任务。MATLAB与外部的数据和程序交互是很有意义的。MATLAB程序接口的出现,正是为了处理这些问题,用过它可以完成于其他编程环境的交互,各取所长,充分发挥。MATLAB接口包括: [6](1)在MATLAB环境中调用别的语言编写的程序和算法,它通过MEX文件来实现。 10 河南科技大学毕业设计(论文) (2)MATLAB于别的编程环境的数据交互,它通过MAT文件来实现。 (3)别的编程环境使用MATLAB 的计算功能,它通过MATLAB计算引擎来实现。 [7] MATLAB支持的ActiveX有两方面含义: (1)在其他程序下运行MATLAB的ActiveX部件。 (2)在MATLAB下运行其它ActiveX部件。 从某种意义上来说,ActiveX 技术的应用有些像 DDE 链接,但比 DDE 链接更强大,所以 ActiveX 出现后,链接 DDE 的方法就不再那么吸引人了。与 ActiveX 的链接将成为主要的链接方式。ActiveX 实际上是在调用一种部件,而无需要求该部件对应的程序正在运行,这会使得其功能更加强大。 11 河南科技大学毕业设计(论文) 第3章 系统实现 ?3.1 VB借助 ActiveX部件调用MATLAB程序简介 MATLAB对计算机配置要求高,在运行时会占用系统的很多资源,不仅浪费了时间也受到了很大的约束性。但是,MATLAB也支持ActiveX自动化技术的软件,能够被任何可作为ActiveX程序的Microsoft Programs所控制,包括Excel Access、Visual Basic和VisualC++。 本设计是采用Visual Basic制作界面,工作时进入Visual Basic编辑的界面,通过后台算法处理信息,存储数据,共享资源,以保证调用文件的可靠性,实时性和准确性。用Visual Basic6.0为其提供支持环境。 ?3.2 调用程序设计原理 ?3.2.1 调用图 MATLAB MATLAB Active X Active X 图3-1 调用示意图 Active X Active X 由于MATLAB本身就可以当作一个ActiveX控件,在微软系统中,MATLAB的ActiveX控件名称为“MATLAB.application”。VB支持ActiveX自动化技术,因此可以直接将MATLAB作为后台服务器,VB作为控制器对MATLAB进行操作。 12 河南科技大学毕业设计(论文) ?3.2.2 创建和获取ActiveX自动化对象的过程 在控制器中创建和获取自动化对象的一般过程 一、初始化并创建一个自动化对象,创建后,可以在代码中使用对象变量引用的对象。 二、操作方法和属性;获取对象方法和信息,激活属性和方法。 三、完成代码编写后释放对象。 [8]?3.2.3 MATLAB对象的一些属性和方法 一、BSTR Execute(,in,BSTR Command) 此函数以命令字符串为MATLAB参数,将其运行结果以字符串返回。所有在MATLAB命令窗口键 入的可执行的命令行都可在此使用,这样,我们就能在代码中使用命令行,象在MATLAB窗口 中一样自如。 二、VOID GetFullMatix(,in,BSTR Name,,in,BSTR Workspace, ,in out,SAFEARRAY(double)*Pr, ,in out,SAFEARRAY(double)*pi) 该函数从指定的MATLAB工作空间中获取一维或二维数组。其中,Name是提取数组的名称,Workspace表示包含数组的工作空间,一般指定为“base”,即MATLAB默认工作空间。Pr和Pi分 别是包含所提取数组的实部和虚部。 三、VOID GetFullMatrix(,in,BSTR Name,,in,BSTR Workspace, ,in out,SAFEARRAY(double)*pr ,in out,SAFEAPRAY(double).pi) 该函数向指定的MATLAB工作空间中设置一维或二维数组。其中,Name是设置输入数组的名称,其它同前。 四、VOID MinimizeConnandWindow() 该函数将未最小化的MATLAB窗口最小化。 五、VOID MaximizeConnandWindow() 该函数将未最大化的MATLAB窗口最大化。 六、VOID Quit() 13 河南科技大学毕业设计(论文) 该函数关闭并退出MATLAB。 ?3.3 VB用户界面设计 ?3.3.1 菜单栏设计 为了快速制作标准的Windows界面,可以使用VB6.0的应用程序向导 [9]功能,快速建立简单框架。具体步骤如下: 打开VB6.0——>弹出“新建工程”对话框——>选择“VB应用程序向导”。按照提示建立单文档界面,在菜单界面下选择要使用的菜单项,并且可以自主添加、删除菜单项或子菜单项。如下图 : 图3-2 VB菜单栏设设计窗口 ?3.3.2 工具栏设计 菜单项建好以后,在上一步的基础上,点击“下一步”,使用Windows应用程序向导建立工具栏项。同样可以在工具栏项自由选择添加删除要使用的工具栏按钮,只要用鼠标将想要使用的工具栏按钮从左边的工具框中拖放到右边的工具框中,将不想使用的工具栏项从右边的工具框中拖到左边的工具框中即可。完成以后,将自动生成Windows标准界面的工具栏。如下图: 14 河南科技大学毕业设计(论文) 图3-3 VB工具栏设计窗口 如果要对此工具栏中的选项进行修改添加删除,可以在窗体界面工具栏窗口单击右键,选择“属性”,弹出“属性页”对话框——>“按钮”通用选项卡——>“插入按钮(N)”——>填写按钮的索引、关键字、图像等。选中“可见”、“有效”复选框。具体操作如下图: 图3-4 VB添加工具按钮窗口 ?3.3.3 图形显示界面设计 菜单项、工具栏建好以后,接下来将建立图形处理显示窗口。首先,在VB6.0中选择picture图片框,在窗体上建立两个大小相等水平排列的图片框。左边的图片框(名称:picture1)用来显示要处理的图像,右边的图片框(名 [10]称:picture2)用来显示处理后的图像。完成后总效果图如下: 15 河南科技大学毕业设计(论文) 图3-5 应用程序界面 ?3.4 VB读取显示图像的功能实现 ?3.4.1 VB读取图像的实现 由于图像要在VB应用程序中显示\处理,为了保持所选图像格式与VB应用程序的兼容性,我们选择使用VB的打开图像命令。步骤如下: 一、单击“工程”菜单——>部件——>部件对话框——>在“控件”选项卡中选择“Microsoft Windows Common Control6.0”点击“确定”按钮。将在VB标准控件列表中出现一个名为“CommonDialog”的Windows标准控件。 二、点击此控件,在窗体上画出此控件,这样就将此控件加入到VB中,在程序中就可以进行调用了。 三、将此控件重新命名为“cdl”,引用其showopen方法,获得所选图像路径,并将路径赋值给Path字符串变量。代码如下: cdl.Filter = "all files(*.*)|*.*" cdl.FilterIndex = 2 cdl.ShowOpen '显示“打开”对话框 Path = cdl.FileName 16 河南科技大学毕业设计(论文) ?3.4.2 VB显示图像的实现 在VB中显示图像可以使用loadpicture方法来显示图像,代码如下: Picture1.Picture = LoadPicture(path) 这样就可以根据路径来显示选择的图像。如果要关闭当前选定的图像,可以用将图片路径名设为空值。即: Picture1.Picture = LoadPicture(“”) ?3.5 调用MATLAB程序的实现 ?3.5.1 图片的缩放处理 图像缩放(image scaling)是指对数字图像的大小进行调整的过程。对图像的缩放可以直接调用MATLAB工具箱函数imresize来进行图像的缩放处理。常用调用格式为: B = imresize(A,m,method) 其中A表示要进行缩放处理的图像;m表示放大倍数,m必须大于0,如果m>1则表示对图像进行放大处理,如果m<1则表示对图像进行缩小处理;method表示对图像处理的插值算法,有三个可选值:‘nearest’、‘ bilinear’和‘bicubic’分别表示最近邻插值,双线性插值,双三次卷积法,默认值为 [11]‘nearest’。 在VB中调用此函数的方法为: MATLAB.execute(“J=imresize(I,2,?bicubic?);imshow(J,[])”) 此函数采用bicubic方法对图像I进行2倍的放大。 ?3.5.2 图片的旋转处理 图像的旋转处理是指对图像的水平垂直方向进行调整的过程。对图像的旋转处理可以调用MATLAB的图像工具箱函数imrotate来进行旋转处理。常用调用格式为: 17 河南科技大学毕业设计(论文) B = imrotate(A,angle,method) 其中A表示要进行旋转处理的图像;“angle”表示为要旋转的角度数,如果angle大于0,表示对图像进行逆时针旋转,若angle小于0则表示对图像进行顺时针旋转, “method”表示对图像处理的插值算法,同上。默认值为‘nearest’。 在VB中调用此函数的方法为: MATLAB.execute(“J=imrotate(I,90,'bicubic');imshow(J,[])”) 此函数采用bicubic方法对图像I进行逆时针90度方向的旋转。 ?3.5.3 图像的负片效果 在医学图像中,为了较好显示病变区域的边缘脉络或者病变区域大小,常常对图像进行负片显示,从而达到更好的观测效果。在MATLAB的图像 [12]工具箱中有imcomplement函数可以对图像直接进行负片效果处理。调用格式如下: IM2 = imcomplement(IM) 其中IM表示要进行负片处理的图像,IM2表示处理后的图像。在VB中调用此函数的方法为: Result = MATLAB.execute(“g=imcomplement(I);imshow(g)”) 此函数对图像I直接进行负片处理。 ?3.5.4 图像的剪切处理 在进行图像处理时,有时只要对图像中某个特定区域进行处理,并不需要对整个图像进行处理。为此我们可以将我们感兴趣的图像区域先剪切出来,再对图像进行处理,不仅可以收到良好的效果而且可以节约图像存储空间大小。对图像的剪切处理可以调用MATLAB的图像工具箱函数”imcrop”来进行旋转处理。调用格式如下: I2 = imcrop(I,rect) 其中I为进行剪切处理的图像,rect表示两个顶点坐标[(Xmin,Ymin),(Xmax,Ymax)],剪切后的图像大小为两顶点之间的矩形面积。 18 河南科技大学毕业设计(论文) 在VB中调用此函数的方法为: MATLAB.execute(“imshow(I);J=imcrop;figure,imshow(J)”) 省略crop参数的目的在于,我们可以使用鼠标任意剪切图像,并将剪切后的图像显示出来。 ?3.5.5 图像的灰度变换 一般成像系统只具有一定的亮度响应范围,常出现对比度不足的弊病,使用权人眼观看图像时视觉效果很差;另外,在某些情况下,需要将图像的灰度级整个范围或者其中的某一段扩展或压缩到记录器件输入灰度动态范围之内。灰度变换是图像增强的另一种重要手段,它可使用权图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。 MATLAB图像处理工具箱中提供的imadjust函数,可以实现图像的灰度 [13]变换,使对比度增强。其语法格式为: J=imadjust(I,[low,high],[bottom,top],gamma) 其功能是:返回图像I经过直方图调整后的图像J。[low,high]为原图像中要变换的灰度范围,[bottom,top]指定变换后的灰度范围,两者的默认值均为[0,1]。Gamma为矫正值,其取值决定了输入图像到输出图像的灰度映射方式,即决定了增强灰度还是增强高灰度。如果gamma等于1时,为线性变换;如果gamma小于1时,那么映射将会对图像的像素值加权,使输出像素灰度值比原来大;如果gamma大于1时,那么映射加权后的灰度值比原来小。 ?3.5.6 图像的对比度增强 在图像处理中,我们可以将一幅低灰度值图像的灰度值调整到一个指定的范围。在MATLAB图像处理函数中对数变换常用来扩展低值灰度,压缩高值灰度,这样可以使低值灰度的图像细节更容易看清。MATLAB中对数变换的表达式为: f=im2double(I);g=log(1+double(f));imshow(g) 在对图像进行对数变换时,首先要将图像转换为双精度图像,这样在对数变换超过整型范围的元素不会被截断,且小数部分不会四舍五入,则输出 19 河南科技大学毕业设计(论文) 图像具有更高的精度。 ?3.5.7 图像显示直方图 图像直方图是一种显示索引图像或灰度图像亮度分布图形。用imhist函数创建图像直方图。该图首先将数据分成N个等间距的条形,每个条形表示一个数据范围,然后计算落在这个范围内像素的个数。 例如下面的命令显示一个米粒图像和一个有256个条形的直方图。 I=imread(„rice.png?); Imshow(I) Figure,imhist(I) 如图所示: 图3-6 灰度图像及其直方图 ?3.5.8 图像直方图均衡化 直方图均衡化是一种常用的灰度增强算法,是将原图像的直方图经过变换函数修整为均匀直方图,然后按均衡后的直方图修整原图像。为研究方便,首先将直方图归一化,即让原图像灰度范围[Z,Zk]归一化为[0 1]。设其中1 20 河南科技大学毕业设计(论文) 任一灰度级Z归一化为r,变换后图像的任一灰度级Z„归一化为s ,显然r、s 应当满足: 0,r,1,0,s,1 因此直方图修正就是对下列公式的计算过程: ,1 ,,,,s,Tr或r,sT [14]式中T(r)为变换函数,它必须满足下列条件: 1(T(r)在0?r?1区间内是单值函数,且单调增加; 2(T(r)在0?r?1内满足0?T(r)?1。 1在直方图均衡化时,有s,,常数,这里L为均衡化后灰度变化范()psL (s),1,(r)dr围,归一化表示时L=1,则,有,即: ppsdsr ,(r)dr ,pdd,,sTrr 两边取积分得: r,,S,Tr,(r)dr p,0r 这就是所求的变换函数,表明变换函数T(r)是原图像的累计分布函数,因此只要知道原图像的概率密度就能很容易地确定变换函数。 将上述结论推广到离散的情况。设一幅图像总像素为n,共分L个灰度级,n代表第k个灰度级r出现的频数(像素数),则第k灰度级出现的概kk 率为: (r),/0,,1k,0,1,2,??L-1 pnnrkkr 此时变换函数可以表示为 kkni,,T ,(),,p,,srrkiknr,0,0ii 其反变换函数为 ,1,,,0,,1 ssrTkkk 因此,根据原图像的直方图统计值就可算出均衡后各像素的灰度值。 21 河南科技大学毕业设计(论文) ?3.5.9 图像消噪 数字图像中往往存在各种类型的噪声。产生噪声的途径可以有几各种,与生成图像的方法有关。如: 一、如果图像是用照片扫描得到的,则胶卷上的灰尘是噪声源。胶卷损坏、扫描操作中都可以引起噪声。 二、如果图像直接来源于数字设备,则获取数据的设备可以引起噪声。 三、图像数据的电子传输可以引起噪声。 工具箱中提供了多个不同的方法来删除和减少图像中的噪声。不同方法 [15]对于不同类型的噪声具有更好的效果。可用的方法包括: (1)线性滤波 (2)中值滤波 (3)自适应滤波 常用的滤波器为中值滤波器。中值滤波器对异常值的敏感性比均值的小,所以,中值滤波器可以在不减小图像对比度的情况下剔除这些异常值。在MATLAB工具箱中medfilt2函数实现了中值滤波。如下图使用medfilt2函数来删除图像中的椒盐噪声: 图3-7 中值滤波前后图像 22 河南科技大学毕业设计(论文) ?3.5.10 图像边缘检测 图像边缘对图像识别和计算机分析十分有用,边缘能勾画出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息(如方向、阶跃性质、形状等),是图像识别中重要的图像特征之一。从本质上说,图像边缘是图像局部特性不边连续性(灰度突变、颜色突变、纹理结构突变等)的反映,它标志着一个区域的终结和另一个区域的开始。为了计算方便起见,通常选择一阶和二阶导数来检测边界,利用求导方法可以很方便地检测到灰度值的不连续效果。边缘的检测可以借助空域微分算子利用总卷积来实现。常用的微分算子有梯度算子和拉普拉斯算子等,这些算子不但可以检测图像的二维边缘,还可检测图像序列的三维边缘。 [16]一、MATLAB提供的用于灰度图像边缘的函数 在MATLAB中edge函数用于灰度图像边缘的提取,他支持6种不同的 Prewitt法、Roberts法、Laplacian-Gaussian 法、边缘提取方法,即Sobel法、 过零方法和Canny方法,其语法结构如下: BW=edge(I, ?sobel?)——指定Sobel边缘提取方法; BW=edge(I,?sobel?, thresh)——指定具有总阈值thresh的Sobel方法,即强度小于阈值的边缘被省略掉了,缺省时自动选取阈值。 BW=edge(I,?sobel?, thresh, dirction)——指定具有方向性的Sobel方法,为?horizontal?(水平方向)或?vertical?(垂直方向)或?both?(两个方向),缺省时为?both?; BW=edge(I, ?sobel?…)——返回Sobel方法的阈值。 下面的调用与Sobel方法类似: BW=edge(I, ?prewitt?, thresh, direction) BW=edge(I, ?roberts?, thresh) BW=edge(I, ?log?, thresh) BW=edge(I, ?canny?, thresh, direction) 其中I为灰度图像,BW为黑白二值边缘图像。 在VB中调用格式为: MATLAB.execute("g_canny=edge(I, 'canny',[0.010.1],1.25); imshow(g_canny)") 23 河南科技大学毕业设计(论文) ?3.5.11 图像平滑处理 图像平滑主要目的是减少图像噪声。图像噪声来自于多方面,有来自于系统外部的干扰,也有来自于系统内部的干扰。实际获得的图像都因受到干扰而含有噪声,噪声产生的原因决定了噪声分布的特性及与图像信号的关系。减少噪声的方法可以在空间域或在频率域处理,基本方法就是求像素的平均值吉中值;在频域中则运用低通滤波技术。 图像经过傅立叶变换以后,噪声频谱一般位于空间频率较高的区域,而图像本身的频率分量则处于空间频率较低的区域内,因此可以通过低通滤波的方法,使高频万分受到掏,而使低频成分顺利通过,从而实现图像的平滑。低通滤波可以在空间域和频域中进行。在此主要介绍巴特沃斯低通滤波器。 [17]巴特沃斯低通滤波器又称为最大平坦滤波器。它的通带与阻带之间没有明显的不连续性,因此它的空域响应没有“振铃”现象发生,模糊程度减少。一个n阶巴特沃斯低通滤波器的传递函数为: 1,,Hu,v, ,,2n,,Du,v1,,, ,,D0,, D是截止频率;n为阶数,取正整数,控制曲线的形状。由于巴特沃斯0 滤波器转移曲线较平滑,没有振铃效应,故图像的模糊将减少。一般说,常 1采用下降到H(u,v)最大值的那一点为低通滤波器的截止频率点。 2 MATLAB提供的图像平滑函数conv2(二维卷积算法)。具体调用格式为: I=imread(„rice.png?); I1=imnoise(I,?salt&pepper?,0.05); I2=double(I1)/255; H1=[1/9 1/9 1/9; 1/9 1/9 1/9; 1/9 1/9 1/9]; J1=conv2(I2,h1,?same?);imshow(J1) 24 河南科技大学毕业设计(论文) ?3.5.12 图像锐化处理 图像在传输和变换过程中会受到各种干扰而退化,比较典型的就是图像模糊。图像锐化的目的就是使边缘和轮廓线模糊的图像变得清晰,并使其细节清晰。锐化技术可以在空间域是进行,常用的方法是对图像进行微分处理,也可以在频域中运用高通滤波技术处理。但要注意的是,能够进行锐化处理的图像必须要求有较高的信噪比,否则,图像锐化后,信噪比更低。因为锐化将使噪声受到比信号还强的增强,故必须小心处理。一般是先去除或减轻干扰噪声后,才能进行锐化处理。梯度算子和拉普拉斯算子就是满足要求的 [18]线性微分算子,它们是常用和图像锐化运算方法。这里主要介绍梯度算子 设图像为f(x,y),它在点(x,y)处的梯度是一个矢量G[f(x,y)],定义为 ,f,, ,,,x,,,,,,Gfx,y, ,f,, ,,,y,, 当梯度计算完之后,可以根据需要生成不同的梯度增强图像。 第一种是使各点的灰度g(x,y)等于该点的梯度幅度,即:g(x,y)= Gm[f(x,y)];此方法的缺点是增强的图像公显示灰度变化比较陡的边缘轮廓,而灰度变化平缓的区域则呈黑色。 第二种增强的图像是使: Gm[f(x,y)Gm[f(x,y)],T,g(x,y), ,f(x,y)其他, 式中T是一个非负的阈值,适当选取T,既可使明显的边缘轮廓得到突出,又不会破坏原来灰度变化比较平缓的背景。 第三种增强图像是使: LgGm[f(x,y)],T,g(x,y), ,f(x,y)其他, 式中Lg是根据需要指定的一个灰度级,它将明显边缘用一固定的灰度级Lg来实现。 第四种增强图像是使: 25 河南科技大学毕业设计(论文) Gm[f(x,y)Gm[f(x,y)],T, g(x,y),,Lg其他, 此方法将背景用一个固定灰度级Lg来实现,便于研究边缘灰度的变化。 第五种增强图像是使: LgGm[f(x,y)],T, g(x,y),,Lb其他, 此方法是将明显边缘及背景分别用灰度级Lg 和Lb表示,产生二值图 像,便于研究边缘所在的位置。 [19]MATLAB关键程序如下: I=double(I); [IX,IY]=gradient(I); GM=sqrt(IX.*IX+IY.*IY); OUT=I; J=find(GM>=10); OUT(J)=GM(J); 26 河南科技大学毕业设计(论文) 第四章 系统调试 ?4.1 软件设计说明 MATLAB是MathWorks 公司推出的一套高性能的数值计算和可视化软件。它以矩阵和向量为基本数据单位,其矩阵计算能力十分突出,用该语言进行复杂算法设计的效率很高。同时,MATLAB含有各种可选的工具箱,如神经网络、小波分析、模糊控制、信号处理、鲁棒控制等功能强大的计算辅助工具。MATLAB 现已成为应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具;在研究单位、工业部门,MATLAB也被广泛用于研究和解决各种工程问题。但MATLAB也有局限性,一般它不能脱离MATLAB集成环境工作,而且生成复杂的人机交互式图形界面的能力不强。 Visual Basic是一种可视化的高级程序设计语言,它避开了C++编程过分繁琐和抽象的缺点,能使开发人员快速方便地开发友好的用户界面,是Windows下简单、易学、高效的可视化软件平台。然而,Visual Basic语言的计算功能十分薄弱,用Visual Basic语言实现复杂的算法工作量十分庞大,且运行速度缓慢。 从上面MATLAB的简单介绍中,我们可以看出MATLAB与Visual Basic的优缺点正好具有互补性。利用这种优缺点的互补性,我们可以对MATLAB与Visual Basic混合编程,实现工程软件的迅速开发。在本文中,我们采用ActiveX技术实现VB和MATLAB混合编程,用VB进行界面设计,MATLAB作为后台服务器运行,在VB中调用MATLAB的图像处理工具箱函数以图像进行处理,并将处理后的结果利用系统剪切板显示到VB应用程序中。 ?4.2 软件使用说明 一、本文采用ActiveX自动化技术来实现VB和MATLAB的混合编程,由于ActiveX自动化技术不能脱离MATLAB运行环境,所以在用户系统中必 27 河南科技大学毕业设计(论文) 须先安装MATLAB应用程序和image图像处理工具箱。 二、由于VB应用程序只支持“*.bmp,*.jpg”等少数几种常用的图像格式。所以本系统只能对“*.bmp,*.jpg”等几种格式图像文件进行处理。对于一些其它格式的图像文件,在处理过程中可能会出现无法处理的情况,则必须先将图像格式转换为*.bmp位图文件,再进行处理。 三、由于本系统是针对医学图像进行处理,医学图像大部分为灰度图像。考虑到软件运行效率和稳定性,本系统只能处理灰度图像。若不是灰度图像,需要先将其转换为灰度图像再进行处理。 四、本系统在处理图像直方图和直方图均衡化时,直接将处理结果显示到MATLAB的figure窗口中,这样可以利用figure图形窗口本身具有的一些图形分析、标记功能来分析图像特点,以便对图像进行更有效的处理。 五、在系统运行过程中,系统会自动调用MATLAB应用程序,并弹出一个MATLAB命令窗口,此命令窗口为后台服务窗口,可将其最小化显示。 六、在绘图过程中,在VB界面上首先弹出一个figure窗口,显示处理结果,然后迅速消失,并将处理后的结果显示到VB的右图像框中。 七、具体步骤如下: (1)使用菜单“打开”或工具栏“打开”按钮一幅图像; (2)根据图像特点选择“工具”菜单中处理功能单击菜单项; (3)若需要保留处理后的结果,点击“保存”或“另存为”菜单保存图 像。 ?4.3 软件测试分析 ?4.3.1 图像旋转测试 在图像处理中,有时需要将图像旋转以获得更好的观测角度,所以我们有必要在系统中添加图像旋转功能。 程序代码如下: I=imread(STR); J=imrotate(I,180,'bicubic');imshow(J,[]) 测试结果如下图: 28 河南科技大学毕业设计(论文) 图4-1 图像旋转180度前后对比 ?4.3.2 图像剪切测试 当用户对图像进行处理时,在大多数的情况下,只对图像中的某个区域感兴趣。针对这种情况,本系统添加了剪切功能,可以对感兴趣区域进行剪切处理,并节省图像数据大小。 程序代码如下: I=imread(STR);imshow(I);J=imcrop;figure,imshow(J) 测试结果如下: 图4-2 图像剪切前后对比 ?4.3.3 图像负片效果测试 图像负片效果可以帮助我们在大片黑色区域中容易观察白色或灰色细节。 29 河南科技大学毕业设计(论文) 程序代码如下: g=imcomplement(I);imshow(g) 测试结果如下: 图4-3 图像负片效果对比 ?4.3.4 灰度变换测试 MATLAB图像处理工具箱中提供的imadjust函数,可以实现图像的灰度变换,使对比度增强。其语法格式为: J=imadjust(I,[0,0.2],[0.5,1]) 其功能是:返回图像I经过直方图调整后的图像J。将图像的低灰度级范围映射到高灰度级去,从而可以更清晰观察低灰度区域细节。 图4-4 图像灰度变换前后对比 30 河南科技大学毕业设计(论文) ?4.3.5 直方图均衡化测试 MATLAB图像处理工具箱提供了用于直方图均衡化的函数Histeq。Histeq语法格式为: J=histeq(I,n) 其功能是:指定直方图均衡化后的灰度级数n,默认值为64。 图4-5 图像直方图均衡化前后对比 ?4.3.6 锐化效果测试 使用梯度法进行图像锐化方法的MATLAB代码如下: MATLAB.execute("STR=clipboard('paste');") MATLAB.execute("[I,map]=imread(STR);") „读取图像 MATLAB.execute("I=double(I);”) „将图像转换为双精度图像 MATLAB.execute(“[IX,IY]=gradient(I);”) „对每一点求梯度值 matalb.execute(“GM=sqrt(IX.*IX+IY.*IY);OUT=I;J=find(GM>=10);OUT(J )=GM(J);”) MATLAB.execute(“imshow(OUT,map)") 测试结果如下: 31 河南科技大学毕业设计(论文) 图4-6 图像锐化前后对比 ?4.3.7 边缘检测效果测试 在MATLAB中函数edge用来进行边缘检测。该函数的基本语法为: parameters) [g,t]=edge(f,?method?, 其中,f是输入图像,method是进行边缘检测的方法。g是一个逻辑数组,其值如下决定:在f 中检测到边缘的位置为1,在其他位置为0。参数t是可选的;它给出edge使用的阈值,以确定哪个梯度值足够大到可以称为边缘点。 在函数edge中可用的边缘检测器: “sobel”边缘检测器对噪声具有一定的抑制能力、边缘定位效果好但是容易出现多象素边缘;“roberts”边缘检测器特点是边缘定位精度高、但不具备抑制噪声能力,只对具有陡峭边缘噪声少的图像效果好;“canny”边缘检测器通过寻找f(x,y)的梯度的最大值来查找边缘。梯度由高斯滤波器的导数来计算。该方法使用两个阈值检测强边缘和弱边缘,若它们连结到了强边缘,则输出中只包含弱边缘。因此这种方法更适合用于检测真正的弱边缘。它本 [20]身使用带有标准偏差,的高斯滤波器来平滑,从而可以减少噪声。 综上所述,我们采用canny边缘检测器来对图像进行边缘检测。具体代码如下: Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("g_canny=edge(I, 'canny',[0.01 0.1],1.25);”) 32 河南科技大学毕业设计(论文) MATLAB.execute(“imshow(g_canny)") 检测结果如下图: 图4-7 图像边缘检测前后对比 33 河南科技大学毕业设计(论文) 结 论 本文主要内容是介绍了如何实现VB和MATLAB在医学图像处理领域内的混合编程。第一章主要介绍VB和MATLAB语言各自的特点;第二章具体介绍几种实现VB和MATLAB混合编程的方法;第三章详细介绍本系统中要实现的几种图像处理功能以及实现原理;第四章主要介绍本系统中各种图像处理功能的调试结果。 本文实现了VB和Matlab在图像处理领域内的混合编程,既节省了在VB中编写烦琐的图像处理算法又可以建立功能齐全、美观的应用程序界面。这种多种语言混合编程,能相互取长补短,提高软件的整体性能,同时节约了宝贵的开发时间和精力因此其研究意义十分重大。 由于时间仓促,笔者水平有限,导致系统还只是对图像进行简单的处理,并且只能进行一次简单的处理。编写更加复杂的算法、实现系统对图像多次连续处理是本系统一个发展方向;本系统还不能脱离MATLAB环境运行,由于MATLAB程序功能复杂,占用系统空间资源较大,影响系统处理速度,所以可以添加插件,将本系统脱离MATLAB环境运行将对本系统运行速度有更大的提高;另外代码的编写风格虽然尽量依照软件工程的要求,但是仍然有不规范、不严谨的情况存在。虽然在医学图像处理系统设计之初,就将面向实际应用作为预期目标,但是到目前为止其实际应用仍然十分有限,这也是本图像处理系统的一个进一步研究的方向。 34 河南科技大学毕业设计(论文) 参考文献 [1] 崔桂彬,王汝霖,李春梅等(基于VB与MATLAB的图像处理软件设计(微机算机信息,2006,22(30),83-85 [2] 胡智文,邓铁如,余增亮等(在VB应用程序中集中MATLAB(计算机工程与应用,2003,39(7),102-105 [3] 丁洁,姜庆伟(基于MATLAB的数字图像增强处理系统设计与实现(科技信息.2009,13(8),45-47 [4] 董维国(深入浅出MATLAB 7.x混合编程(北京:机械工业出版社,2006:260-286 [5] 冈萨雷斯,Richard E(Woods,Steven L(Eddins(数字图像处理(MATLAB版)(北京:电子工业出版社,2006:46-75,287-289 [6] 苏瑞,韩中孝(Visual Basic开发实用编程200例(北京:中国铁道出版社,2006:223-225 [7] 李兰友,刘炜,江中(Visual Basic高级图形应用程序设计(北京:清华大学出版社,北方交通大学出版社,2003:185-189 [8] 李雁翎,夏龙,涂美彩(Visual Basic程序设计实践教程(北京:人民邮电出版社,2008:133-138 [9] 唐大仕,卢湘鸿(Visual Basic 程序设计.北京:清华大学出版社,2003:183-224 [10] 张宏立(实现VB和MATLAB数据交换的新方法(计算机应用与软件,2004,21(12),51-52 [11] 陈明(Visual Basic教程(北京:人民邮电出版社,2002:153-165 [12] 李永曦(在VB6.0中调用MATLAB程序(微机发展,2004,14(1),88-89 [13] 田捷,包沿联,周明全(医学影像处理与分析(北京:电子工业出版社,2003:214-221 [14] 刘新铭,孟维绢(用VB实现MATLAB的图像处理功能(上海电机技术高等专科学校学报,2004,12(4),250-253 [15] 高剑(MATLAB与VB混合编程的两种方法(微机发展,2003,13(3),89-92 [16] 刘志俭(MATLAB应用程序接口用户指南(北京:科学出版社,2000: 35 河南科技大学毕业设计(论文) 351-355 [17] 高向军,田联房,王立非等(利用MATLAB实现医学图像处理与分析(计算机应用研究,2008,25(6),148-150 [18] 温亮,范浩,王丹(VB和MATLAB混合编程的仿真应用(计算机仿真,2006,23(12),104-105 [19] ROSENFILDA,KAK A(C(Digital image processing[M] (Reading MA:Addison-Wesley,1992:48-51 [20] S(Kottha,K(peter,T(Steinke等(Medical Image Processing in MediGRID(German e-Science GES-2007,2006:169-172 36 河南科技大学毕业设计(论文) 致 谢 为期十多周的毕业设计结束了,我的毕业设计能顺利完成多亏各位老师指导和周围同学的帮助,在此依依表示感谢。 首先,要感谢我的指导老师,何琳老师。何老师在我的这次毕业设计中对我的指导和帮助至关重要。正是在何老师的指导下,我逐步理清了设计思路,明白了设计目的。在毕业设计的完成过程中,何老师给予了很多指点,帮助解决了很多难题,再此对何老师表示深深的感谢~ 此外,感谢在毕业设计中给予我帮助的老师、同学。在此,也向他们表示感谢~ 37 河南科技大学毕业设计(论文) 附 录 本系统中所用到的全部程序代码 Private Declare Function OSWinHelp% Lib "user32" Alias "WinHelpA" (ByVal hwnd&, ByVal HelpFile$, ByVal wCommand%, dwData As Any) Public sfile As Variant Dim MATLAB As Object Public Path As Variant Public i As Variant Private Sub Form_Load() Me.Left = GetSetting(App.Title, "Settings", "MainLeft", 1000) Me.Top = GetSetting(App.Title, "Settings", "MainTop", 1000) Me.Width = GetSetting(App.Title, "Settings", "MainWidth", 6500) Me.Height = GetSetting(App.Title, "Settings", "MainHeight", 6500) Picture1.Top = 900 Picture1.Left = 150 'picture1.Height = frmMain.Height - 1500 ' picture1.Width = frmMain.Width - 300 hsl.Visible = False vsl.Visible = False End Sub Private Sub Form_Unload(Cancel As Integer) Dim i As Integer 'close all sub forms For i = Forms.Count - 1 To 1 Step -1 Unload Forms(i) Next If Me.WindowState <> vbMinimized Then SaveSetting App.Title, "Settings", "MainLeft", Me.Left SaveSetting App.Title, "Settings", "MainTop", Me.Top 38 河南科技大学毕业设计(论文) SaveSetting App.Title, "Settings", "MainWidth", Me.Width SaveSetting App.Title, "Settings", "MainHeight", Me.Height End If End Sub Private Sub hsl_Change() Picture2.Left = -hsl.Value End Sub Private Sub light_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") Result = MATLAB.execute("g=imadjust(I,[0.2 0.8],[0 1]);imshow(g),") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = LoadPicture Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") '功能是缩小图像 的动态范围 End Sub Private Sub mnutoolsadj_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") 39 河南科技大学毕业设计(论文) Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") Result = MATLAB.execute("J=imadjust(I,[0 0.2],[0.5 1]);imshow(J)") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = LoadPicture Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnutoolscrop_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("imshow(I);J=imcrop;figure,imshow(J)") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f2") Picture2.Picture = LoadPicture Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close all") End Sub Private Sub ToolBar_ButtonClick(ByVal Button As MSComctlLib.Button) On Error Resume Next Select Case Button.Key Case Is = "新建" mnuFileNew_Click Case Is = "打开" 40 河南科技大学毕业设计(论文) mnuFileOpen_Click Case Is = "保存" mnuFileSaveAs_Click Case Is = "撤消" Case Is = "重复" Case "打印" mnuFilePrint_Click Case "放大" mnuzoomfangda_Click Case "缩小" mnuzoomshuoxiao_Click Case "左旋转" mnurotaleftrota_Click Case "右旋转" mnurotarightrota_Click Case "上一张" mnuViewupnext_Click Case "下一张" mnuViewdownnext_Click Case "第一张" mnuViewfirst_Click End Select End Sub Private Sub mnulvjingedgetext_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") 41 河南科技大学毕业设计(论文) Result = MATLAB.execute("I=imread(STR);") Result = MATLAB.execute("g_canny=edge(I,'canny',[0.01 0.1],1.25);imshow(g_canny)") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = LoadPicture Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnulvjingnoisefilt_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("fn=medfilt2(I,'symmetric');imshow(fn)") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = LoadPicture Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") '中值滤波器 End Sub Private Sub mnulvjingruihua_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") 42 河南科技大学毕业设计(论文) '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("[I,map]=imread(STR);") MATLAB.execute("I=double(I);[IX,IY]=gradient(I);GM=sqrt(IX.*IX+IY.*IY); OUT=I;J=find(GM>=10);OUT(J)=GM(J);imshow(OUT,map)") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = LoadPicture Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnulvjingsmooth_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute ("Y=ordfilt2(I,5,ones(3,3));imshow(Y)") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnuToolshist_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 43 河南科技大学毕业设计(论文) Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") Result = MATLAB.execute("histeq(I);") End Sub Private Sub mnuToolsshowhist_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") Result = MATLAB.execute("figure;imhist(I)") End Sub Private Sub mnuToolsduibidu_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute ("f=im2double(I);g=log(1+double(f));imshow(g)") '对数变 换,进行对比度拉伸处理 Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") 44 河南科技大学毕业设计(论文) Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnuToolsopphto_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") '启动ACTIVEX自动化服务器 Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") Result = MATLAB.execute("g=imcomplement(I);imshow(g)") 'IPT函数显示图像负片 Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnurotaoprota_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("J=imrotate(I,180,'bicubic');imshow(J,[])") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() 45 河南科技大学毕业设计(论文) MATLAB.execute ("close(gcf)") End Sub Private Sub mnurotaleftrota_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("J=imrotate(I,90,'bicubic');imshow(J,[])") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnurotarightrota_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("J=imrotate(I,-90,'bicubic');imshow(J,[])") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnuzoomshuoxiao_Click() 46 河南科技大学毕业设计(论文) Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") RMATLAB.execute("J=imresize(I,0.6,'bicubic');imshow(J,[])") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnuzoomfangda_Click() Dim Result As String Clipboard.Clear '清空剪贴板 Clipboard.SetText (Path) '将图像完整路径写入剪贴板 Set MATLAB = CreateObject("MATLAB.application") Result = MATLAB.execute("clear") Result = MATLAB.execute("STR=clipboard('paste');") Result = MATLAB.execute("I=imread(STR);") MATLAB.execute("J=imresize(I,1.5,'bicubic');imshow(J,[])") Clipboard.Clear Result = MATLAB.execute("print -dbitmap -f1") Picture2.Picture = Clipboard.GetData() MATLAB.execute ("close(gcf)") End Sub Private Sub mnuViewStatusBar_Click() mnuViewStatusBar.Checked = Not mnuViewStatusBar.Checked sbStatusBar.Visible = mnuViewStatusBar.Checked End Sub 47 河南科技大学毕业设计(论文) Private Sub mnuViewToolbar_Click() mnuViewToolbar.Checked = Not mnuViewToolbar.Checked tbToolBar.Visible = mnuViewToolbar.Checked End Sub Private Sub mnuFileExit_Click() Unload Me '卸载窗体 End Sub Private Sub mnuFilePrint_Click() cdl.CancelError = True On Error GoTo err_handle cdl.ShowPrinter Printer.PaintPicture Picture2.Picture, 0, 0, Picture2.Width, Picture2.Height Exit Sub err_handle: MsgBox Err.Description Exit Sub End Sub Private Sub mnuFilePageSetup_Click() On Error Resume Next With cdl .DialogTitle = "页面设置" .CancelError = True .ShowPrinter End With End Sub Private Sub mnuFileProperties_Click() mnuFileProperties.Enabled = False End Sub Private Sub mnuFileSaveAs_Click() cdl.CancelError = False cdl.DialogTitle = "保存" 48 河南科技大学毕业设计(论文) cdl.InitDir = "D:\My Documents\My Pictures" cdl.ShowSave If cdl.FileName <> "" Then If Err <> 32755 Then Dim savename As String savename = cdl.FileName SavePicture Picture2.Image, savename End If End If End Sub Private Sub mnuFileSave_Click() cdl.InitDir = sfile savepiture Picture2.Image, sfile End Sub Private Sub mnuFileClose_Click() Picture2.Picture = LoadPicture("") End Sub Private Sub mnuFileOpen_Click() cdl.CancelError = True '打开图像 On Error GoTo errhandler cdl.Flags = cdlofhidereadonly ' 设置标志 cdl.Filter = "all files(*.*)|*.*" cdl.FilterIndex = 2 cdl.ShowOpen '显示“打开”对话框 Picture1.Picture = LoadPicture(cdl.FileName) Path = cdl.FileName '将图像的完整路径赋给path变量 Exit Sub errhandler: '用户按“取消”按钮 Exit Sub End Sub Private Sub mnuFileNew_Click() 49 河南科技大学毕业设计(论文) Dim frm As New frmMain frm.Show End Sub Private Sub Toolbar1_Button_Click(ByVal Button As MSComctlLib.Button) End Sub Private Sub vsl_Change() Picture2.Top = -vsl.Value End Sub 50
本文档为【基于VB和MATLAB的医学图像处理系统设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_731942
暂无简介~
格式:doc
大小:347KB
软件:Word
页数:61
分类:其他高等教育
上传时间:2017-10-06
浏览量:24