基于VTK的三维医学图像可视化处理系统挑战杯论文_第1页
基于VTK的三维医学图像可视化处理系统挑战杯论文_第2页
基于VTK的三维医学图像可视化处理系统挑战杯论文_第3页
基于VTK的三维医学图像可视化处理系统挑战杯论文_第4页
基于VTK的三维医学图像可视化处理系统挑战杯论文_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于VTK的三维医学图像可视化处理系统BasedonVTK3dmedicalimagevisualprocessingsystem毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名:日期:

学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名: 日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。涉密论文按学校规定处理。作者签名: 日期:年月日导师签名:日期:年月日指导教师评阅书指导教师评价:一、撰写(设计)过程1、学生在论文(设计)过程中的治学态度、工作精神□优□良□中□及格□不及格2、学生掌握专业知识、技能的扎实程度□优□良□中□及格□不及格3、学生综合运用所学知识和专业技能分析和解决问题的能力□优□良□中□及格□不及格4、研究方法的科学性;技术线路的可行性;设计方案的合理性□优□良□中□及格□不及格5、完成毕业论文(设计)期间的出勤情况□优□良□中□及格□不及格二、论文(设计)质量1、论文(设计)的整体结构是否符合撰写规范?□优□良□中□及格□不及格2、是否完成指定的论文(设计)任务(包括装订及附件)?□优□良□中□及格□不及格三、论文(设计)水平1、论文(设计)的理论意义或对解决实际问题的指导意义□优□良□中□及格□不及格2、论文的观念是否有新意?设计是否有创意?□优□良□中□及格□不及格3、论文(设计说明书)所体现的整体水平□优□良□中□及格□不及格建议成绩:□优□良□中□及格□不及格(在所选等级前的□内画“√”)指导教师:(签名)单位:(盖章)年月日评阅教师评阅书评阅教师评价:一、论文(设计)质量1、论文(设计)的整体结构是否符合撰写规范?□优□良□中□及格□不及格2、是否完成指定的论文(设计)任务(包括装订及附件)?□优□良□中□及格□不及格二、论文(设计)水平1、论文(设计)的理论意义或对解决实际问题的指导意义□优□良□中□及格□不及格2、论文的观念是否有新意?设计是否有创意?□优□良□中□及格□不及格3、论文(设计说明书)所体现的整体水平□优□良□中□及格□不及格建议成绩:□优□良□中□及格□不及格(在所选等级前的□内画“√”)评阅教师:(签名)单位:(盖章)年月日引言当医学影像图问世的时候,为医学界带来了一次革命性飞跃,它为诊断病情提供了方便,但这种二维的图像有着一定的弊端,不能全面展现出图像的效果,对医疗的诊断有影响。本系统是为医学影像图提供三维影像图,便于医疗诊断和医学科研。第二章背景随着计算机技术的进步和计算机硬件的发展,人们可以从事越来越多的研究、分析和模拟工作。由于从实际环境采集来的数据是非常巨大的,例如卫星云图,每一幅图片都超过1G的存储量,如果只是通过研究人员的手工分析,那将是一件极其繁琐的事情。于是人们想到了计算机对采集到的科学数据的可视化研究工作,三维数据可视化是科学数据可视化技术的核心。国外的三维数据可视化研究最早可以追溯到1980年,目前已经取得了长足的发展,例如在面绘制技术方面的抛雪球算法和Marchingcube算法等,结合材质和光照的处理,可以逼真地再现数据场中隐含的结构信息的轮廓;在体绘制方面,光线跟踪算法是经典的算法,其他的算法绝大多数是在此基础上进行快速算法的应用研究,例如Shear-Warp算法等。体绘制算法可以有效地再现数据场中隐含信息的细节,例如人体组织中骨骼和肌肉之间的肌腱部分,在面绘制算法中是很难表现出来的,体绘制可以完美地再现三者之间的关系。三维数据可视化应用已经渗入到社会生活的各个方面,例如:股票分析、经济数据分析、气象分析、军事模拟分析、医学人体数据显示及分析和科学研究等等。三维数据可视化技术是集多种科学技术一体的交叉边缘学科。国内在三维数据可视化研究方面主要是应用方向的研究,中国科学院北京自动化研究所的田捷教授在这个方面的研究工作在国内处于领先的地位,目前正在逐渐地推出综合处理的三维数据可视化处理平台,该平台就是基于VC环境,对面绘制技术和体绘制技术进行了很好的集成。1895年,伦琴射线的发现对医学影响技术有着重要的作用,利用仪器设备获得人体有关部位的断层影像,这种方法对医生诊断病情带来了革命性的飞跃。医生可以通过CT、螺旋CT、核磁共振等技术的得到医学影像照片对病人的病情进行分析病因。然而这些医学影像都是二维的,对医生分析病人的病情有一定的要求,不能充分的分析病因和查找病灶。医学图象三维可视化具有极大的医学研究和对临床诊疗作用,它作为有效的辅助工具,可以弥补在二维医疗影像上的不足,能够为医生提供更加真实的三维医学影像,有利于医生能够直观、准确、多角度的分析与观察病灶,从而也提高了医生诊断病情准确率,提高了治疗效果。因此医学图象三维可视化是现代医学影象研究的具有重要意义,为医学的研究也提供了重要手段。第三章设计特点本系统采用VTK结合VC环境的程序设计思想,针对医学图像进行三维体数据的处理和快速绘制的算法及应用研究。系统中采用的MarchingCube面绘制算法是目前最先进行的面绘制技术中的面片提取算法;体绘制中的光线跟踪算法也是目前非常成熟的体绘制技术之一。VTK工具包提供了完整的数据通道、绘制通道、材质和光照通道和相机通道。通过VTK提供的模型可以方便的建立绘制界面并实现体数据的绘制。但是VTK的一体化也严重地限制了实际应用中的灵活性。本作品灵活地结合VTK的开放源码和VC开发环境。通过底层导出技术实现本作品中的应用算法的独立导出。实现了DICOM文件处理、MarchingCube算法、Ray-Casting算法等关键算法和技术的独立导出。结合VC的底层处理能力和OpenGL的开发接口实现了灵活的体数据处理和绘制,有效地提高了数据绘制清晰程度和绘制速度。本系统中针对体绘制算法较慢的缺点,独立导出了Shear_Warp算法结合RLE压缩编码,实现了对体数据无损的快速绘制。由于避免了VTK中黑箱式的流程处理过程,本系统可以在体数据的最高分辨率上完成体数据的绘制,同时有效地提高了绘制的速度。第四章总体设计1.基本思路系统将实现对医学影像图的显示和三维体数据的绘制。结合VTK(VisualizationToolKit)工具提供的算法模块和基本的三维数据处理思想,运用VC环境编写程序,实现医学图像的读取并进行多种图像处理;综合运用OpenGL技术和MarchingCube算法实现对体数据的面绘制处理;采用光线跟踪算法对体数据进行体绘制显示。运用ShearWarp技术,加速体绘制的绘制速度;利用MFC开发平台实现界面的设计和系统的框架。系统的处理流程如下:1.1数据的输入:输入的数据包括由课题组自己构建的三维体数据,扩展名为.vol的文件,文件的格式另外商议决定;另外的输入数据来自于实际的工程,目前流行的大部分来自于医学图像的CT或者MRI的断层扫描图像,因此需要对序列的、多幅连续图像进行基本的显示和预处理。1.2数据的输出的处理:包括几个部分:a、图像输入数据的格式转换输出,例如Jpg图像转存为Bmp图像;序列输入图像转存为三维数据格式.vol输出;三维数据.vol转存为单幅的图像数据输出等。B、三维绘制后的图像的保存处理:包括当前参数的单幅图像的保存;在一定条件下的连续的多幅图像的保存处理。C、其他的一些未预见的输出处理等。1.3外部数据导入到软件系统内部后的处理:包括数据的构造,即把序列图像按照原始的物理顺序重新排序并存入到专门的三维数据的数据存储结构内存中。数据的预处理:包括提取当前图片的直方图或者提取三维数据场的直方图;确定数据场内有效数据的种类,并能够根据数据的取值范围(图像0-255)准确地划分不同的物体的取值区间,根据这个条件为不同的物体划分不同的不透明度。1.4三维体数据的绘制处理:在前面的预处理基础上,开始根据用户的不同的功能选择:面绘制、体绘制,来绘制体数据中在预处理中已经确定的需要绘制的物体。1.5三维绘制的交互操作:绘制出来的物体需要显示到屏幕上,在基本绘制完成后,需要将绘制过程中的参数以可视的方式送到当前的现实屏幕上,用户可以通过调整这些参数调整当前物体的绘制方式及最终绘制结果:例如:可以调整三维数据场的有效灰度值得范围,由此确定绘制新的物体;调整显示的彩色属性选项,由此决定绘制出来的物体是否需要彩色显示;面绘制中的灯光显示和材质处理;当前绘制物体的绘制角度的调整,由此可以观察不同空间角上观察到的物体的情况等等。2.关于VTK工具包与算法2.1VTK工具包视觉化工具函式库(VTK,VisualizationToolkit)是一个跨平台、支援平行处理(VTK曾用于处理大小近乎1个Petabyte的资料,其平台为美国LosAlamos国家实验室所有的具1024个处理器之大型系统)的图形应用函式库。全世界的数以千计的研究人员和开发人员用它来进行3D计算机图形,图像处理,可视化。VTK包含一个c++类库,包括Tcl/Tk,Java,Python。VisualizationToolkit是一个用于可视化应用程序构造与运行的支撑环境,它是在三维函数库OpenGL的基础上采用面向对象的设计方法发展起来的。VisualizationToolkit是给从事可视化应用程序开发工作的研究人员提供直接的技术支持的一个强大的可视化开发工具,它以用户使用的方便性和灵活性为主要原则,具有如下的特点:2.1.1具有强大的三维图形功能。VisualizationToolkit既支持基于体素Voxel-basedrendering的体绘制VolumeRendering又保留了传统的面绘制,从而在极大的改善可视化效果的同时又可以充分利用现有的图形库和图形硬件。2.1.2VisualizationToolkit的体系结构使其具有非常好的流streaming和高速缓存caching的能力,在处理大量的数据时不必考虑内存资源的限制2.1.3VisualizationToolkit能够更好的支持基于网络的工具比如Java和VRML随着Web和Internet技术的发展VisualizationToolkit有着很好的发展前景。2.1.4能够支持多种着色。2.1.5VisualizationToolkit具有设备无关性使其代码具有良好的可移植性2.1.6VisualizationToolkit中定义了许多宏,这些宏极大的简化了编程工作并且加强了一致的对象行为。2.1.7VisualizationToolkit具有更丰富的数据类型,支持对多种数据类型进行处理。2.1.8既可以工作于Windows操作系统又可以工作于Unix操作系统极大的方便了用户。VTK中,要将一套医学体数据进行体绘制。下面是VTK中体绘制的C++代码,对关键类和函数的作用进行了注释。vtkRenderer*aRender=vtkRenderer::New();//设置绘制类vtkRenderWindow*renWin=vtkRenderWindow::New();//设置绘制窗口renWin->AddRenderer(aRender);//装载绘制类vtkRenderWindowInteractor*iRen=vtkRenderWindowInteractor::New();//设置绘制窗口的交互iRen->SetRenderWindow(renWin);//装载绘制窗口vtkVolume16Reader*reader=vtkVolume16Reader::New();//读取DICOM数据reader->SetDataDimensions(64,64);//设置图像像素值reader->SetImageRange(1,93);//设置图片数量reader->SetDataByteOrderToLittleEndian();reader->SetFilePrefix("X://data");//设置数据路径reader->SetDataSpacing(1.0,1.0,0.48);//设置数据的间距vtkPiecewiseFunction*opacityTransferFunction=vtkPiecewiseFunction::New();//设置不透明度传递函数opacityTransferFunction->AddPoint(0,0.0);opacityTransferFunction->AddPoint(500,0.0);opacityTransferFunction->AddSegment(600,0.73,900,0.9);opacityTransferFunction->AddPoint(1300,2.0);vtkColorTransferFunction*colorTransferFunction=vtkColorTransferFunction::New();//设置颜色传递函数colorTransferFunction->AddRGBPoint(0,0,0,0);//此处颜色设置为灰度值colorTransferFunction->AddRGBPoint(500,0.1,0.1,0.1);colorTransferFunction->AddRGBPoint(600,0.7,0.7,0.7);colorTransferFunction->AddRGBPoint(900,0.85,0.85,0.85);colorTransferFunction->AddRGBPoint(1300,1.0,1.0,1.0);vtkPiecewiseFunction*gradientTransferFunction=vtkPiecewiseFunction::New();//设置梯度传递函数gradientTransferFunction->AddPoint(0,2.0);gradientTransferFunction->AddPoint(500,2.0);gradientTransferFunction->AddSegment(600,0.73,900,0.9);gradientTransferFunction->AddPoint(1300,0.1);vtkVolumeProperty*volumeProperty=vtkVolumeProperty::New();//定义并设置相关体属性volumeProperty->SetColor(colorTransferFunction);volumeProperty->SetScalarOpacity(opacityTransferFunction);volumeProperty->SetGradientOpacity(gradientTransferFunction);vtkVolumeRayCastCompositeFunction*compositeRaycastFunction=vtkVolumeRayCastCompositeFunction::New();//定义光线投射方法为合成体绘制方法vtkVolumeRayCastMapper*volumeMapper=vtkVolumeRayCastMapper::New();volumeMapper->SetVolumeRayCastFunction(compositeRaycastFunction);//载入体绘制方法volumeMapper->SetInput(reader->GetOutput());vtkVolume*volume=vtkVolume::New();//定义Volumevolume->SetMapper(volumeMapper);volume->SetProperty(volumeProperty);//设置体属性aRender->AddVolume(volume);//将Volume装载到绘制类中aRender->SetBackground(0,0,0);renWin->SetSize(500,500);//设置背景颜色和绘制窗口大小renWin->Render();//窗口进行绘制iRen->Initialize();iRen->Start();//初始化并进行交互绘制2.2Marchingcube算法MarchingCubes算法是面显示算法中的一种,因为他的本质是从一个三维的数据场中抽取出一个等值面,所以也被称为“等值面提取”算法。MarchingCubes算法采用了隐式的等值面提取方法,它不直接计算f(x.y.z),而是直接从体数据中获取等值面的信息。MarchingCubes算法的的处理过程每次读出两张切片,形成一层。两张切片上下相对应的四个点构成一个立方体(Cube),然后从前到后顺序处理一层中的Cuubes,再从下到上顺序处理(n-1)层,算法就结束了。MarchingCubes算法的的处理过程图对于每一个Cube而言,它的八个顶点的灰度值可以直接从输入数据中得到,要抽取的等值面得域值也已经知道。如果一个顶点的灰度值大于域值,则它标记为黑色,而小于的不标。MarchingCubes算法原理图MarchingCubes算法原理图因此MarchingCubes算法的优点是:(1)算法的实现相当直接。(2)图案的解析度很高。2.3光线跟踪算法光线跟踪算法能够生成高质量真实感图形。由光源发出的光到达物体表面后,产生反射和折射,形成简单光照明模型和光透射模型模拟这两种现象。在简单光照明模型中,反射被分为理想漫反射和镜面反射光,在简单光透射模型把透射光分为理想漫透射光和规则透射光。由光源发出的光称为直接光,物体对直接光的反射或折射称为直接反射和直接折射,相对的,把物体表面间对光的反射和折射称为间接光,间接反射,间接折射。这些是光线在物体之间的传播方式,是光线跟踪算法的基础。最基本的光线跟踪算法是跟踪镜面反射和折射。从光源发出的光遇到物体的表面,发生反射和折射,光就改变方向,沿着反射方向和折射方向继续前进,直到遇到新的物体。但是光源发出光线,经反射与折射,只有很少部分可以进入人的眼睛。因此实际光线跟踪算法的跟踪方向与光传播的方向是相反的,而是视线跟踪。由视点与象素(x,y)发出一根射线,与第一个物体相交后,在其反射与折射方向上进行跟踪。如图:光线跟踪算法原理图视线是由视点与象素(x,y)发出的射线;阴影测试线是物体表面上点与光源的连线;以及反射光线与折射光线。当光线

V与物体表面交于点P时,点P分为三部分,把这三部分光强相加,就是该条光线V在P点处的总的光强,由光源产生的直接的光线照射光强,是交点处的局部光强,可以由下式计算:光线跟踪算法实际上是光照明物理过程的近似逆过程,这一过程可以跟踪物体间的镜面反射光线和规则透射,模拟了理想表面的光的传播。虽然在理想情况下,光线可以在物体之间进行无限的反射和折射,但是在实际的算法进行过程中,我们不可能进行无穷的光线跟踪,因而需要给出一些跟踪的终止条件。我们用伪码的形式给出光线跟踪算法的源代码。光线跟踪的方向与光传播的方向相反,从视点出发,对于视屏上的每一个象素点,从视点作一条到该象素点的射线,调用该算法函数就可以确定这个象素点的颜色。光线跟踪算法的函数名为RayTracing(),光线的起点为start,光线的方向为direction,光线的衰减权值为weight,初始值为1,算法最后返回光线方向上的颜色值color。对于每一个象素点,第一次调用RayTracing()时,可以设起点start为视点,而direction为视点到该象素点的射线方向。代码如下:RayTracing(start,direction,weight,color)

{

if(weight<MinWeight)

color=black;

else

{

计算光线与所有物体的交点中离start最近的点;

if(没有交点)

color=black;

else

{

Ilocal=在交点处用局部光照模型计算出的光强;计算反射方向R

RayTracing(最近的交点,R,weight*Wr,Ir);计算折射方向T;RayTracing(最近的交点,T,weight*Wt,It);color=Ilocal+KsIr+KtIt;

}

}

}光线跟踪的优点它比其它渲染方法如扫描线渲染或者光线投射更加能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是光线跟踪算法的一种自然结果。光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。2.4Shear-Warp算法Shear-Warp算法,又称错切变化算法。该算法是将体会制度中的视线方向进行分解,简化从物体空间到图像空间的投影。首先将数据场从物体空间坐标系变化到中间坐标系,称为错切空间,在错切空间,所有视线方向平行于该空间的第三坐标轴方向。其次在错切空间内将体系切片投影到中间过渡图像,在变换得到最终图像。Shear-Warp算法原理图Shear-Warp算法有如下的性质:中间图像的像素扫描线与数据体切片上的体元扫描线相平行:透视投影时同一数据体切片中的全部体元用相同的因子来缩放:平行投影时,将切片投影到中间图像时,所有切片有相同的比例因子。因此可选择一单元比例因子,使体元扫描线内的体元与中间图像的像素意义对应。这也是Shear-Warp算法的优势之处。3.基本设计概念和处理流程本系统的主要处理流程如下:打开文件打开系统开始打开文件打开系统开始设置显示模式设置显示模式选择文件格式选择文件(一个或者多个) 选择文件格式选择文件(一个或者多个)显示显示选择要处理图片选择要处理图片显示图片框架显示图片属性图片黑白显示图片移动图片旋转图片镜像图片缩放调节图片亮度显示图片框架显示图片属性图片黑白显示图片移动图片旋转图片镜像图片缩放调节图片亮度调节图片灰度调节图片灰度图像保存图像保存.vol文件保存选择多幅序列位图三维体数据显示.vol文件保存选择多幅序列位图三维体数据显示RT算法显示MC算法显示移动旋转RT算法显示MC算法显示移动旋转图像序列图像序列显示显示4.结构系统框架图4.1文件模块本子系统主要完成数据的打开输入、保存、另存为、打印处理。4.1.1打开输入:软件中通过菜单栏中的菜单项的《打开》来输入数据,基本的输入界面如图所示:图示中的文件类型中可以限制只显示图像文件和扩展名为.vol的文件。打开的时候可以根据不同的文件扩展名,调用不同的字程序(对象)实现对图像文件和体数据文件的打开。在这里我们定义了一个关于数据输入输出的一个类COutIn类来实现数据的输入输出处理,用户可以打开一个文件对话框,在对话框中选择所需的数据文件,之后通过获取相应数据文件的名字,然后调用COutIn类中的ReadImageFile方法将数据文件的信息读取出来,之后就可以调用StretchDIBits方法将数据文件的信息显示在屏幕上,在文件选择对话框中,用户可以通过鼠标选择自己想要的一张图片,也可以选择多张,选择多张时用户摁住键盘上的shift键然后通过鼠标一张张的选择或者鼠标点击第一张然后点击最后一张就可以选中中间的多张图片,所选择的文件格式为.bmp、.jpg、.vol。(对于多幅的图像文件应该如何同时打开)。序列图浏览图文件打开图4.1.2保存、另存为:软件中通过菜单栏中的菜单项的”另存为”来输出数据,输出数据我们用到的类也是COutIn类,在这个类中我们定义了一个方法WriteImageFile来用于数据的输出处理,基本的界面如图所示:图示中的文件类型可以设置为.bmp、.jpg、.vol类型。文件保存图像输入数据的格式转换输出,例如Jpg图像转存为Bmp图像,可以通过打开的方式导入一张Jpg图像,显示在显示区域中,之后点击另存为命令选择文件类型Bmp,就可以实现图像格式的转换输出。序列输入图像转存为三维数据格式.vol输出,在导入多张序列图像并在显示区域显示之后,用户可以通过鼠标点击选择多幅序列图像,选择的方法是摁住键盘上的shift键然后通过鼠标一张张的选择或者鼠标点击第一张然后点击最后一张就可以选中中间的多张图片,选中之后用户就可以通过另存为命令保存这些图像为.vol三维数据格式输出。三维数据.vol转存为单幅的图像数据输出,在用MC算法或者RT算法在三维体数据对话框显示区域中显示出三维体数据之后,通过调节摄像机的角度可以从各个方向观察体数据,摄像机确定角度之后用户可以点击三维体数据对话框操作中的按钮“保存为”将用户所看到的三维数据图像保存为单幅图像输出,保存的格式可以有.bmp、.jpg、.vol类型。三维绘制后的图像的保存处理:包括当前参数的单幅图像的保存;在一定条件下的连续的多幅图像的保存处理。其他的一些未预见的输出处理等。4.1.3打印:主要是对当前显示的图像或者处理完之后的三维体数据进行打印,用于用户观察鉴别。4.2查看模块4.2.1工具栏:主要是一些功能的快捷键,用户可以点击相应的工具栏中的快捷键来实现一些操作。4.2.2图片显示条:主要是显示多幅导入的序列位图,便于用户浏览,选择查看哪一幅位图。4.2.3图片属性的查看:用于显示图片的信息,如大小,灰度值以及亮度值。4.2.4图片框架的显示:当用户选择一幅或者多幅位图之后,点击该功能就会在图片的框架上显示出不同颜色的线,以区别于别的未选中的位图。4.2.5图片显示模式:该功能是用于设置图片显示区域中的图片显示模式,会有一个模式对话框可以设置图片显示的个数,如3*3显示。4.3图形变换模块4.3.1图像缩放:在选择该功能中的放大或缩小功能之后鼠标放到要调节的图片上鼠标指针变成了一个放大镜,通过点击鼠标左键右键调节图片的放大缩小,点击左键放大图片,点击右键缩小图片。实现图像缩放的方法是使用StretchBlt或者StretchDIBits函数,这两个函数能方便快速的实现位图的缩放,为了保证不丢失和改变DIB的颜色信息,应该使用DIBSECTION来处理位图。先从DIB创建DIBSECTION,并针对DIBSECTION句柄调用StretchBlt函数,以实现位图的缩放,再将经缩放的DIBSECTION的位数据复制到DIB中。4.3.2图像镜像:1)水平镜像-首先选中要翻转的图片,鼠标点击图片,选中的标志是该图片的显示区域的框架线会变成黄色以区别于其他的图片,然后点击该按钮就可以实现被选中图片的横向翻转。这种变换属于图像颠倒,图像颠倒是指把定义好的图像区域上下翻转地显示在屏幕上。分析图像颠倒的过程,可发现每行的图像信息都保持不变,而只是改变了行的顺序,将第一行与最后的第n行相互交换,第二行与第n-1行交换……,依此类推,从而实现了图像的颠倒。只需采用按行交换的方式,即可方便地修改缓冲区内容,实现图像的颠倒。基本步骤如下:

(1)将原图像读入缓冲区,并擦除原图像;(2)计算图像的高度,即行数height;计算图像宽度width;根据宽度、高度生成新缓冲区;

(3)把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。既原图中的(x、y)点,在新生成的图象中对应为x1=x,y1=height-1-y。把原图中的象素值读入新缓冲区的(x1,y1)点处。

(4)把交换后的图像缓冲区内容重新显示在屏幕上。2)垂直镜像-首先选中要翻转的图片,鼠标点击图片,选中的标志是该图片的显示区域的框架线会变成黄色以区别于其他的图片,然后点击该按钮就可以实现被选中图片的纵向翻转。这种变换属于景象变换,镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析镜像变换过程可以发现:每行图像信息的处理方式是相同的,而且行顺序不发生变化,只是每一行的像素信息按从左到右的顺序进行了左右颠倒,从而实现了镜像变换。因此,采用按行逐点变换的方式实现图像的镜像。

给出原图中的任意点(x,y)镜像变换后的新坐标(x1,y1)的坐标变换公式:

x1=width-x-1

y1=y

根据以上公式,对各个像素点计算新坐标后,把原图中的象素值读入新缓冲区的(x1,y1)点处,再重新显示在屏幕上。4.3.3图片移动:选择该功能之后,鼠标就会成小手的形状,然后就可以在要移动的图片上点击鼠标左键摁住不动手动的移动图片的位置,在图片上摁住鼠标左键向上下左右拖动就可以改变图片的位置。图像移动只是改变图像在屏幕上的位置,图像本身并不发生变化。假设原图像区域左上角坐标为(x0,y0),右下角坐标为(x1,y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0+dx,y0+dy),右下角坐标为(x1+dx,y1+dy)。利用API函数::StretchDIBits()在新的左上角坐标位置处重新显示原图像。4.3.4片顺逆旋转:首先选中要旋转的图片,鼠标点击图片,选中的标志是该图片的显示区域的框架线会变成黄色以区别于其他的图片,然后点击相应的按钮就可以实现图片的顺、逆时针旋转,图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。

首先根据旋转的角度、图象对角线的长度计算旋转后的图像的最大宽度、高度,根据旋转后图象最大的宽度、高度生成新的缓冲区,假设图像的左上角为(left,top),右下角为(right,bottom),则图像上任意点(x,y)绕其中心(xcenter,ycenter)逆时针旋转angle角度后,新的坐标位置(x1,y1)的计算公式为:

xcenter=(width+1)/2+left;

ycenter=(height+1)/2+top;

x1=(x-xcenter)cosθ-(y-ycenter)sinθ+xcenter;

y1=(x-xcenter)sinθ+(y-ycenter)cosθ+ycenter;

与图像的镜像变换相类似,把原图中的象素值读入新缓冲区的(x1,y1)点处。4.4颜色处理模块4.4.1图片的灰度调节:选择该功能之后在要显示区域中要调节的图片上鼠标变为十字形样式,摁住鼠标左键左右移动就可以调节图片的灰度值,灰度图像的R、G、B三值相等,可以通过对这三个值增加或减少相同的增量来实现的,以一个像素值为单位,向左移动增大RGB三值的大小从而增大灰度值,向右移动减小RGB三值的大小从而减小灰度值。4.4.2图片的亮度调节:选择该功能之后在要显示区域中要调节的图片上摁住鼠标左键左右移动就可以调节图片的亮度值,通过对图像像素的RGB分量的增加或减少相同的增量来实现的,以一个像素值为基本单位单位,向左移动增大图像像素的RGB分量从而增大亮度值,向右移动减小图像像素的RGB分量从而减小亮度值。4.4.3图片的黑白颠倒显示:首先选中要设置的图片,鼠标点击图片,选中的标志是该图片的显示区域的框架线会变成黄色以区别于其他的图片,点击该按钮,该图片图片窗口区域中所有的白色变为黑色,黑色变为白色。黑白图片的像素值只有两种黑色RGB(0,0,0)白色RGB(255,255,255),所以要实现图像的黑白颠倒显示就只需要将图像原来的黑色变为白色,白色变为黑色就可以了。4.5体数据显示调节4.5.1MC、RT算法显示:在导入数据位图进过处理之后会在二维图像的显示区域中显示多幅图片,这时用户可以通过鼠标点击选择显示区域中的图片,选择多张图片时用户可以通过鼠标点击选择第一张图片然后可以摁住Shift键点击最后一张图片就可以选中用户所要的多幅图片,选中图片之后鼠标点击操作工具栏中的MC显示按钮或者通过菜单-体数据显示-MC或者RT显示就弹出一个显示三维体数据对话框,在这个对话框中的体数据显示区域中就会显示多幅图片所渲染出来的三维体数据。计算空间矢量4.5.2三维体数据的旋转:旋转的原理是摄像机绕x、y、z轴旋转,选择该功能中的任何一个旋转提示就打开一个旋转对话框,用户在需要旋转的坐标轴旁边点击向上向下的黑色三角形实现绕该坐标轴的旋转,可以单击黑色三角按钮控件来增大或者减小角度值,也可以手动的输入旋转角度,之后点击应用按钮实现旋转效果,如果旋转的效果不理想,可以通过点击还原按钮返回旋转之前的效果图。我们也可以定义三个旋转方法分别绕x、y、z轴旋转,可以用OpenGL或者DX中的相应的方法来实现。4.5.3三维体数据的移动:移动的原理也是摄像机上下左右前后调节,对于三维体数据,我们可以在一个立方体空间中对它进行调节,采用移动摄像机的方法,改变摄像机在空间中的位置,同时对三维体数据进行再次渲染,就可以显示出摄像机移动之后的三维体数据。我们用四个摄像机向量:右向量(rightvector)、上向量(upvector)、观察向量(lookvector)以及位置向量(positionvector)来定义摄像机相对于世界坐标系的位置和朝向。我们通过定义三个方法实现摄像机的移动,沿right方向扫视,沿up方向升降,沿look方向平动。第五章结论三维绘制技术发展至今已经有40年左右的历史,目前大型的医疗设备都提供了三维数据处理的能力,例如GE、Philip、Simens等企业的CT设备都具备三维数据处理能力。随着医院PACS系统的普及,通用型的三维处理软件在进一些年开始逐渐走入医院的医生终端。由于国外软件的技术封锁和高昂的价格,国内的医院大都望而却步,这严重地限制了三维处理技术在实际中的应用。国内,目前也有很多的科研院所和公司积极地进行着相关方面应用的研究和开发,相信这一应用方向会在不久的将来大面积地走向实用。本作品基于VC开发环境,结合VTK工具包提供的成熟的算法,构建了良好交互的软件处理平台,可以提供较为友好的软件处理环境,帮助医生进行临床诊断。如果进行推广,可以和医院现有的PACS互联(基于DICOM标准),小巧、灵活、低廉具有较强的市场竞争能力。由于医院的用户群巨大,其远期的市场前景非常好。第六章附录6.1设计的软件部分界面如下:图像浏览界面图像的预显示界面计算空间矢量界面序列图片处理界面系统操作界面6.2系统的部分源代码:6.2.1类定义的部分代码//MarchingCubes.h:interfacefortheCMarchingCubesclass.

//

//////////////////////////////////////////////////////////////////////

#if!defined(AFX_MARCHINGCUBES_H__491AAF2B_1636_4D23_BE65_DFED6A24457F__INCLUDED_)

#defineAFX_MARCHINGCUBES_H__491AAF2B_1636_4D23_BE65_DFED6A24457F__INCLUDED_

#if_MSC_VER>1000

#pragmaonce

#endif//_MSC_VER>1000

classCMarchingCubes:publicCObject

{

public:

shortm_nGrayLimit;

voidMarchingCube(CDicomPData*m_pDicomData);

CTrianglesm_arrTriangles;

CMarchingCubes();

virtual~CMarchingCubes();

private:

BYTEm_bytePos[3];

CUBEPOINTSm_nstruCubePoints1[7];

//CUBEPOINTSm_nstruCubePointsMirror[3];

BYTEm_byteIndex[14];

shortm_wordOrin[256][256];//=newshort(m_nNewWidth*m_nNewHeight);

shortm_wordDes[256][256];//=newshort(m_nNewWidth*m_nNewHeight);

BOOLGetCubePoints(CUBECHANGE*m_struCube,intm_nY,intm_nX,intnSlices);

voidConstructTri(CDicomPData*m_pDicomDataFinal);

CDicomPDatam_pDicomPDataFinal;

voidInsertValue(CDicomPData*m_pDicomData16);

CCubePointsm_arrCubePoints;

BYTE*m_narrPoint[137];//,m_narrPoint2[8],m_narrPoint3[8],m_narrPoint4[8],m_narrPoint5[8],m_narrPoint6[8],m_narrPoint7[8],m_narrPoint[8];//,m_narrPoint8[8],m_narrPoint9[8],m_narrPoint10[8],m_narrPoint11[8];

voidInitial();

CDicomPData*m_pDicomDataCube;

CTypeOfCubem_arrTypeOfCube[128];

//CTrianglesm_arrTriangles;

intm_nCofPoint1,m_nCofPoint2,m_nCofPoint3,m_nCofPoint4,m_nCofPoint5,m_nCofPoint6,m_nCofPoint7,m_nCofPoint8,m_nCofPoint9,m_nCofPoint10,m_nCofPoint11,m_nCofPoint12,m_nCofPoint13,m_nCofPoint14;

intm_nIndex;//m_nIndexshouldbeavaluebetween255and0;

};

#endif//!defined(AFX_MARCHINGCUBES_H__491AAF2B_1636_4D23_BE65_DFED6A24457F__INCLUDED_)6.2.2类的实现的部分原代码//MarchingCubes.cpp:implementationoftheCMarchingCubesclass.////////////////////////////////////////////////////////////////////////#include"stdafx.h"#include"DicomSee.h"#include"MarchingCubes.h"#include"Dicom3ddoc.h"#include"math.h"#include"marchcube.h"#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////externCDicom3dDoc*m_pDicom3dDoc;CMarchingCubes::CMarchingCubes(){ Initial(); m_nGrayLimit=400;}CMarchingCubes::~CMarchingCubes(){}voidCMarchingCubes::MarchingCube(CDicomPData*m_pDicomData){ m_pDicomDataCube=m_pDicomData; InsertValue(m_pDicomDataCube);ConstructTri(&m_pDicomPDataFinal); CMarchCubem_MarchCube; m_MarchCube.m_arrTriangles=&m_arrTriangles; m_MarchCube.DoModal();}voidCMarchingCubes::Initial(){ LPCSTRFileName="C:\\DocumentsandSettings\\Administrator\\桌面\\marchingdata.txt"; FILE*stream; charbuffer[3]; char*EndNum; intch; intm_nIndex; intm_nIndexLength; intm_nNum=0; /*Openfiletoreadlinefrom:*/ if((stream=fopen(FileName,"r"))==NULL) exit(0); /*Readinfirst80charactersandplacethemin"buffer":*/ int m_bFlag=true; BOOLm_First=true; ch=fgetc(stream); while(m_bFlag&&(feof(stream)==0))//=0;(i<80)&&(feof(stream)==0);i++) { if(m_First) { m_First=false; intm_nTemp1=0; memset(buffer,'',3); while(ch!=44) { if(ch>=48&&ch<=57) { buffer[m_nTemp1]=(char)ch; m_nTemp1++; } ch=fgetc(stream); } m_nIndex=(int)strtod(buffer,&EndNum); ch=fgetc(stream); m_nTemp1=0; memset(buffer,'',3); while(ch!=44) { if(ch>=48&&ch<=57) { buffer[m_nTemp1]=(char)ch; m_nTemp1++; } ch=fgetc(stream); } m_nIndexLength=(int)strtod(buffer,&EndNum); } else { //ch=fgetc(stream); intm_nTem; for(intm_nLength=0;m_nLength<m_nIndexLength;m_nLength++) { intm_nTemp[6]; for(intm_nNum=0;m_nNum<6;m_nNum++) { intm_nTemp1=0; memset(buffer,'',3); ch=fgetc(stream); while(ch!=44) { if(ch>=48&&ch<=57) { buffer[m_nTemp1]=(char)ch; m_nTemp1++; } ch=fgetc(stream); } m_nTem=(int)strtod(buffer,&EndNum); m_nTemp[m_nNum]=m_nTem; } TYPEOFCUBEm_struType; m_struType.m_nx1=m_nTemp[0];m_struType.m_nx2=m_nTemp[1];//后面的系数是指相应的立方体角值。 m_struType.m_ny1=m_nTemp[2];m_struType.m_ny2=m_nTemp[3]; m_struType.m_nz1=m_nTemp[4];m_struType.m_nz2=m_nTemp[5]; m_arrTypeOfCube[m_nIndex].Add(m_struType); //算法中注意得到的点的系数减1。 } m_First=true; //ch=fgetc(stream); } ch=fgetc(stream); } fclose(stream); //LOOP:m_First=true; /*Addnulltoendstring*/ //buffer[i]='\0'; //printf("%s\n",buffer); /*for(inti=0;i<=3;i++) { if(ch!=44) { buffer[i]=(char)ch; if(buffer[i]=='\r'||buffer[i]=='\n') { m_First=true; i=4; m_nNum=6; m_nLength=m_nIndexLength; } } else { m_nTem=(int)strtod(buffer,&EndNum); i=4; } ch=fgetc(stream); if(ch==10||ch==13) ch=fgetc(stream); // if(ch==10)//&&m_nLength==m_nIndexLength-1) // { // ch=fgetc(stream); // } } m_nTemp[m_nNum]=m_nTem;for(inti=0;i<=3;i++)//索引值 { if(ch!=44) buffer[i]=(char)ch; else { if(m_nIndex==127) m_bFlag=false; i=4; } ch=fgetc(stream); } memset(buffer,'',3); for(i=0;i<=3;i++)//当前行的大小。 { if(ch!=44) buffer[i]=(char)ch; else { m_nIndexLength=(int)strtod(buffer,&EndNum); i=4; } ch=fgetc(stream); } }*/第七章参考文献[1]祁丽娜,罗述谦.基于VTK的医学图像三维重建.北京生物医学工程,2006年2月.

[2]杜俊利,郭清宇,黄心汉.基于VTK的医学图像快速重建系统.计算机应用,2007年6月.

[3]William.JSchroederKennethM.MartinLisaSAvilaTheVTKUser’sGuid.KitwareInc.1998.

[4]刘志健,王蓉,刘玉玲,余飞鸿.基于VTK的医学图像系统研究.CT理论与应用研究.2006年5月第15卷第2期.

[5]陈传波等,《计算机图形学基础》电子工业出版社,2002.

[6]管伟光,《体视化技术及其应用》电子工业出版社,1998.

[7]唐泽圣,《三维数据场可视化》清华大学出版社,1999

[8]实战OPENGL三维可视化设计及代码精解》电子书.王利.基于VTK的医学图像可视化研究及应用[硕士学位论文].泰安:泰山医学院,2009.

[9]张翔,肖小玲,张爱华.基于VTK库的人脑三维可视化面绘制.长江大学学报,2006,3(1):75-76.

[10]王树秀,雷声,常发亮.利用VTK实现DICOM医学图像三维重建.信息技术与信息化,2008,5:115-116.

[11]张季,王宜杰.医学图像三维重建方法的比较研究.医学信息,2006,19(5).

[12]SchroederWJ.TheVTKUser’sGuide(Vesrnin4.0).Kitware,Inc1998:19-20.

[13]王利.基于VTK的医学图像可视化研究及应用[硕士学位论文].泰安:泰山医学院,2009.

[14]宋海友.基于VTK的医学图像三维重建及其可视化技术研究[硕士学位论文].成都:成都理工大学,2006.

[15]胡战利.基于VTK的医学图像三维重建及交互研究.哈尔滨:哈尔滨工程大学,2008.

学位论文原创性声明学位论文作者(本人签名):年月日学位论文出版授权书论文密级:□公开 □保密(___年__月至__年__月)(作者签名:_______导师签名:______________年_____月_____日_______年_____月_____日

独创声明本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。本声明的法律后果由本人承担。

作者签名:二〇一〇年九月二十日

毕业设计(论文)使用授权声明本人完全了解滨州学院关于收集、保存、使用毕业设计(论文)的规定。本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。(保密论文在解密后遵守此规定)

作者签名:二〇一〇年九月二十日

致谢时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。首先,我要特别感谢我的知道郭谦功老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。郭谦功老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。最后,我要特别感谢我的导师赵达睿老师、和研究生助教熊伟丽老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统HYPERLIN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论